为什么 checkbox选中触发事件不起作用?请帮忙

时间:2023-02-14 05:03:16
前:

  <Columns>
                        
                             <asp:TemplateField>
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox1" runat="server" />
                                </ItemTemplate>
                            </asp:TemplateField>
                            
                             <asp:BoundField DataField="e_id" HeaderText="序号" InsertVisible="False"    ReadOnly="True" SortExpression="e_id" >
                            <ItemStyle Width="30px" Wrap="False" />
                            </asp:BoundField>
                            
                            
                            <asp:BoundField DataField="e_name" HeaderText="企业名"     SortExpression="e_name"   >
                            <ControlStyle Width="130px"></ControlStyle>
                            <ItemStyle Width="170px" Wrap="False" />
                            </asp:BoundField>
                            
                            
                            
                            <asp:BoundField DataField="e_pname" HeaderText="联系人"   SortExpression="e_pname"   >
                            <ControlStyle Width="50px"></ControlStyle>
                            <ItemStyle Width="60px" Wrap="False" />
                            </asp:BoundField>
                            
                            
                            
                            <asp:BoundField DataField="e_phone" HeaderText="联系电话"  SortExpression="e_phone"    >
                            <ControlStyle Width="100px"></ControlStyle>
                            <ItemStyle Width="90px" Wrap="False" />
                            </asp:BoundField>
                            
                            
                            <asp:BoundField DataField="e_email" HeaderText="电子邮件"   SortExpression="e_email"   >
                            <ControlStyle Width="100px"></ControlStyle>
                             <ItemStyle Width="90px" Wrap="False" />
                            </asp:BoundField>
                            
                            <asp:CommandField HeaderText="编辑" ShowEditButton="True" >
                                <ItemStyle Width="60px" Wrap="False" />
                            </asp:CommandField>
                                
                        </Columns>
                        <RowStyle ForeColor="#000066" />
                        <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
                        <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
                        <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
                    </asp:GridView>
                     <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="True" Font-Size="9pt" OnCheckedChanged="CheckBox2_CheckedChanged"
                        Text="全选" />
                    <asp:Button ID="Button1" runat="server" Font-Size="9pt" Text="取消" OnClick="Button1_Click" />
                    <asp:Button ID="Button2" runat="server" Font-Size="9pt" Text="删除" OnClick="Button2_Click" />



后:
  protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
    {
        for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
        {
            CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            if (CheckBox2.Checked == true)
            {
                cbox.Checked = true;
            }
            else
            {
                cbox.Checked = false;
            }
        }
         
    }
    protected void Button2_Click(object sender, EventArgs e)
    {

         for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
        {
            CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            if (cbox.Checked)  //此处为什么不触发?

            {
               // string sqlstr = "delete from +++++++='" + GridView1.DataKeys[i].Value + "'";
                 TextBox2.Text = "hello";
            }

            else
            {
                
                 TextBox2.Text = "NND";
            }
        }

         bind();
  
    }

25 个解决方案

#1


  CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            if (cbox.Checked == true)

#2


 CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1"); 
是否正确

#3


Checked是用来判断是否选择。应然不会触发
SelectIndex才是用来改变选择

#4


 if (cbox.Checked == true)  试过了是不行的

#5


CheckBox2_CheckedChanged  中证明  CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");   是正确的 因为 全选和取消都是正常的

#6


cbox.Checked == true
试试这个,然后加断点看看啊

#7


就是前面已经进行了复选  但  if (cbox.Checked) 或 if (cbox.Checked==true) 总是认为是没有选择的  不知道为什么

#8


不好意思,看差了。CheckBox1_CheckedChanged 要AutoPostBack鼠标点击触发,后台触发代码如下。

protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
        Response.Write("aaa");
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        CheckBox1.Checked = !CheckBox1.Checked;
        CheckBox1_CheckedChanged((object)CheckBox1,null);
    }

#9


你又重新绑定了吧  这个 bind(); 注释掉 

#10


引用 8 楼 skywolfy 的回复:
不好意思,看差了。CheckBox1_CheckedChanged 要AutoPostBack鼠标点击触发,后台触发代码如下。

 protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
     {
         Response.Write("aaa");
     }
     protected void Button1_Click(object sender, EventArgs e)
     {
         CheckBox1.Checked = !CheckBox1.Checked;
         CheckBox1_CheckedChanged((object)CheckBox1,null);
     }

嗯 AutoPostBack

#11


看错了,你那个bind(); 写到if(!IsPostBack)里面了吗

#12


跟踪一下,看看这些checkbox是否跟你测试选中的一致!逐步找出问题。
至少 protected void Button2_Click(object sender, EventArgs e) 不会有问题!

#13


 楼上的if(!IsPostBack)说的很重要,我曾在这个地方出错过!

#14


<asp:CheckBox ID="CheckBox1" runat="server" /> 
的AutoPostBack设成True

#15


引用 14 楼 septemson 的回复:
<asp:CheckBox ID="CheckBox1" runat="server" />
的AutoPostBack设成True


好像变成  点一下 刷新下了

#16


 if (!IsPostBack)
        {
            // ViewState["SortOrder"] = "e_id";
            //  ViewState["OrderDire"] = "ASC";
            bind();
        }

已经加的

#17


asp:CheckBox的事件与响应代码绑定了吗

#18


引用 17 楼 newdigitime 的回复:
asp:CheckBox的事件与响应代码绑定了吗



就检查  checkbox 选中状态 还要绑定事件么?

#19


不好意思,看错了,<asp:CheckBox ID="CheckBox1" runat="server" /> 
不需要加AutoPostBack。

你这个问题是很常见的问题。刷页面会导致Gridview的Bounding事件,会把Checkbox重构,所以所有的钩都会没。

这个问题的解决方法是在PageLoad里,写个方法,把当前选中的记录的Key记下,然后再Button事件的最开始,再重新把这些钩打上,然后进行之后的判断。

#20


这样不是 太麻烦了么 还有更好的办法么

#21


这是我做的简单测试例子,你自己对比下,看看自己哪里不一样

        <asp:GridView ID="GridView1" runat="server">
           <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:CheckBox ID="CheckBox1" runat="server"  />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true"  OnCheckedChanged="CheckBox2_CheckedChanged" />&nbsp;
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("s");
            dt.Rows.Add("ss");
            dt.Rows.Add("ss");
            dt.Rows.Add("ss");

            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }
    protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
    {
        for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
        {
            CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            if (CheckBox2.Checked == true)
            {
                cbox.Checked = true;
            }
            else
            {
                cbox.Checked = false;
            }
        } 

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
        {
            CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            if (cbox.Checked)  //此处为什么不触发? 
            {
                Response.Write(i.ToString()+"<br/>");
            }
        } 

    }

#22


你这个测试通过的么?

#23


21楼这样每次刷页面都不重新绑数据是不行的,这样很容易导致数据库和页面不一致

#24


autoPostBack=true;
that's OK

#25


.

#1


  CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            if (cbox.Checked == true)

#2


 CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1"); 
是否正确

#3


Checked是用来判断是否选择。应然不会触发
SelectIndex才是用来改变选择

#4


 if (cbox.Checked == true)  试过了是不行的

#5


CheckBox2_CheckedChanged  中证明  CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");   是正确的 因为 全选和取消都是正常的

#6


cbox.Checked == true
试试这个,然后加断点看看啊

#7


就是前面已经进行了复选  但  if (cbox.Checked) 或 if (cbox.Checked==true) 总是认为是没有选择的  不知道为什么

#8


不好意思,看差了。CheckBox1_CheckedChanged 要AutoPostBack鼠标点击触发,后台触发代码如下。

protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
        Response.Write("aaa");
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        CheckBox1.Checked = !CheckBox1.Checked;
        CheckBox1_CheckedChanged((object)CheckBox1,null);
    }

#9


你又重新绑定了吧  这个 bind(); 注释掉 

#10


引用 8 楼 skywolfy 的回复:
不好意思,看差了。CheckBox1_CheckedChanged 要AutoPostBack鼠标点击触发,后台触发代码如下。

 protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
     {
         Response.Write("aaa");
     }
     protected void Button1_Click(object sender, EventArgs e)
     {
         CheckBox1.Checked = !CheckBox1.Checked;
         CheckBox1_CheckedChanged((object)CheckBox1,null);
     }

嗯 AutoPostBack

#11


看错了,你那个bind(); 写到if(!IsPostBack)里面了吗

#12


跟踪一下,看看这些checkbox是否跟你测试选中的一致!逐步找出问题。
至少 protected void Button2_Click(object sender, EventArgs e) 不会有问题!

#13


 楼上的if(!IsPostBack)说的很重要,我曾在这个地方出错过!

#14


<asp:CheckBox ID="CheckBox1" runat="server" /> 
的AutoPostBack设成True

#15


引用 14 楼 septemson 的回复:
<asp:CheckBox ID="CheckBox1" runat="server" />
的AutoPostBack设成True


好像变成  点一下 刷新下了

#16


 if (!IsPostBack)
        {
            // ViewState["SortOrder"] = "e_id";
            //  ViewState["OrderDire"] = "ASC";
            bind();
        }

已经加的

#17


asp:CheckBox的事件与响应代码绑定了吗

#18


引用 17 楼 newdigitime 的回复:
asp:CheckBox的事件与响应代码绑定了吗



就检查  checkbox 选中状态 还要绑定事件么?

#19


不好意思,看错了,<asp:CheckBox ID="CheckBox1" runat="server" /> 
不需要加AutoPostBack。

你这个问题是很常见的问题。刷页面会导致Gridview的Bounding事件,会把Checkbox重构,所以所有的钩都会没。

这个问题的解决方法是在PageLoad里,写个方法,把当前选中的记录的Key记下,然后再Button事件的最开始,再重新把这些钩打上,然后进行之后的判断。

#20


这样不是 太麻烦了么 还有更好的办法么

#21


这是我做的简单测试例子,你自己对比下,看看自己哪里不一样

        <asp:GridView ID="GridView1" runat="server">
           <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:CheckBox ID="CheckBox1" runat="server"  />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true"  OnCheckedChanged="CheckBox2_CheckedChanged" />&nbsp;
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("s");
            dt.Rows.Add("ss");
            dt.Rows.Add("ss");
            dt.Rows.Add("ss");

            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }
    protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
    {
        for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
        {
            CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            if (CheckBox2.Checked == true)
            {
                cbox.Checked = true;
            }
            else
            {
                cbox.Checked = false;
            }
        } 

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
        {
            CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            if (cbox.Checked)  //此处为什么不触发? 
            {
                Response.Write(i.ToString()+"<br/>");
            }
        } 

    }

#22


你这个测试通过的么?

#23


21楼这样每次刷页面都不重新绑数据是不行的,这样很容易导致数据库和页面不一致

#24


autoPostBack=true;
that's OK

#25


.