GridView ItemTemplate DropDownList Manipulation - PullRequest
1 голос
/ 19 декабря 2011

Предположим, у меня есть шаблонный выпадающий список в сетке (который ограничен всеми строками) Раскрывающийся список заполняется через массив.

//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);
        }
    }

Что я хочу сделать, так это предположить, что в строке вида сетки [0] я выбрал «Item1», поэтому в строке [1] осталось только 2 варианта -> «Item2» и Item3 »

Помощь очень ценится. :)

1 Ответ

2 голосов
/ 19 декабря 2011

Вы можете обработать событие RowDataBound .

Например (не проверено, если предположить, что DataSource является DataTable, а идентификатор вашего DropDownList равен 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 возвращает только GridViewRows текущей страницы.

Редактировать :Возможно, лучшим подходом является обработка события SelectedIndexChanged DropDownList и обновление списка элементов любых следующих выпадающих списков:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...