老生常谈,GRIDVIEW和CHECKBOX
在gridview中放一个模板列在模板列中放一个checkbox,表示一个字段的状态
该字段表示一个商品是上柜还是撤柜
如果是上柜是,checkbox就是选中状态,反之是没选择
另外如果点击该checkbox,就执行一个事件,如果一个商品是撤柜状态,那么点击选择后,后台执行事件,将该商品上柜
该怎么做
谢谢 --------------------编程问答-------------------- 在rowcommand事件里写方法,根据EventArgs传过来的参数获得本行的datakey,
用e.Row.FindControl("checkbox的id")找到你的复选框! --------------------编程问答-------------------- 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 )
{
//...
} --------------------编程问答--------------------
这种方法没法确定要上柜商品的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"); --------------------编程问答--------------------
老兄,这种方式会对所有的打钩的都进行操作,我要的是只对刚打勾的一个进行操作 --------------------编程问答-------------------- 还有一种,把当前页所有数据的状态和编号转成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 = "撤柜";
}
}
你这个方法,只是把根据表中的字段,将checkbox设置成相应的选上和不选上,并没有解决checkbox单击后,改变对应字段内容的问题 --------------------编程问答-------------------- 在gridview中放一个模板列
在模板列中放一个checkbox,表示一个字段的状态
该字段表示一个商品是上柜还是撤柜
如果是上柜是,checkbox就是选中状态,反之是没选择
这个可以用3元表达式:
<asp:CheckBox... checked='(bool)Eval("数据库中的上柜还是撤柜字段")?true:false' />
--------------------编程问答-------------------- 写错
<asp:CheckBox... checked='<%# (bool)Eval("数据库中的上柜还是撤柜字段")?true:false %>' />
应该是这样的,我没编译器.不能试,楼主自己调试下.
--------------------编程问答--------------------
老兄这种方法,还是把每条记录都处理了一遍,我要的只是处理一条,每条都处理效率太低了
我要的就是这样,如果原来是下柜状态,然后单击打上勾,那么我就执行
update goods set state = 1 where goodsId = @goodsid
如果原来有勾,单击去掉,我就执行
update goods set state = 0 where goodsId = @goodsid --------------------编程问答--------------------
你仔细观察一下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