【发布时间】:2021-08-31 19:37:23
【问题描述】:
我在.aspx 页面上有一个.ascx 用户控件。当用户点击一个按钮时,信息被收集并存储在数据库中。然后Gridview 是数据绑定的,Gridview 是dropdownlist。这个dropdownlist 的Items 是根据用户之前的输入动态创建的,现在在数据库中。这一切都很好,Gridview 与 dropdownlist 一起显示,并带有动态创建的 Items。
问题在于这个dropdownlist 的回发。我显然必须在dropdownlist 中使用动态创建的Items 重新创建Gridview。这不起作用。回发发生并调用Page_Init,然后调用Page_InitComplete。这在Gridview 上有数据绑定,它调用SectionGV_OnRowDataBound 方法。 dropdownlists 被重新创建。但是SectionDD_OnSelectedIndexChanged 方法永远不会被命中,然后dropdownlist 只是恢复到原来的值。我无法更改 dropdownlist's 选择的值。
.ASCX
<asp:GridView ID="MyGV" runat="server" AutoGenerateColumns="False" DataSourceID="MyDS" Width="100%" OnRowDataBound="MyGV_OnRowDataBound">
<Columns>
<asp:TemplateField >
<ItemTemplate>
<asp:DropDownList runat="server" ID="SectionDD" AppendDataBoundItems="True" AutoPostBack="True" OnSelectedIndexChanged="SectionDD_OnSelectedIndexChanged" >
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
.ASCX 背后的代码
protected void Page_Init(object sender,EventArgs e)
{
this.Page.InitComplete += Page_InitComplete;
}
private void Page_InitComplete(object sender, EventArgs e)
{
MyGV.DataBind();
}
protected void SectionDD_OnSelectedIndexChanged(object sender, EventArgs e)
{
}
protected void MyGV_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
using (EntitiesModel dbContext = new EntitiesModel())
{
// get array[][] array from database
if (e.Row.RowType == DataControlRowType.DataRow)
{
DropDownList sectionDd = (DropDownList)e.Row.FindControl("SectionDD");
sectionDd.Items.Clear();
if (array.Length == 3)
{
if(array[0][2].ToDecimal() > 0) sectionDd.Items.Add(new ListItem(array[0][0], array[0][1]));
if(array[1][2].ToDecimal() > 0) sectionDd.Items.Add(new ListItem(array[1][0], array[1][1]));
if(array[2][2].ToDecimal() > 0) sectionDd.Items.Add(new ListItem(array[2][0], array[2][1]));
}
else if (array.Length == 2)
{
if (array[0][2].ToDecimal() > 0) sectionDd.Items.Add(new ListItem(array[0][0], array[0][1]));
if (array[1][2].ToDecimal() > 0) sectionDd.Items.Add(new ListItem(array[1][0], array[1][1]));
}
else if (array.Length == 1)
{
if (array[0][2].ToDecimal() > 0) sectionDd.Items.Add(new ListItem(array[0][0], array[0][1]));
}
}
sectionDd.DataBind();
}
}
}
}
private void SaveToDB()
{
//save information to database
注意
这是我尝试解决此问题的众多方法之一。我将信息保存在数据库中的原因只是临时修复。我只是想解决上面列出的问题,然后我将添加一个ViewState 解决方案。
【问题讨论】:
标签: c# asp.net gridview dynamic