编译器错误信息: CS0117: “CheckBox”并不包含“Checked”的定义

时间:2021-04-18 03:42:22
实现点标题全选按钮时进行反选CheckBox操作。出现编译器错误信息: CS0117: “CheckBox”并不包含“Checked”的定义。
请高手解答。。

c#代码:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class GridView03 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            for (int i = 1; i <= GridView1.Columns.Count; i++)
            {
                DropDownList1.Items.Add(i.ToString());
            }
        }
    }
    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)    // 判断当前行是数据行
        {
            e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;this.style.backgroundColor='#00ffee';");
            e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c;");
        }
    }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        string lbl = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "state"));
        if (lbl == "BB")
        {
            e.Row.BackColor = System.Drawing.Color.LimeGreen;
        }
    }
    protected void Button1_Click(object sender, EventArgs e)    // 隐藏选中的列
    {
        int columns = Convert.ToInt32(DropDownList1.SelectedValue) - 1;
        GridView1.Columns[columns].Visible = false;
    }
    protected void Button2_Click(object sender, EventArgs e)    // 显示全部列
    {
        for (int i = 0; i < GridView1.Columns.Count; i++)
        {
            GridView1.Columns[i].Visible = true;
        }
    }
    protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
    {
        foreach (GridViewRow gr in GridView1.Rows)
        {
            CheckBox chk = (CheckBox)gr.Cells[6].FindControl("itemchk");
            if (!chk.Checked)
            {
                chk.Checked = true;
            }
            else
            {
                chk.Checked = false;
            }
        }
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
        //foreach (GridViewRow gr in GridView1.Rows)
        //{
        //    CheckBox chk = (CheckBox)gr.Cells[6].FindControl("itemchk");
        //    if (chk.Checked)
        //    {
        //        //执行删除动作,对了,这里可得把ID给查找出来才行
        //        //我这里给大家找出来了,删除动作我相信大家还是会的,前面已经狠狠的说过了
        //    }
        //}
    }
}


aspx页面代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GridView03.aspx.cs" Inherits="GridView03" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        GridView控件<br />
        增加鼠标动作,包含特定值的行改变样式<br />
        &nbsp;</div>
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
            AutoGenerateColumns="False" CellPadding="4" DataKeyNames="au_id" DataSourceID="SqlDataSource1"
            ForeColor="#333333" GridLines="None" OnRowCreated="GridView1_RowCreated" OnRowDataBound="GridView1_RowDataBound">
            <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <Columns>
                <asp:CommandField HeaderText="编辑" ShowDeleteButton="True" ShowEditButton="True" />
                <asp:BoundField DataField="au_id" HeaderText="ID" ReadOnly="True" SortExpression="au_id" />
                <asp:BoundField DataField="au_fname" HeaderText="名字" SortExpression="au_fname" />
                <asp:BoundField DataField="city" HeaderText="城市" SortExpression="city" />
                <asp:BoundField DataField="phone" HeaderText="电话" SortExpression="phone" />
                <asp:BoundField DataField="state" HeaderText="分类" SortExpression="state" />
                <asp:TemplateField>
                    <HeaderTemplate>
                        <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="True" OnCheckedChanged="CheckBox2_CheckedChanged"
                            Text="全选" />
                    </HeaderTemplate>
                    <ItemTemplate>
                        <asp:CheckBox ID="itemchk" runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <RowStyle BackColor="#EFF3FB" />
            <EditRowStyle BackColor="#2461BF" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <AlternatingRowStyle BackColor="White" />
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:pubsConn %>"
            DeleteCommand="DELETE FROM [authors] WHERE [au_id] = @au_id" InsertCommand="INSERT INTO [authors] ([au_id], [au_fname], [city], [phone], [state]) VALUES (@au_id, @au_fname, @city, @phone, @state)"
            SelectCommand="SELECT [au_id], [au_fname], [city], [phone], [state] FROM [authors] ORDER BY [au_id]"
            UpdateCommand="UPDATE [authors] SET [au_fname] = @au_fname, [city] = @city, [phone] = @phone, [state] = @state WHERE [au_id] = @au_id">
            <DeleteParameters>
                <asp:Parameter Name="au_id" Type="String" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="au_fname" Type="String" />
                <asp:Parameter Name="city" Type="String" />
                <asp:Parameter Name="phone" Type="String" />
                <asp:Parameter Name="state" Type="String" />
                <asp:Parameter Name="au_id" Type="String" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="au_id" Type="String" />
                <asp:Parameter Name="au_fname" Type="String" />
                <asp:Parameter Name="city" Type="String" />
                <asp:Parameter Name="phone" Type="String" />
                <asp:Parameter Name="state" Type="String" />
            </InsertParameters>
        </asp:SqlDataSource>
        <br />
        <asp:DropDownList ID="DropDownList1" runat="server">
        </asp:DropDownList>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="隐藏选定的列" />
        <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="显示全部列" />
        <asp:Button ID="Button3" runat="server" Text="删除被选中列" OnClick="Button3_Click" />
    </form>
