假设我在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"one_answers"Item3"
非常感谢帮助。:)
您可以处理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;
}