简体   繁体   English

动态地将事件CheckedChanged添加到后台页面C#中的checkBox

[英]Dynamically add event CheckedChanged to checkBox in back page C#

I am creating a custom CheckBox (CheckBoxColumn ) 我正在创建一个自定义CheckBox(CheckBoxColumn)

class CheckBoxColumn : ITemplate
{
    public event EventHandler CheckedChanged;

    public void InstantiateIn(System.Web.UI.Control container)
    {
        CheckBox cb = new CheckBox();
        cb.ID = "IDCheckBox";
        cb.AutoPostBack= true;
        container.Controls.Add(cb);
    }

    protected void OnCheckedChanged(object sender, EventArgs e)
    {
        if (this.CheckedChanged != null)
            this.CheckedChanged(this, e); 
    }
}

so I can introduce the custom checkbox in a TemplateField 所以我可以在TemplateField中引入自定义复选框

            CheckBoxColumn cb = new CheckBoxColumn();
            cb.CheckedChanged += new EventHandler(ExecutarCheckBox_CheckedChanged);

            TemplateField checkBox = new TemplateField();
            checkBox.ItemTemplate = cb;
            gridviewexample.Columns.Add(checkBox);

But the event OnCheckedChanged is never reached. 但事件OnCheckedChanged永远不会到达。 When I click on the checkBox the page is reload and the column with the checkBox disappears. 当我单击checkBox时,页面将重新加载,并且带有checkBox的列将消失。 Does any one know how can I get it to work? 有谁知道我怎么能让它工作?

//Code //码

namespace Namespace1
{
    public partial class ClasseName: SuperClass
    {

        private void AddColumnsToGridView(DataTable dt)
        {

            CheckBoxColumn cb = new CheckBoxColumn();
            cb.CheckedChanged += new EventHandler(ExecutarCheckBox_CheckedChanged);

            TemplateField checkBox = new TemplateField();
            checkBox.ItemTemplate = cb;
            gridviewexample.Columns.Add(checkBox);

        }

    ...

        protected void ExecutarCheckBox_CheckedChanged(object sender, EventArgs e)
        {
             //code
        }

    }


    class CheckBoxColumn : ITemplate
    {
       public event EventHandler CheckedChanged;

       public void InstantiateIn(System.Web.UI.Control container)
       {
           CheckBox cb = new CheckBox();
           cb.ID = "IDCheckBox";
           cb.AutoPostBack= true;
           container.Controls.Add(cb);
        }

        protected void OnCheckedChanged(object sender, EventArgs e)
        {
            if (this.CheckedChanged != null)
                this.CheckedChanged(this, e); 
        }
    }

}

aspx ASPX

<asp:GridView ID="gridviewexample" runat="server" AllowPaging="True"
AllowSorting="True" AutoGenerateColumns="True" PagerType="DropDownList" PageSize="40" ShowFooter="true"

DataKeyNames="field1, field2, field3"

OnRowEditing="gridviewexample_RowEditing"
OnRowUpdating="gridviewexample_RowUpdating" 
OnPageIndexChanged="gridView_PageIndexChanged"
OnRowCancelingEdit="gridviewexample_RowCancelingEdit" 
OnSelectedIndexChanged="gridView_SelectedIndexChanged"
OnSorting="gridView_Sorting" 
OnRowDataBound="gridviewexample_RowDataBound"
OnPageIndexChanging="gridView_PageIndexChanging">                                    
<Columns>

       <asp:ButtonField ButtonType="Image" CommandName="Select" 
       ImageUrl="/images/edit.gif" >
            <ItemStyle HorizontalAlign="center" />
        </asp:ButtonField>                                        
        <asp:BoundField DataField="field1" ReadOnly="true" HeaderText="field1" Visible="true" ItemStyle-CssClass="Hide" HeaderStyle-CssClass="Hide" FooterStyle-CssClass= "Hide" />                        
        <asp:BoundField DataField="field2" ReadOnly="true" HeaderText="field2"/>
        <asp:BoundField DataField="field3" ReadOnly="true" HeaderText="field3" ItemStyle-CssClass="Hide" HeaderStyle-CssClass="Hide" FooterStyle-CssClass= "Hide" />                                     
</Columns>
    <EmptyDataTemplate>
        <span class="errorMsg" runat="server" id="lblNoRecords" visible='<%#(MadeSearch != null && MadeSearch.Value)?true:false%>'>
            </span>
    </EmptyDataTemplate>
</asp:GridView>

I think you have to bind your event to the inner-checkbox's event. 我认为你必须将你的事件绑定到内部复选框的事件。 I couldn't test, but I think this will at least lead you to the right way : 我无法测试,但我认为这至少会以正确的方式引导您:

class CheckBoxColumn : ITemplate
{
    private CheckBox _checkbox;
    private event EventHandler checkedChanged;
    public event EventHandler CheckedChanged
    {
        add
        {
            if (_checkbox != null)
            {
                checkedChanged += value;
                _checkbox.CheckedChanged += value;
            }
        }
        remove
        {
            if (_checkbox != null)
            {
                checkedChanged -= value;
                _checkbox.CheckedChanged -= value;
            }
        }
    }

    public CheckBoxColumn()
    {
        _checkbox = new CheckBox();
        _checkbox.ID = "IDCheckBox";
        _checkbox.AutoPostBack = true;
    }

    public void InstantiateIn(System.Web.UI.Control container)
    {
        if (_checkbox != null) container.Controls.Add(_checkbox);
    }

    protected void OnCheckedChanged(object sender, EventArgs e)
    {
        EventHandler handler = checkedChanged;
        if (handler != null) handler(this, e);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM