gpt4 book ai didi

c# - 为什么以编程方式检查复选框会导致其关联事件在下一次回发时触发?

转载 作者:太空宇宙 更新时间:2023-11-03 15:58:56 24 4
gpt4 key购买 nike

由于我正在处理一个非常复杂的页面,所以我已将我的问题简化为可能的最简单形式。这个例子有一组动态生成的复选框。首次加载页面时,可能需要选中其中一些复选框。此外,只要选中或取消选中一个框,就需要触发一个事件。还有一个下拉列表需要在所选索引更改时自动回发。问题是,如果我以编程方式选中一个复选框,那么当我在下拉列表中进行选择时,复选框事件将触发。要重新创建错误/问题,请在复选框事件和下拉列表事件上放置一个断点。加载页面并从下拉列表中进行选择。复选框事件将在下拉列表事件之前触发。如果您查看复选框事件的发送者,它就是页面初始化时以编程方式选中的复选框。如果下拉列表发生变化,我只想触发下拉事件,但我仍然需要在第一次加载页面时以编程方式选中复选框。

 <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" >
<Triggers>
<asp:AsyncPostBackTrigger ControlID="DropDownList1" EventName="SelectedIndexChanged" />
</Triggers>
<ContentTemplate>
<asp:PlaceHolder ID="PlaceHolder1" runat="server" />
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" >
<asp:ListItem Text="--Select--" Value="0" />
<asp:ListItem Text="Option 1" Value="1" />
<asp:ListItem Text="Option 2" Value="2" />
</asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>

protected void Page_Init(object sender, EventArgs e)
{
if (this.IsPostBack)
{
CreateCheckboxes();
}
}

protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
InitializeCheckboxes();
}
}

protected void CheckBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox cb = sender as CheckBox;
}

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
//Do Something
}

private void InitializeCheckboxes()
{
Table tbl = new Table();

TableRow tr = new TableRow();

for (int x = 1; x <= 3; x++)
{
TableCell tc = new TableCell();
CheckBox cb = new CheckBox();
cb.ID = "cb_" + x.ToString();
cb.Text = "cb_" + x.ToString();
cb.AutoPostBack = true;
cb.CheckedChanged += new EventHandler(CheckBox_CheckedChanged);

if (x == 2)
cb.Checked = true;

tc.Controls.Add(cb);
tr.Cells.Add(tc);
}

tbl.Rows.Add(tr);
PlaceHolder1.Controls.Add(tbl);
}

private void CreateCheckboxes()
{
Table tbl = new Table();

TableRow tr = new TableRow();

for (int x = 1; x <= 3; x++)
{
TableCell tc = new TableCell();
CheckBox cb = new CheckBox();
cb.ID = "cb_" + x.ToString();
cb.Text = "cb_" + x.ToString();
cb.AutoPostBack = true;
cb.CheckedChanged += new EventHandler(CheckBox_CheckedChanged);

tc.Controls.Add(cb);
tr.Cells.Add(tc);
}

tbl.Rows.Add(tr);
PlaceHolder1.Controls.Add(tbl);
}

最佳答案

选定的索引已更改,因为您已将其连接起来

OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"

再次触发复选框更改,因为您取消选中它,所以它已从选中更改为未选中。如果您想停止处理程序执行任何操作,请检查其状态并在未检查时返回。

更新

The problem is that if I programmatically check a check box then the checkbox event will fire when I make a selection on the drop downlist

我认为这是预期的行为,这类似于如果您手动选中一堆复选框然后更改 ddl 并将 autopostback 设置为 true,它将处理所有事件。你能从抽象的意义上解释你的问题吗,你想要达到什么目的,为什么你不想触发复选框事件,毕竟你已经创建了它们然后检查了它们所以事件会触发?

您可以进行一些令人讨厌的黑客攻击以取消关联 Page_load 中的复选框事件并将它们关联回 LoadComplete。您可以使用 IsCallback 属性,但这只适用于您的简单示例,因为您的 ddl 在更新面板中。

我建议根本不要使用服务器端事件。创建 Web 服务并使用 jQuery ajax 之类的工具将执行工作所需的所有相关数据发布到其中。

关于c# - 为什么以编程方式检查复选框会导致其关联事件在下一次回发时触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com