</body>
</html>

26 个解决方案

#1


测试用的是sql server 2000中的pubs的authors表。。

#2


出错的位置在:protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
中的
if (!chk.Checked)

#3


恩。。。搞不懂了。。。

#4


恩。。。搞不懂了。。。

#5


引用 2 楼 jasonpeng2 的回复:
出错的位置在:protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
中的
if (!chk.Checked)
你试试用控件的属性定义checked看看?

#6



CheckBox chk = (CheckBox)(gr.Cells[6].FindControl("itemchk"));
试一下
另外 你的方法的sender就是你那个全选的CheckBox
chk的checked等于sender的checked就行了
 

#7


因为你的CheckBox每行都有一个的,因此你应当这样取
foreach (GridViewRow gvr in GridView1.Rows) { 
CheckBox ch = (CheckBox)gvr.FindControl("itemchk");
}

参见
GridView 实现服务器端和客户端全选的两种方法

#8


试了5楼,6楼的方法,都不能解决。。
感觉7楼的方法应该是正确的,但是在我这边试了,却还是失败的,不知道是什么原因。。
同样的,参考了7楼提供的地址:GridView 实现服务器端和客户端全选的两种方法,复制了里面的代码在本机运行,可以成功运行,但是把Checkbox的事件套用到我的代码里,却又失败的,不知道是什么原因。。。。
7楼提供的示例中用的是自制数据源,而我的代码用的是SqlDataSource,不知道会不会是这个原因,还有待测试

#9


    protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
    {
        foreach (GridViewRow gvr in GridView1.Rows) {  
            CheckBox chk = (CheckBox)gvr.FindControl("itemchk");
            Response.Write(chk.ID.ToString() + " ");
        }
    }

无论是CheckBox chk = (CheckBox)gvr.Cells[6].FindControl("itemchk")
或CheckBox chk = (CheckBox)gvr.FindControl("itemchk")
下面加上response.write的方法测试,可以得到chk的ID值
显示值itemchk itemchk itemchk itemchk itemchk itemchk itemchk itemchk itemchk itemchk 
就是得不到chk的checked值

#10


Response.Write(chk.ID.ToString() + " ");
你打印id,当然是显示 itemchk itemchk itemchk itemchk 了
你打印
Response.Write(chk.Checked.ToString() + " ");呢

另外
EnableViewState="true"加上 
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true" CodeFile="GridView03.aspx.cs" Inherits="GridView03" %>

#11


在foreach里执行bool IsCheck = ((CheckBox)gr.FindControl("itemchk ")).Checked;
也提示:
编译器错误信息: CS0117: “CheckBox”并不包含“Checked”的定义

#12


第一:我试了一下你的代码,没什么问题,点击全选时候没有报错。
第二:你的全选实现的是把当前的Checked置成当前相反的,如果全选不选而数据有一行选择,那么点击全选时候。这行已经选择的会变成不选择,跟你要的正相反

#13


引用 9 楼 jasonpeng2 的回复:
Response.Write(chk.Checked.ToString() + " ");呢
EnableViewState="true"加上


