我有一个可编辑的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项:
第二个屏幕截图,其中点击了AddRow按钮后添加了一个新行,dropdownlist
在第一行重新排列,显示伦敦。
如果点击了AddRow和Delete dropdownlist
,如何使代码保持button
选择?
我尝试禁用AutoPostBack
的{{1}}属性为dropdownlist
,但无效。
专家请帮帮忙。
成功的屏幕截图:
答案 0 :(得分:1)
我在一些R&amp; D之后解决了这个问题。
我绑定了dropdownlist
后创建了gridview
的新实例,在新实例中,我使用PopulateGridView方法中的List
保留了之前的选择。
请参阅代码编辑。
希望这有助于某些人。
答案 1 :(得分:0)
每次点按“添加”按钮,都会执行回发。
每次回发都会重建整个页面,包括基于表格的网格。您可以在自己的代码中看到它。
但部分原因是每行中的控件也被重建。这包括您的DDL,但您没有保存/恢复每个下拉列表中的选定值。更准确地说,保存选定的值,但在重新创建表时无效。您必须处理RowDatabound事件,并在每行中恢复ddl中的选定值。
但是你可能有更大的问题。您在每行中使用相同的DDL实例。这可能会导致选择/持久性问题。如果您发现从ddl中选择一个项目会导致所有行具有相同的选定项目,那么问题就在于行动。
查看ddl的渲染输出,并确保每行的ID都是唯一的。
如果ddl拥有它自己的数据源,那么你需要在每一行中创建一个DropDownlist的新实例,并为其分配相同的数据源,而不是使用find控件。
如果控件有硬编码的列表项,那么您应该检查唯一的ddl id&#39>