当前位置:编程学习 > C#/ASP.NET >>

老生常谈,GRIDVIEW和CHECKBOX

在gridview中放一个模板列
在模板列中放一个checkbox,表示一个字段的状态
该字段表示一个商品是上柜还是撤柜
如果是上柜是,checkbox就是选中状态,反之是没选择
另外如果点击该checkbox,就执行一个事件,如果一个商品是撤柜状态,那么点击选择后,后台执行事件,将该商品上柜
该怎么做
谢谢 --------------------编程问答-------------------- 在rowcommand事件里写方法,根据EventArgs传过来的参数获得本行的datakey,
用e.Row.FindControl("checkbox的id")找到你的复选框! --------------------编程问答-------------------- phper2008 ,能说具体点不,rowcommand事件里的e没有Row属性 --------------------编程问答--------------------
引用 2 楼 glm62 的回复:
phper2008 ,能说具体点不,rowcommand事件里的e没有Row属性

那就 GridView1.Rows[e.RowIndex].FindControl --------------------编程问答--------------------
引用 3 楼 phper2008 的回复:
引用 2 楼 glm62 的回复:
phper2008 ,能说具体点不,rowcommand事件里的e没有Row属性 
 
那就 GridView1.Rows[e.RowIndex].FindControl

e也没有RowIndex --------------------编程问答-------------------- 呵呵

Up --------------------编程问答-------------------- 先遍历,然后再FindControl --------------------编程问答-------------------- 在GridView控件的RowDataBound事件中来写


CheckBox chk=e.Row.FindControl("checkbox的id") as CheckBox; // 找到你的复选框!
注册事件处理
chk.CheckedChanged+=new EventHandler(chk_CheckedChanged);

//处理checkbox控件改变事件
protected void chk_CheckedChanged(object sender,EventArgs e )
{
 //...
} --------------------编程问答--------------------
引用 7 楼 zhanglei5415 的回复:
在GridView控件的RowDataBound事件中来写 

用 
CheckBox chk=e.Row.FindControl("checkbox的id") as CheckBox; // 找到你的复选框! 
注册事件处理 
chk.CheckedChanged+=new EventHandler(chk_CheckedChanged); 

//处理checkbox控件改变事件 
protected void chk_CheckedChanged(object sender,EventArgs e ) 

//... 
}

这种方法没法确定要上柜商品的ID --------------------编程问答-------------------- 那你就首先遍历整个GridView 
foreach (GridViewRow li in GridView1.Rows)
{
 CheckBox cb = (CheckBox)li.Cells[checkbox的列数].FindControl("checkbox的id");
 if (cb != null && cb .Checked)
     {
   string strid= li.Cells[商品id的列数].Text;
这里面对gridview中打勾的上柜商品的操作
     }
else
{checkbox没有打勾的商品的操作
}
}

--------------------编程问答-------------------- 对了checkbox也可以这样找
CheckBox cb = (CheckBox)li.FindControl("checkbox的id"); --------------------编程问答--------------------
引用 9 楼 kushuang333 的回复:
那你就首先遍历整个GridView 
foreach (GridViewRow li in GridView1.Rows) 

CheckBox cb = (CheckBox)li.Cells[checkbox的列数].FindControl("checkbox的id"); 
if (cb != null && cb .Checked) 
    { 
  string strid= li.Cells[商品id的列数].Text; 
这里面对gridview中打勾的上柜商品的操作 
    } 
