当在重复器中选中复选框时,OnCheckedChanged事件不触发

4

我是一名相对较新的开发人员,全职从事IT技术工作已有大约6个月时间。感谢您阅读并/或回答我的问题。

我有一个数据绑定的重复器。在这个重复器中,我有一个网格视图、SQLDS和2个复选框。两个复选框都有一个OnCheckedChanged事件,并且AutoPostBack设置为true。重复器还有一个OnItemDataBound事件。

以下是我的代码示例:

    <asp:Repeater ID="Repeater1" OnItemDataBound="Repeater1_ItemDataBound">
        <ItemTemplate>
            <asp:Panel>
                <asp:UpdatePanel>
                    <ContentTemplate>
                        <asp:Checkbox ID="Checkbox1" Autopostback="True" OnCheckedChanged="CheckBox1_CheckedChanged">
                        <asp:Checkbox ID="Checkbox2"Autopostback="True" OnCheckedChanged="CheckBox2_CheckedChanged">
                        <asp:Gridview ID="Gridview1" DataSourceID="SqlDataSource1">
                        <asp:SQLDataSource ID="SQLDataSource1" SelectCommand="SP1" SelectCommandType="StoredProcedure">
                    </ContentTemplate>
                </asp:UpdatePanel>
            </asp:Panel>
        </ItemTemplate>
    </asp:Repeater>

同时,C#

    protected void Checkbox1_CheckedChanged(object sender, EventArgs e)
    {
        if (Checkbox1.Checked == true)
            {
                if (Checkbox2.Checked == true)
                    SqlDataSource1.SelectCommand = "SP1";
                else
                    SqlDataSource1.SelectCommand = "SP2";
            }
            else
                SqlDataSource1.SelectCommand = "SP3";
    }
    protected void Checkbox2_CheckedChanged(object sender, EventArgs e)
    {
        if (Checkbox2.Checked == true)
            {
                if (Checkbox1.Checked == true)
                    SqlDataSource1.SelectCommand = "SP3";
                else
                    SqlDataSource1.SelectCommand = "SP2";
            }
            else
                SqlDataSource1.SelectCommand = "SP1";
    }

    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        //Uses FindControl to Databind the GV and hides it if GV.Rows.Count==0
    }

我正在一个 AJAX TabPanel 内进行所有操作。我有另一个页面,这段代码在那个页面中完美运行,但它不在重复器内。

本质上,我有一个带有网格视图的页面加载,并且这两个复选框更改了 SP 填充网格视图的内容。我遇到的问题是,当您取消选中复选框时(它们开始已选中),它会1.重新选中自己,并且2.不会触发 CheckedChanged 事件。

任何帮助都将非常感激。


我没有看到与事件处理程序相关联且自动回发设置为true的复选框。你能展示一下你在哪里做这个吗? - Bala R
是的,抱歉。它们在ASP标签中被设置为这样。 - RockiesMagicNumber
6个回答

3

您需要为复选框设置AutoPostBack=True属性,并通过UpdatePanel控件的Triggers属性注册/分配所有添加到UpdatePanel中的控件的事件处理程序。


我刚刚做了这件事,设置了AutoPostBack=True,并在UpdatePanel上设置了触发器,如 <asp:AsyncPostBackTrigger ControlID="Checkbox1" EventName="CheckedChanged" /><asp:AsyncPostBackTrigger ControlID="Checkbox2" EventName="CheckedChanged" /> - 问题仍然存在,复选框无法触发它们的checkedchanged事件。 - RockiesMagicNumber

3
复选框的自动回发会导致SQLDatasource恢复为原始存储过程,因为它在页面加载时就忽略了oncheckchanged事件。我所做的是将所有数据绑定事件放在if (!IsPostBack)子句中,这样当自动回发发生时,它不会重新绑定SQLDS到原始值。这样,当自动回发发生时,它没有任何事情要做,它会按照预期触发OnCheckedChanged事件。感谢大家阅读并回应。

1

这看起来很有用,但我不确定如何实现它。OnCheckedChanged 事件需要它们自己的方法,所以我不确定在 Repeater1_ItemCommand 方法中应该放什么。 - RockiesMagicNumber

1

我也看到了那个链接,并尝试着实现它。但它并没有解决“重新检查未选中的链接”问题。 - RockiesMagicNumber

0
首先,您需要将 UpdatePanel 移到重复器之外,并添加 runat="server"。您还应该将数据源控件移出重复器,并将其重用于重复器内的所有 GridView。
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:Repeater ID="Repeater1" runat="server">
            <ItemTemplate>
                <!-- checkboxes -->
                <!-- gridview -->
            </ItemTemplate>
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ...>

@RockiesMagicNumber:请看我的回答。我认为这会解决你的问题。 - James Johnson

-1

实际上,您的数据绑定方法可能在if(!ISPOSTBACK){}条件之外被调用,因此请在ispostback块内调用此方法,希望您的问题得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接