gridviewitemtemplate下拉列表操作

本文关键字:操作 下拉列表 gridviewitemtemplate | 更新日期: 2023-09-27 18:18:28

假设我在gridview中有一个模板化的下拉列表(它被绑定到所有行)下拉列表是通过一个数组填充的。

//Fill Array
private ArrayList GetDummyData()
    {
        ArrayList arr = new ArrayList();
            arr.Add(new ListItem("Item1", "1"));
            arr.Add(new ListItem("Item2", "2"));
            arr.Add(new ListItem("Item3", "3"));
        return arr;
    }
//Fill dropdownlist
private void FillDropDownList(DropDownList ddl)
    {
        ArrayList arr = GetDummyData();
        foreach (ListItem item in arr)
        {
            ddl.Items.Add(item);
        }
    }

我想做的是假设在gridview行[0]中我选择了"Item1",所以在行[1]中只剩下2个选项->"Item2"answers"Item3"

非常感谢帮助。:)

gridviewitemtemplate下拉列表操作

您可以处理RowDataBound事件。

例如(未测试,假设数据源是一个DataTable,你的DropDownList的ID是ddl):

void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e)
{
  if(e.Row.RowType == DataControlRowType.DataRow)
  {
    var thisRow = (DataRowView)e.Row.DataItem;
    var source = thisRow.DataView;
    var lastRowIndex = e.Row.DataItemIndex -1;
    DataRowView lastRow = null;
    var ddl = (DropDownList)e.Item.FindControl("ddl");
    DropDownList ddlLast = null;
    if(lastRowIndex>=0){
        lastRow = source[lastRowIndex];
        ddlLast = (DropDownList)((GridView)sender).Rows[lastRowIndex].FindControl("ddl");
        //remove the items of this ddl according to the items of the last dll
    }
  }
}

您应该考虑到,如果您启用了分页,这个示例将无法工作,因为rows -属性只返回当前页面的gridviewws。

编辑:也许一个更好的方法是处理下拉列表的SelectedIndexChanged事件,并更新任何以下下拉列表的itemlist:

protected void DdlSelected(object sender, EventArgs e)
{
    var ddl = (DropDownList)sender;
    var row = (GridViewRow)ddl.NamingContainer;
    var grid = (GridView)row.NamingContainer;
    var index = row.RowIndex + 1;
    while (index < grid.Rows.Count) {
        var nextRow = grid.Rows[index];
        var nextDdl = (DropDownList)nextRow.FindControl("ddl");
        nextDdl.Items.Clear();
        foreach (ListItem item in getDllSource()) {
            if (ddl.SelectedItem == null || !ddl.SelectedItem.Equals(item)) {
                nextDdl.Items.Add(item);
            }
        }
        index += 1;
    }
}

getDllSource是以下函数:

private List<ListItem> getDllSource()
{
    List<ListItem> items = new List<ListItem>();
    ListItem item = new ListItem("Item1", "1");
    items.Add(item);
    item = new ListItem("Item2", "2");
    items.Add(item);
    item = new ListItem("Item3", "3");
    items.Add(item);
    return items;
}