else 
{checkbox没有打勾的商品的操作 



老兄,这种方式会对所有的打钩的都进行操作,我要的是只对刚打勾的一个进行操作 --------------------编程问答-------------------- 还有一种,把当前页所有数据的状态和编号转成js数组,在客户端直接用js搜索这个checkbox然后选上。

也就是绕过asp.net直接用js完成你要的东西。这个服务器省事,作起来也省事,毕竟这种工作ASP时代常用的。 --------------------编程问答--------------------
引用 12 楼 oyiboy 的回复:
还有一种,把当前页所有数据的状态和编号转成js数组,在客户端直接用js搜索这个checkbox然后选上。 

也就是绕过asp.net直接用js完成你要的东西。这个服务器省事,作起来也省事,毕竟这种工作ASP时代常用的。

因为要操作数据库,用js不行,除非用ajax. --------------------编程问答-------------------- js --------------------编程问答-------------------- 1:首先你的checkBox的AutoPostBack这个属性得设成TRUE
2:从数据库中取数据绑定到Gridview当中 用手动绑定的方法  查询出一个泛型集合 this.GridView1.dataSource=list 这种方法绑定
3:在绑定前 做个循环判断  得到你数据库 上柜 撤柜那个字段 对这个字段进行判断
如果是上柜的话 那么 再用 this.GridView1.Rows[index].cells[index].findControls("checkBoxId") 找到你放在界面上的那个checkBox  然后把它的checked 属性设为true
这样 应该就OK了 --------------------编程问答-------------------- 在GridView的RowDataBound事件里面对CheckBox的选中状态进行处理。
在CheckBox的CheckedChanged事件里通过获取行索引来操作,得到行索引后,就可以取得该行其他列的值,比如字段ID之类的,方便更新数据库。

GridView:
        <asp:TemplateField HeaderText="选择">
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chk" Text="状态" OnCheckedChanged="chk_CheckedChanged1" AutoPostBack="true" />
            </ItemTemplate>
        </asp:TemplateField>
       <asp:BoundField DataField="status" HeaderText="状态" />

CS Code:
        protected void Gridview1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (e.Row.Cells[1].Text.Trim() == "上柜")
                {
                    CheckBox chk = (CheckBox)e.Row.Cells[0].FindControl("chk");
                    chk.Checked = true;
                }
            }
        }

        protected void chk_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox chk = sender as CheckBox;
            int index = ((GridViewRow)(chk.NamingContainer)).RowIndex;//取得选中行索引
            string status = Gridview1.Rows[index].Cells[1].Text;//取得状态(上柜或撤柜)
            if (chk.Checked == true)
            {
                //选中的时候做的处理
                Gridview1.Rows[Convert.ToInt32(TextBox1.Text)].Cells[1].Text = "上柜";
            }
            else if (chk.Checked == false)
            {
                //取消选中的时候做的处理
                Gridview1.Rows[Convert.ToInt32(TextBox1.Text)].Cells[1].Text = "撤柜";
            }
        }
--------------------编程问答--------------------
引用 15 楼 rascalwm 的回复:
1:首先你的checkBox的AutoPostBack这个属性得设成TRUE 
2:从数据库中取数据绑定到Gridview当中 用手动绑定的方法  查询出一个泛型集合 this.GridView1.dataSource=list 这种方法绑定 
3:在绑定前 做个循环判断  得到你数据库 上柜 撤柜那个字段 对这个字段进行判断 
如果是上柜的话 那么 再用 this.GridView1.Rows[index].cells[index].findControls("checkBoxId") 找到你放在界面上的那个checkBox  然后把它的checked 属性…


你这个方法,只是把根据表中的字段,将checkbox设置成相应的选上和不选上,并没有解决checkbox单击后,改变对应字段内容的问题 --------------------编程问答-------------------- 在gridview中放一个模板列 
在模板列中放一个checkbox,表示一个字段的状态 
该字段表示一个商品是上柜还是撤柜 
如果是上柜是,checkbox就是选中状态,反之是没选择

这个可以用3元表达式:

<asp:CheckBox... checked='(bool)Eval("数据库中的上柜还是撤柜字段")?true:false' />
--------------------编程问答-------------------- 写错

<asp:CheckBox... checked='<%# (bool)Eval("数据库中的上柜还是撤柜字段")?true:false %>' /> 

应该是这样的,我没编译器.不能试,楼主自己调试下.
--------------------编程问答--------------------
引用 16 楼 ww85910 的回复:
在GridView的RowDataBound事件里面对CheckBox的选中状态进行处理。 
在CheckBox的CheckedChanged事件里通过获取行索引来操作,得到行索引后,就可以取得该行其他列的值,比如字段ID之类的,方便更新数据库。 

