选中Repeater中的复选框时,OnCheckedChanged事件不会触发

时间:2011-09-29 00:52:05

标签: c# asp.net repeater

我是一名相对较新的开发人员,并且只在全职工作6个月左右,所以提前感谢您阅读和/或回答我的问题

我有一个数据中转中继器。在这个中继器中,我有一个gridview,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中完成所有这些工作。我有另一个页面,这段代码完美地运行,但它不在另一页的转发器内。

基本上,我有一个带有gridview的页面加载,这两个复选框改变了SP填充gridview的内容。我遇到的问题是,当你取消选中复选框(它们开始检查)时,它1.只需重新检查自己和2.不要点击CheckedChanged事件。

任何帮助都会非常感激。

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

复选框上的Autopostback导致SQLDatasource只恢复到原始的存储过程,因为它点击了页面加载而忽略了oncheckchanged事件。

我所做的是将所有数据绑定事件放在pageload中并将它们放在if (!IsPostBack)子句中,这样当Autopostback命中时,它不会将SQLDS重新绑定到原始值。

这样,当autopostback发生时,没有任何东西可以做,它会按照预期的那样点击OnCheckedChanged事件。

感谢大家阅读和回复。

答案 2 :(得分:1)

ASP.NET Repeater有一个事件导致客户端往返发生。该事件称为ItemCommand。请查看此链接: - http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemcommand.aspx

希望这有帮助

答案 3 :(得分:1)

答案 4 :(得分: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" ...>

答案 5 :(得分:-1)

实际上你的数据绑定方法可能在if(!ISPOSTBACK){}之外调用 条件,所以在ispostback块中调用这个方法,希望你的问题能解决。