这二个方法刚试,还是不行。。

#14


遍历Gridview
CheckBox ckb = (CheckBox)GridView1.FindControl("itemchk");
ckb.Checked

#15


引用 11 楼 jasonpeng2 的回复:
第一:我试了一下你的代码,没什么问题,点击全选时候没有报错。
第二:你的全选实现的是把当前的Checked置成当前相反的,如果全选不选而数据有一行选择,那么点击全选时候。这行已经选择的会变成不选择,跟你要的正相反

是的。这个代码里的全选框,就是起到反选的作用。。
我的问题是得不到<ItemTemplate>中CheckBox的Checked值,ID倒是可以得到。。
我这里用的win2003系统加vs2005的。

#16


引用 14 楼 wxr0323 的回复:
遍历Gridview
CheckBox ckb = (CheckBox)GridView1.FindControl("itemchk");
ckb.Checked


是这样吗?
        foreach (GridViewRow gr in GridView1.Rows)
        {  
            CheckBox chk = (CheckBox)GridView1.FindControl("itemchk");
            //bool IsCheck = ((CheckBox)gr.FindControl("itemchk ")).Checked;
            if (!chk.Checked)
            {
                chk.Checked = true;
            }
            else
            {
                chk.Checked = false;
            }
        }
如果是这样子的话,运行时不会直接出现错误,但点了全选复选框后,会提示错误:
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

#17


你全选了你的checkbox的id肯定就不是itemchk了,你找出来就只有一个checkbo,当运行到第二行的时候肯定就报错了。因为找不到id为itemchk的checkbox。建议你id写成活的。可以获取数据库里的id作为ID。

#18


引用 17 楼 sosmile 的回复:
你全选了你的checkbox的id肯定就不是itemchk了,你找出来就只有一个checkbo,当运行到第二行的时候肯定就报错了。因为找不到id为itemchk的checkbox。建议你id写成活的。可以获取数据库里的id作为ID。


呵呵,我是新手,刚学了一个多星期,有代码吗?给我参考一下。

#20


引用 19 楼 sosmile 的回复:
参考这个

谢谢。。这个示例就是刚刚7楼提供的那个。。
这个示例在我的机器运行是正常的,但是我参考他的事件,把CheckBox事件套到我的代码里,运行出错。。
客户端使用javascript实现选择的方法我没去试,因为现在主要是想先用服务器端方法来解决。。

#21


引用 20 楼 jasonpeng2 的回复:
引用 19 楼 sosmile 的回复:
参考这个

谢谢。。这个示例就是刚刚7楼提供的那个。。
这个示例在我的机器运行是正常的,但是我参考他的事件,把CheckBox事件套到我的代码里,运行出错。。
客户端使用javascript实现选择的方法我没去试,因为现在主要是想先用服务器端方法来解决。。

建议你还是打断点调试。看看哪块具体出错,然后自己查资料解决。别人帮你解决的永远不如自己独立解决的好。这是我上班前2个月的总结。。。。。。。

#22


再给个例子

对了,昨天在csdn上看到前辈们说:google就是你的老师。

希望帮到你~

GOOD LUCK。

#23


自己测试了好久,终于解决了。。

解决方法: 写出全部命名空间名称。

CheckBox chk = (CheckBox)gr.Cells[6].FindControl("itemchk");
改成:
System.Web.UI.WebControls.CheckBox chk = ( System.Web.UI.WebControls.CheckBox)gr.Cells[6].FindControl("itemchk");

#24


虽然最后是我自己找到了解决的方法,不过还是在此感谢各位热心帮助我的朋友,给我好几个很有帮助的参考示例。。。已经把分给出。谢谢。。

#25


引用 23 楼 jasonpeng2 的回复:
自己测试了好久,终于解决了。。

解决方法:写出全部命名空间名称。

CheckBox chk = (CheckBox)gr.Cells[6].FindControl("itemchk");
改成:
System.Web.UI.WebControls.CheckBox chk = (System.Web.UI.WebControls.CheckBox)gr.Cells[6].Find……

