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

C# 为什么以编程方式选中复选框会导致其关联事件在下一次回发时触发?,c#,asp.net,C#,Asp.net,由于我正在处理一个非常复杂的页面,所以我已将问题简化为最简单的形式。此示例有一组动态生成的复选框。当页面首次加载时,可能需要选中其中一些复选框。此外,无论何时选中或取消选中框,都需要触发事件。还有一个下拉列表,当所选索引更改时需要自动回发。问题是,如果我以编程方式选中复选框,那么当我在下拉列表上进行选择时,复选框事件将触发。要重新创建错误/问题,请在复选框事件和下拉列表事件上设置断点。加载页面并从下拉列表中进行选择。复选框事件将在下拉列表事件之前触发。如果查看复选框事件的发送者,则是在初始化页面

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

 <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);
}

受保护的无效页_Init(对象发送方,事件参数e)
{
if(this.IsPostBack)
{
创建复选框();
}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!this.IsPostBack)
{
初始化ECKBoxes();
}
}
受保护的无效复选框\u CheckedChanged(对象发送方,事件参数e)
{
复选框cb=发送方作为复选框;
}
受保护的void DropDownList1\u SelectedIndexChanged(对象发送方,事件参数e)
{
//做点什么
}
private void InitializeCheckBox()
{
表tbl=新表();
TableRow tr=新的TableRow();

对于(int x=1;x所选索引已更改,因为您已将其连接起来以执行此操作

OnSelectedIndexChanged=“DropDownList1\u SelectedIndexChanged”

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

更新

问题是,如果我以编程方式选中复选框,则 当我在下拉列表上进行选择时,复选框事件将触发

我认为这是预期的行为,类似于如果您手动选中一堆复选框,然后在autopostback设置为true的情况下更改ddl,它将处理所有事件。您能否从抽象意义上解释您的问题,您试图实现什么,您为什么不希望触发复选框事件,您已经完成了所有人都创建了它们,然后对它们进行了检查,因此事件会触发吗

您可以进行一些恶劣的黑客攻击,以解除页面加载中的复选框事件,并将它们连接回加载完成。您可以使用IsCallback属性,但这只适用于您的简单示例,因为ddl位于更新面板中


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

为什么要初始化并添加它们(复选框)同样??这是一个丑陋的矩形文本,位于问题顶部。复选框是动态生成的,因此如果每次回发时不重新添加复选框,它们将消失。为什么不更改标记以将第二个复选框初始化为checked=true?复选框以及是否需要选中取决于数据库值。I要在更改下拉列表时触发“DropDownList1\u SelectedIndexChanged”。问题是“CheckBox\u CheckedChanged”如果我以编程方式选中复选框,并且这是页面加载后的第一次回发,则在下拉列表更改时触发。问题是,当我在下拉列表上进行选择时,复选框\u CheckChanged正在触发。我编辑了该问题,希望它更清晰。该页面的目的是让生产线主管在制造厂。复选框表示收取废品的备用部门。如果选中其中一个备用部门,则我必须在页面上显示不同的控件。当我必须加载已填充值的页面时,我遇到编辑问题。对其他控件(如下拉框)进行更改正在导致checkedchanged事件触发。我想通过编程方式选中复选框,但抑制该事件。我很乐意在这一点上进行黑客攻击,否则我将不得不重新设计该部分。这基本上是我在这个应用程序完成之前最不需要做的事情,我已经工作了几个月.因此,在这一点上,重新设计不是我最喜欢的选择。