Сохранить выбранный элемент в DropDownList внутри GridView после удаления некоторых ListItems - PullRequest
4 голосов
/ 08 сентября 2011

У меня есть GridView с DropDownList в каждой строке.(Элементы в DropDownList одинаковы для каждого.) У меня есть DropDownList "ddlView" за пределами GridView, который используется для фильтрации доступных параметров в других DropDownLists.Значением по умолчанию для ddlView является отсутствие фильтра.

Когда пользователь выбирает новое значение для ddlView, все выбранные значения в других DropDownLists исчезают, если они не являются одним из значений, присутствующих после применения фильтра.В этом случае я хотел бы, чтобы ранее выбранное значение все еще присутствовало и было выбрано.

Каков наилучший способ сделать это?

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

На данный момент моя лучшая идея - вручнуюсохранить эту информацию в объекте или коллекции во время обратной передачи и ссылаться на нее позже во время событий привязки данных.

Есть ли лучший способ?

Ответы [ 4 ]

1 голос
/ 08 сентября 2011

Я не думаю, что есть лучший способ сделать это, поскольку, когда GridView привязан, все элементы управления воссоздаются, таким образом, удаляя выборки.

Следующие работы: (Я сохраняю выборки при обратной передачечтобы восстановить в событии RowDataBound)

Разметка

<asp:Button ID="button1" runat="server" Text="Post Back" OnClick="button1_Click" />
<br />
<asp:GridView ID="gridView1" runat="server">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:DropDownList ID="gridViewDropDownList" runat="server">
                    <asp:ListItem Value="1">Item 1</asp:ListItem>
                    <asp:ListItem Value="2">Item 2</asp:ListItem>
                    <asp:ListItem Value="3">Item 3</asp:ListItem>
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Код

public class GridViewDropDownSelections
{
    public int RowIndex { get; set; }
    public int SelectedIndex { get; set; }
}

...

private List<GridViewDropDownSelections> selectedDropDownListItems = new List<GridViewDropDownSelections>();

protected override void OnLoad(EventArgs e)
{
    var selections = gridView1.Rows.Cast<GridViewRow>().Where(r => r.RowType == DataControlRowType.DataRow)
        .Select(r => new GridViewDropDownSelections() { RowIndex = r.RowIndex, SelectedIndex = ((DropDownList)r.FindControl("gridViewDropDownList")).SelectedIndex }).ToList();

    selectedDropDownListItems.AddRange(selections);

    gridView1.RowDataBound += new GridViewRowEventHandler(gridView1_RowDataBound);

    if (!IsPostBack)
    {
        BindDataGrid();
    }

    base.OnLoad(e);
}

protected void button1_Click(object sender, EventArgs e)
{
    BindDataGrid();
}

private void BindDataGrid()
{
    //Dummy data
    string[] data = new string[] { "Item 1", "Item 2", "Item 3" };
    gridView1.DataSource = data;
    gridView1.DataBind();
}

void gridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var selection = selectedDropDownListItems.FirstOrDefault(i => i.RowIndex == e.Row.RowIndex);
        if (selection != null)
        {
            try
            {
                DropDownList gridViewDropDownList = (DropDownList)e.Row.FindControl("gridViewDropDownList");
                gridViewDropDownList.SelectedIndex = selection.SelectedIndex;
            }
            catch (Exception)
            {
            }
        }
    }
}

Надеюсь, это поможет.

0 голосов
/ 08 сентября 2011

Вы можете выполнить это с помощью простого условия.Я не знаю, как вы фильтруете элементы, но все будет примерно так:

for (int itemIndex = 0; itemIndex < DropDownList1.Items.Count; itemIndex++)
{
    ListItem item = DropDownList1.Items[itemIndex];
    if (DropDownList1.Items.IndexOf(item) > ddlView.SelectedIndex)
    {
        if (!item.Selected)
        {
            DropDownList1.Items.Remove(item);
        }
    }
}

Не уверен, что это то, что вы ищете, но надеюсь, что это поможет.

0 голосов
/ 08 сентября 2011

Использовать клиентский javascript

Поиск всех подходящих выбранных входов и для каждого найденного, пройти через опции и удалить тот, который выбран в мастере

0 голосов
/ 08 сентября 2011

Вместо использования DataBinding для применения фильтра вы можете добавить / удалить элементы DropdownList через свойство Items , если выбран другой фильтр. Таким образом, выбранное значение в раскрывающихся списках не должно сбрасываться.

...