晕。。。原来是没导包~~~~~~~~~~~~~~~~~~~~~

#26


cs文件头部本身就已经有using System.Web.UI.WebControls
但是我不明白,7楼给我的示例中,C#代码和HTML代码放在一起,他也没导包,为什么在我的机子运行却是正常,不会出错。。。但是我自己的代码头部已经有了using System.Web.UI.WebControls,却在定义CheckBox又要再导一次?

同样的,定义HyperLink也要导包才能正常运行。。想不明白。。。

#1


测试用的是sql server 2000中的pubs的authors表。。

#2


出错的位置在:protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
中的
if (!chk.Checked)

#3


恩。。。搞不懂了。。。

#4


恩。。。搞不懂了。。。

#5


引用 2 楼 jasonpeng2 的回复:
出错的位置在:protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
中的
if (!chk.Checked)
你试试用控件的属性定义checked看看?

#6



CheckBox chk = (CheckBox)(gr.Cells[6].FindControl("itemchk"));
试一下
另外 你的方法的sender就是你那个全选的CheckBox
chk的checked等于sender的checked就行了
 

#7


因为你的CheckBox每行都有一个的,因此你应当这样取
foreach (GridViewRow gvr in GridView1.Rows) { 
CheckBox ch = (CheckBox)gvr.FindControl("itemchk");
}

参见
GridView 实现服务器端和客户端全选的两种方法

#8


试了5楼,6楼的方法,都不能解决。。
感觉7楼的方法应该是正确的,但是在我这边试了,却还是失败的,不知道是什么原因。。
同样的,参考了7楼提供的地址:GridView 实现服务器端和客户端全选的两种方法,复制了里面的代码在本机运行,可以成功运行,但是把Checkbox的事件套用到我的代码里,却又失败的,不知道是什么原因。。。。
7楼提供的示例中用的是自制数据源,而我的代码用的是SqlDataSource,不知道会不会是这个原因,还有待测试

#9


    protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
    {
        foreach (GridViewRow gvr in GridView1.Rows) {  
            CheckBox chk = (CheckBox)gvr.FindControl("itemchk");
            Response.Write(chk.ID.ToString() + " ");
        }
    }

无论是CheckBox chk = (CheckBox)gvr.Cells[6].FindControl("itemchk")
或CheckBox chk = (CheckBox)gvr.FindControl("itemchk")
下面加上response.write的方法测试,可以得到chk的ID值
显示值itemchk itemchk itemchk itemchk itemchk itemchk itemchk itemchk itemchk itemchk 
就是得不到chk的checked值

#10


Response.Write(chk.ID.ToString() + " ");
你打印id,当然是显示 itemchk itemchk itemchk itemchk 了
你打印
Response.Write(chk.Checked.ToString() + " ");呢

另外
EnableViewState="true"加上 
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true" CodeFile="GridView03.aspx.cs" Inherits="GridView03" %>

#11


在foreach里执行bool IsCheck = ((CheckBox)gr.FindControl("itemchk ")).Checked;
也提示:
编译器错误信息: CS0117: “CheckBox”并不包含“Checked”的定义

#12


第一:我试了一下你的代码,没什么问题,点击全选时候没有报错。
第二:你的全选实现的是把当前的Checked置成当前相反的,如果全选不选而数据有一行选择,那么点击全选时候。这行已经选择的会变成不选择,跟你要的正相反

#13


引用 9 楼 jasonpeng2 的回复:
Response.Write(chk.Checked.ToString() + " ");呢
EnableViewState="true"加上


这二个方法刚试,还是不行。。

#14


遍历Gridview
CheckBox ckb = (CheckBox)GridView1.FindControl("itemchk");
ckb.Checked

#15


引用 11 楼 jasonpeng2 的回复:
第一:我试了一下你的代码,没什么问题,点击全选时候没有报错。
第二:你的全选实现的是把当前的Checked置成当前相反的,如果全选不选而数据有一行选择,那么点击全选时候。这行已经选择的会变成不选择,跟你要的正相反

