请高手解答。。
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 />
</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)
中的
if (!chk.Checked)
#3
恩。。。搞不懂了。。。
#4
恩。。。搞不懂了。。。
#5
你试试用控件的属性定义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 实现服务器端和客户端全选的两种方法
foreach (GridViewRow gvr in GridView1.Rows) {
CheckBox ch = (CheckBox)gvr.FindControl("itemchk");
}
参见
GridView 实现服务器端和客户端全选的两种方法
#8
试了5楼,6楼的方法,都不能解决。。
感觉7楼的方法应该是正确的,但是在我这边试了,却还是失败的,不知道是什么原因。。
同样的,参考了7楼提供的地址:GridView 实现服务器端和客户端全选的两种方法,复制了里面的代码在本机运行,可以成功运行,但是把Checkbox的事件套用到我的代码里,却又失败的,不知道是什么原因。。。。
7楼提供的示例中用的是自制数据源,而我的代码用的是SqlDataSource,不知道会不会是这个原因,还有待测试
感觉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值
{
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" %>
你打印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”的定义
也提示:
编译器错误信息: CS0117: “CheckBox”并不包含“Checked”的定义
#12
第一:我试了一下你的代码,没什么问题,点击全选时候没有报错。
第二:你的全选实现的是把当前的Checked置成当前相反的,如果全选不选而数据有一行选择,那么点击全选时候。这行已经选择的会变成不选择,跟你要的正相反
第二:你的全选实现的是把当前的Checked置成当前相反的,如果全选不选而数据有一行选择,那么点击全选时候。这行已经选择的会变成不选择,跟你要的正相反
#13
这二个方法刚试,还是不行。。
#14
遍历Gridview
CheckBox ckb = (CheckBox)GridView1.FindControl("itemchk");
ckb.Checked
CheckBox ckb = (CheckBox)GridView1.FindControl("itemchk");
ckb.Checked
#15
是的。这个代码里的全选框,就是起到反选的作用。。
我的问题是得不到<ItemTemplate>中CheckBox的Checked值,ID倒是可以得到。。
我这里用的win2003系统加vs2005的。
#16
是这样吗?
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
呵呵,我是新手,刚学了一个多星期,有代码吗?给我参考一下。
#20
谢谢。。这个示例就是刚刚7楼提供的那个。。
这个示例在我的机器运行是正常的,但是我参考他的事件,把CheckBox事件套到我的代码里,运行出错。。
客户端使用javascript实现选择的方法我没去试,因为现在主要是想先用服务器端方法来解决。。
#21
建议你还是打断点调试。看看哪块具体出错,然后自己查资料解决。别人帮你解决的永远不如自己独立解决的好。这是我上班前2个月的总结。。。。。。。
#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");
解决方法: 写出全部命名空间名称。
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
晕。。。原来是没导包~~~~~~~~~~~~~~~~~~~~~
#26
cs文件头部本身就已经有using System.Web.UI.WebControls
但是我不明白,7楼给我的示例中,C#代码和HTML代码放在一起,他也没导包,为什么在我的机子运行却是正常,不会出错。。。但是我自己的代码头部已经有了using System.Web.UI.WebControls,却在定义CheckBox又要再导一次?
同样的,定义HyperLink也要导包才能正常运行。。想不明白。。。
但是我不明白,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)
中的
if (!chk.Checked)
#3
恩。。。搞不懂了。。。
#4
恩。。。搞不懂了。。。
#5
你试试用控件的属性定义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 实现服务器端和客户端全选的两种方法
foreach (GridViewRow gvr in GridView1.Rows) {
CheckBox ch = (CheckBox)gvr.FindControl("itemchk");
}
参见
GridView 实现服务器端和客户端全选的两种方法
#8
试了5楼,6楼的方法,都不能解决。。
感觉7楼的方法应该是正确的,但是在我这边试了,却还是失败的,不知道是什么原因。。
同样的,参考了7楼提供的地址:GridView 实现服务器端和客户端全选的两种方法,复制了里面的代码在本机运行,可以成功运行,但是把Checkbox的事件套用到我的代码里,却又失败的,不知道是什么原因。。。。
7楼提供的示例中用的是自制数据源,而我的代码用的是SqlDataSource,不知道会不会是这个原因,还有待测试
感觉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值
{
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" %>
你打印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”的定义
也提示:
编译器错误信息: CS0117: “CheckBox”并不包含“Checked”的定义
#12
第一:我试了一下你的代码,没什么问题,点击全选时候没有报错。
第二:你的全选实现的是把当前的Checked置成当前相反的,如果全选不选而数据有一行选择,那么点击全选时候。这行已经选择的会变成不选择,跟你要的正相反
第二:你的全选实现的是把当前的Checked置成当前相反的,如果全选不选而数据有一行选择,那么点击全选时候。这行已经选择的会变成不选择,跟你要的正相反
#13
这二个方法刚试,还是不行。。
#14
遍历Gridview
CheckBox ckb = (CheckBox)GridView1.FindControl("itemchk");
ckb.Checked
CheckBox ckb = (CheckBox)GridView1.FindControl("itemchk");
ckb.Checked
#15
是的。这个代码里的全选框,就是起到反选的作用。。
我的问题是得不到<ItemTemplate>中CheckBox的Checked值,ID倒是可以得到。。
我这里用的win2003系统加vs2005的。
#16
是这样吗?
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
呵呵,我是新手,刚学了一个多星期,有代码吗?给我参考一下。
#19
#20
谢谢。。这个示例就是刚刚7楼提供的那个。。
这个示例在我的机器运行是正常的,但是我参考他的事件,把CheckBox事件套到我的代码里,运行出错。。
客户端使用javascript实现选择的方法我没去试,因为现在主要是想先用服务器端方法来解决。。
#21
建议你还是打断点调试。看看哪块具体出错,然后自己查资料解决。别人帮你解决的永远不如自己独立解决的好。这是我上班前2个月的总结。。。。。。。
#22
#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");
解决方法: 写出全部命名空间名称。
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
晕。。。原来是没导包~~~~~~~~~~~~~~~~~~~~~
#26
cs文件头部本身就已经有using System.Web.UI.WebControls
但是我不明白,7楼给我的示例中,C#代码和HTML代码放在一起,他也没导包,为什么在我的机子运行却是正常,不会出错。。。但是我自己的代码头部已经有了using System.Web.UI.WebControls,却在定义CheckBox又要再导一次?
同样的,定义HyperLink也要导包才能正常运行。。想不明白。。。
但是我不明白,7楼给我的示例中,C#代码和HTML代码放在一起,他也没导包,为什么在我的机子运行却是正常,不会出错。。。但是我自己的代码头部已经有了using System.Web.UI.WebControls,却在定义CheckBox又要再导一次?
同样的,定义HyperLink也要导包才能正常运行。。想不明白。。。