C# code
GridView:
        <asp:TemplateField HeaderText="选择">
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chk" Text="状态" OnCheckedChanged="chk_CheckedChanged1" …



老兄这种方法,还是把每条记录都处理了一遍,我要的只是处理一条,每条都处理效率太低了
我要的就是这样,如果原来是下柜状态,然后单击打上勾,那么我就执行
update goods set state = 1 where goodsId = @goodsid

如果原来有勾,单击去掉,我就执行
update goods set state = 0 where goodsId = @goodsid --------------------编程问答--------------------
引用 13 楼 glm62 的回复:
引用 12 楼 oyiboy 的回复:
还有一种,把当前页所有数据的状态和编号转成js数组,在客户端直接用js搜索这个checkbox然后选上。 

也就是绕过asp.net直接用js完成你要的东西。这个服务器省事,作起来也省事,毕竟这种工作ASP时代常用的。 
 
因为要操作数据库,用js不行,除非用ajax.


你仔细观察一下linkbutton的html代码,href部份。

你可以作一个linkbutton然后用css的display:none给隐藏掉,然后在checkbox上加个onclick="location.href=document.getElementById('linkbuttonName').href"就可以激活这个linkbutton绑定的事件了。

如果你想在按时判断按的是哪个checkbox可以加一个<input type="hidden" name="checkboxid"  id="checkboxid">

在click checkbox时把这个checkboxid设置上一个标记,然后再用上面说的方法激活linkbutton指定的事件。在这个事件里处理你要处理的东西就是了。

不知这样说明白不? --------------------编程问答-------------------- 忘了,如果是批量也可以直接用checkbox来作标记,比如:
<input type="checkbox" name="selectid" value="id">
用js作一个全选checkbox的功能,就可以实现一次选择所有记录了。
然后用request["selectid"]收集所有选上的值。这个是在Asp时代就用到的小技巧了。

--------------------编程问答-------------------- 代码写得越多将来维护、改变时越乱。你可以只写很少的几行代码就OK了。

首先,在GridView中设计列,假设绑定到GRidView上的数据有“商品编码、是否上柜”两列数据:

<ItemTemplate>
   <asp:CheckBox ID="chk" runat="server" 商品='<%# Eval("商品编码") %>' OnCheckedChanged="chk_CheckedChanged" Checked='<%# Eval("是否上柜") %>' />
</ItemTemplate>


这就设计完成了界面。在后台代码中写:


private bool 需要重新绑定=false;

protected void chk_CheckedChanged(object sender, EventArgs e)
{
    CheckBox chk = (CheckBox)sender;
    string merch=chk.Attributes["商品编码"];
    if(chk.Checked)
        上柜(merch);
    else
        撤柜(merch);
    需要重新绑定=true;
}

void Page_PreRender(object sender, EventArgs e)
{
    GridView1.DataBind();  //或者换为你的绑定GridView代码
}


实际上,只要修改了几个CheckBox,然后点击页面上的一个按钮,例如
<asp:Button ID="Button1" runat="server" Text="好" />
引起回发,或者如楼上有人说的为这个CheckBox设计时加上AutoPostback=True,之后这个CheckBox就在自己的 CheckedChanged 事件处理程序中执行上柜、撤柜的全过程操作了,用不着使用什么FindControl再跑到GridView中去寻找什么东西。 --------------------编程问答-------------------- 请将上面程序中的

string merch=chk.Attributes["商品编码"];

改为:

string merch=chk.Attributes["商品"];



因为我手写的界面设定中是增加的“商品”这个Attribute。
--------------------编程问答-------------------- 呵呵,又发现写代码时丢了一个判断,应该是:

void Page_PreRender(object sender, EventArgs e)
{
    if(需要重新绑定)
          GridView1.DataBind();  //或者换为你的绑定GridView代码
}
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,