是的。这个代码里的全选框,就是起到反选的作用。。
我的问题是得不到<ItemTemplate>中CheckBox的Checked值,ID倒是可以得到。。
我这里用的win2003系统加vs2005的。

#16


引用 14 楼 wxr0323 的回复:
遍历Gridview
CheckBox ckb = (CheckBox)GridView1.FindControl("itemchk");
ckb.Checked


是这样吗?
        foreach (GridViewRow gr in GridView1.Rows)
        {  
            CheckBox chk = (CheckBox)GridView1.FindControl("itemchk");
            //bool IsCheck = ((CheckBox)gr.FindControl("itemchk ")).Checked;
            if (!chk.Checked)
            {
                chk.Checked = true;
            }
            else
            {
                chk.Checked = false;
            }
        }
如果是这样子的话,运行时不会直接出现错误,但点了全选复选框后,会提示错误:
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

#17


你全选了你的checkbox的id肯定就不是itemchk了,你找出来就只有一个checkbo,当运行到第二行的时候肯定就报错了。因为找不到id为itemchk的checkbox。建议你id写成活的。可以获取数据库里的id作为ID。

#18


引用 17 楼 sosmile 的回复:
你全选了你的checkbox的id肯定就不是itemchk了,你找出来就只有一个checkbo,当运行到第二行的时候肯定就报错了。因为找不到id为itemchk的checkbox。建议你id写成活的。可以获取数据库里的id作为ID。


呵呵,我是新手,刚学了一个多星期,有代码吗?给我参考一下。

#19


#20


引用 19 楼 sosmile 的回复:
参考这个

谢谢。。这个示例就是刚刚7楼提供的那个。。
这个示例在我的机器运行是正常的,但是我参考他的事件,把CheckBox事件套到我的代码里,运行出错。。
客户端使用javascript实现选择的方法我没去试,因为现在主要是想先用服务器端方法来解决。。

#21


引用 20 楼 jasonpeng2 的回复:
引用 19 楼 sosmile 的回复:
参考这个

谢谢。。这个示例就是刚刚7楼提供的那个。。
这个示例在我的机器运行是正常的,但是我参考他的事件,把CheckBox事件套到我的代码里,运行出错。。
客户端使用javascript实现选择的方法我没去试,因为现在主要是想先用服务器端方法来解决。。

建议你还是打断点调试。看看哪块具体出错,然后自己查资料解决。别人帮你解决的永远不如自己独立解决的好。这是我上班前2个月的总结。。。。。。。

#22


再给个例子

对了,昨天在csdn上看到前辈们说:google就是你的老师。

希望帮到你~

GOOD LUCK。

#23


自己测试了好久,终于解决了。。

解决方法: 写出全部命名空间名称。

CheckBox chk = (CheckBox)gr.Cells[6].FindControl("itemchk");
改成:
System.Web.UI.WebControls.CheckBox chk = ( System.Web.UI.WebControls.CheckBox)gr.Cells[6].FindControl("itemchk");

#24


虽然最后是我自己找到了解决的方法,不过还是在此感谢各位热心帮助我的朋友,给我好几个很有帮助的参考示例。。。已经把分给出。谢谢。。

#25


引用 23 楼 jasonpeng2 的回复:
自己测试了好久,终于解决了。。

解决方法:写出全部命名空间名称。

CheckBox chk = (CheckBox)gr.Cells[6].FindControl("itemchk");
改成:
System.Web.UI.WebControls.CheckBox chk = (System.Web.UI.WebControls.CheckBox)gr.Cells[6].Find……

晕。。。原来是没导包~~~~~~~~~~~~~~~~~~~~~

#26


cs文件头部本身就已经有using System.Web.UI.WebControls
但是我不明白,7楼给我的示例中,C#代码和HTML代码放在一起,他也没导包,为什么在我的机子运行却是正常,不会出错。。。但是我自己的代码头部已经有了using System.Web.UI.WebControls,却在定义CheckBox又要再导一次?

同样的,定义HyperLink也要导包才能正常运行。。想不明白。。。