删除一些ListItem后,在GridView中的DropDownList中维护所选项

时间:2011-09-08 17:12:21

标签: asp.net data-binding

我有一个GridView,每行都有一个DropDownList。 (DropDownList中的项目对于每个项目都是相同的。)我在GridView之外有一个DropDownList“ddlView”,用于过滤其他DropDownLists中的可用选项。 ddlView的默认选择是无过滤器。

当用户为ddlView选择新值时,如果其他DropDownLists中的任何选定值在应用过滤器后不是其中一个值,则会消失。在这种情况下我想要发生的是先前选择的值仍然存在并被选中。

实现这一目标的最佳方法是什么?

以前选择的值在回发期间可用,但在GridView上调用DataBind()后似乎会被清除,因此我无法在填充它们的方法中确定它们之前的值(RowDataBound事件)。

到目前为止,我最好的想法是在回发期间手动将该信息存储到对象或集合中,并在数据绑定事件期间稍后引用它。

有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

我认为没有更好的方法来实现这一点,因为GridView绑定时会重新创建所有控件,从而删除选择。

以下工作原理:(我将选择存储在postback上,以便在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)
            {
            }
        }
    }
}

希望它有所帮助。

答案 1 :(得分:0)

当选择另一个过滤器时,您可以通过Items property添加/删除DropdownList项,而不是使用DataBinding来应用过滤器。这样,不应重置下拉列表中的选定值。

答案 2 :(得分:0)

您可以通过简单的条件完成此操作。我不知道你是如何过滤这些物品的,但它会是这样的:

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

不确定这是否是您正在寻找的,但希望它有所帮助。

答案 3 :(得分:0)

使用客户端javascript

搜索所有相应的选择输入,找到每个输入,查看选项并删除在主ddl中选择的输入

function UpdateDropDowns (tbl) {
    var controls = tbl.getElementsByTagName('select');
        for (var i = 0; i < controls.length; i++) {
           RemoveOption(controls[i], 'the value to remove');
   }
}

function RemoveOption(ddl, val)
{
  for (var i = ddl.options.length; i>=0; i--) {
    if (ddl.options[i].value == val) {
        ddl.remove(i);
    }
  }
}