C# 更新面板和下拉列表数据绑定两次-生命周期
我认为这是一个asp.net页面生命周期的问题,但尽管如此,我还是不太明白 我在更新面板中有一个下拉列表,列出用户,然后在下面显示详细信息(更新或删除)。当I单击delete时,代码隐藏并清除ddl(以删除删除的用户),然后重新绑定它。都很好。在代码结束和页面更新之间的某个地方,它会再次追加列表C# 更新面板和下拉列表数据绑定两次-生命周期,c#,data-binding,drop-down-menu,asp.net-3.5,page-lifecycle,C#,Data Binding,Drop Down Menu,Asp.net 3.5,Page Lifecycle,我认为这是一个asp.net页面生命周期的问题,但尽管如此,我还是不太明白 我在更新面板中有一个下拉列表,列出用户,然后在下面显示详细信息(更新或删除)。当I单击delete时,代码隐藏并清除ddl(以删除删除的用户),然后重新绑定它。都很好。在代码结束和页面更新之间的某个地方,它会再次追加列表 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DropDownLis
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DropDownList1.AppendDataBoundItems = true;
DropDownList1.Items.Insert(0, new ListItem("Select a User", "select"));
DropDownList1.SelectedValue = "select";
DropDownList1.DataSourceID = "srcUsers";
DropDownList1.DataBind();
}
}
protected void btnDelete_Click(object sender, EventArgs e)
{
DropDownList1.AppendDataBoundItems = false;
DropDownList1.DataSourceID = "srcUsers";
DropDownList1.DataBind();
DropDownList1.AppendDataBoundItems = true;
DropDownList1.Items.Insert(0, new ListItem("Select a User", "select"));
DropDownList1.SelectedValue = "select";
}//at this point, the quick watch shows the correct count for the ddl
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DropDownList ID="DropDownList1" Width="150" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" AutoPostBack="true">
</asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="DropDownList1" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
受保护的无效页面加载(对象发送方,事件参数e)
{
如果(!IsPostBack)
{
DropDownList1.AppendDataBoundItems=true;
DropDownList1.Items.Insert(0,新列表项(“选择用户”、“选择”));
DropDownList1.SelectedValue=“选择”;
DropDownList1.DataSourceID=“srcUsers”;
DropDownList1.DataBind();
}
}
受保护的无效BTN删除\单击(对象发送者,事件参数e)
{
DropDownList1.AppendDataBoundItems=false;
DropDownList1.DataSourceID=“srcUsers”;
DropDownList1.DataBind();
DropDownList1.AppendDataBoundItems=true;
DropDownList1.Items.Insert(0,新列表项(“选择用户”、“选择”));
DropDownList1.SelectedValue=“选择”;
}//此时,“快速观察”将显示ddl的正确计数
注意:srcUsers
是一个对象数据源
如果我从按钮中删除ddl绑定代码,那么它根本不会更新ddl(在中,它会更新两次!)
第二次在哪里装订?如果我删除按钮代码,为什么它没有绑定?为什么我无法在VS中单步完成此操作?检查下面的代码,如果它能帮助您
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindCombo();
}
}
public void BindCombo()
{
DropDownList1.Items.Clear();
DropDownList1.AppendDataBoundItems = true;
DropDownList1.Items.Insert(0, new ListItem("Select a Category", "select"));
DropDownList1.SelectedValue = "select";
DropDownList1.DataSourceID = "ds1";
DropDownList1.DataBind();
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
//---- It can be placed in delete button's click event also ------//
ds1.DeleteCommand = "Delete from Categories where CategoryID="+DropDownList1.SelectedValue;
ds1.Delete();
BindCombo();
//---- It can be placed in delete button's click event also ------//
}
Himadri的代码让我想到(感谢您的努力!!!!)对于删除操作,我真的不需要重新绑定dropdownlist,我拥有SelectedValue。。。。所以我可以从下拉列表中删除它
DropDownList1.Items.Remove(selectedValue);
嗯
在页面的另一半代码中,我有一个执行插入类型操作(因此是更新面板)的代码,该操作调用了相同的代码(Himadri的BindCombo),并且存在相同的问题,但我认为我可以找到类似的解决方案
我仍然想知道VS调试器是如何让这种情况发生的
再次感谢希马德里 如果您发布了声明对象数据源的代码,可能会有所帮助。除非我遗漏了什么,否则这就是我现在拥有的。我遇到的问题是,在BindCombo触发(它向ddl中填充了20项)并且页面在其生命周期中运行之后,它在某个地方又添加了20项(40项)。DDL.Items.Clear();没有改变这一点。我真的很想知道如何更好地使用VS调试器来查找第二次添加的项;从BindCombo()和替换的BindCombo()中,仅使用DropDownList1.Items.RemoveAt(DropDownList1.SelectedIndex)删除语句;然后检查代码。该组合不包含两次数据。如果组合中填充了20条记录,则它始终保留20条或更少的记录(通过DropDownList1.Items.RemoveAt(DropDownList1.SelectedIndex);)删除一些记录之后)。请再查一下。谢谢我真的不认为这和装订有任何关系。。。我认为这与它在更新面板中发布有关。我的斗争是在调试。如果代码位于aspx页面中,则运行正常。嵌套在一个更新面板和某处,我得到了一个额外的绑定。。。我就是无法调试哪里。删除第(i)项;解决了眼前的问题。谢谢你的时间,在我的帖子里我已经检查了我发布的代码,dropdownlist只绑定了一次。绑定必须在if(!IsPostback)下,以便在首次加载页面时绑定下拉列表。现在我发现下拉列表没有绑定到其他任何地方。不用!iPostback下拉列表将在每次回发时额外绑定。谢谢你的评论。我会尝试更多。