下拉列表选择不会在AddRow按钮单击上保留数据

时间:2015-02-03 18:27:54

标签: c# asp.net gridview drop-down-menu

我有一个可编辑的GridView

我有一个AddRow button,它会添加一行,其中包含3个text boxes和一个dropdown list

另外,我有一个删除button,它会在点击时删除整行。

每当我点击AddRow按钮时,我dropdownlist的选择都不会保留,所选的值会重新排列到第一个项目。

以下是代码:

<asp:GridView ID="GridView1" runat="server" ShowFooter="true" AutoGenerateColumns="false"
            OnRowDeleting="GridView1_RowDeleting">
            <Columns>
                <asp:TemplateField HeaderText="Serial No">
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Container.DataItemIndex + 1 %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Col1">
                    <ItemTemplate>
                        <asp:TextBox runat="server" ID="txt1" Text='<%# Eval("Column1") %>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Col2">
                    <ItemTemplate>
                        <asp:TextBox ID="txt2" runat="server" Text='<%# Eval("Column2") %>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Col3">
                    <ItemTemplate>
                        <asp:TextBox ID="txt3" runat="server" Text='<%# Eval("Column3") %>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="DropDown">
                    <ItemTemplate>
                        <asp:DropDownList ID="DropDownList1" runat="server" DataTextField='<%# Eval("Column4") %>'>
                            <asp:ListItem>London</asp:ListItem>
                            <asp:ListItem>Paris</asp:ListItem>
                            <asp:ListItem>New Delhi</asp:ListItem>
                            <asp:ListItem>New York</asp:ListItem>
                        </asp:DropDownList>
                    </ItemTemplate>
                    <FooterStyle HorizontalAlign="Right" />
                    <FooterTemplate>
                        <asp:Button ID="btnAddNewRow" runat="server" Text="AddRow" OnClick="Add" />
                    </FooterTemplate>
                </asp:TemplateField>
                <asp:CommandField ButtonType="Button" ShowDeleteButton="true" />
            </Columns>
        </asp:GridView>
        <asp:Button ID="btnSavetoDB" runat="server" Text="save" OnClick="btnSavetoDB_Click" />

已编辑代码:

     List<string> newList = new List<string>();
     protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                var table = CreateDataTable();
                table.Rows.Add("", "", "");
                BindGridView(table);
            }
        }
    //Called on AddRow button click
    protected void Add(object sender, EventArgs e)
            {
                var newTable = PopulateTableFromGridView();
                newTable.Rows.Add("", "", "");
                BindGridView(newTable);
             }
    private DataTable PopulateTableFromGridView()
        {
            var table = CreateDataTable();
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                //extract the TextBox values
                TextBox box1 = (TextBox)GridView1.Rows[i].FindControl("txt1");
                TextBox box2 = (TextBox)GridView1.Rows[i].FindControl("txt2");
                TextBox box3 = (TextBox)GridView1.Rows[i].FindControl("txt3");
                DropDownList ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
                table.Rows.Add(box1.Text, box2.Text, box3.Text,ddl.SelectedItem.Text);
            }
            newList.Add(ddl.SelectedItem.Text);//add selecteditems to a global list
            return table;
        }
        //Sets the first empty row to the grid view
        private DataTable CreateDataTable()
        {
            var dt = new DataTable
            {
                Columns = { "Column1", "Column2", "Column3","Column4" }
            };
            return dt;
        }

        private void BindGridView(DataTable table)
        {
            GridView1.DataSource = table;
            GridView1.DataBind();
            for(int i=0;i<GridView1.Rows.Count-1;i++)
            {
                    DropDownList ddl2=(DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
                    ddl2.ClearSelection();
                    ddl2.Items.FindByText(newList[i]).Selected = true;     
            }
        }
         protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            var dt = PopulateTableFromGridView();
            if (dt.Rows.Count > 1)
            {
                dt.Rows[e.RowIndex].Delete();
            }
            BindGridView(dt);
        }

第一个截图,我从dropdownlist中选择了NewDelhi,这是第3项:

enter image description here

第二个屏幕截图,其中点击了AddRow按钮后添加了一个新行,dropdownlist在第一行重新排列,显示伦敦。

enter image description here

如果点击了AddRow和Delete dropdownlist,如何使代码保持button选择?

我尝试禁用AutoPostBack的{​​{1}}属性为dropdownlist,但无效。 专家请帮帮忙。

成功的屏幕截图: enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

我在一些R&amp; D之后解决了这个问题。

我绑定了dropdownlist后创建了gridview的新实例,在新实例中,我使用PopulateGridView方法中的List保留了之前的选择。

请参阅代码编辑。

希望这有助于某些人。

答案 1 :(得分:0)

每次点按“添加”按钮,都会执行回发。

每次回发都会重建整个页面,包括基于表格的网格。您可以在自己的代码中看到它。

但部分原因是每行中的控件也被重建。这包括您的DDL,但您没有保存/恢复每个下拉列表中的选定值。更准确地说,保存选定的值,但在重新创建表时无效。您必须处理RowDatabound事件,并在每行中恢复ddl中的选定值。

但是你可能有更大的问题。您在每行中使用相同的DDL实例。这可能会导致选择/持久性问题。如果您发现从ddl中选择一个项目会导致所有行具有相同的选定项目,那么问题就在于行动。

查看ddl的渲染输出,并确保每行的ID都是唯一的。

如果ddl拥有它自己的数据源,那么你需要在每一行中创建一个DropDownlist的新实例,并为其分配相同的数据源,而不是使用find控件。

如果控件有硬编码的列表项,那么您应该检查唯一的ddl id&#39>