我在GridView的最后一列用TemplateField加了CheckBox,在页面上加按钮,执行被选中的行,例如:删除,如何能得到被选中行的DataKey值,或key所在列的值允许CheckBox多选请给点代码或思路

解决方案 »

  1.   

    将DataKey的值与CheckBox关联,比如将DataKey的值作为CheckBox的值.在提交后,遍历所有的CheckBox的状态,判断是否被选中,然后找出所有DataKey的值
      

  2.   

    做一个隐藏域 每次选择checkbox的时候就自动对隐藏域的值进行操作,最后对隐藏域中的进行操作就好了
      

  3.   

    function F_click_checkbox(IdValue){
     var strPageChed;
     strPageChed = document.res_usr_reg_form.pageChecked.value;  
     if(strPageChed.search("'"+IdValue+"'")!=-1){
      strPageChed = strPageChed.replace(",'" + IdValue + "'" , "");
     }else {
      strPageChed = strPageChed + ",'" + IdValue + "'" + "";
     }
    document.form1.pageChecked.value = strPageChed; 
    }
    吧这个函数添加到checkbox的onclick事件里。
    参数idvalue是checkbox的id。
    点击的同时就会把这个checkbox的id添加到字符串里。
    生成的字符串格式为'','checkbox01','checkbox02','checkbox03','checkbox04'
    然后再把这个字符串作为hidden在提交的时候再页面间传递。
    最后在动态生成纪录的时候,用这个字符串验证一下,是否处于被点击过的状态就行了。用这种格式生成字符串的好处是,可以方便的添加在sql语句里面。
    比如:
    select id,name from table1
    用此语句生成用来显示的记录。那么就可以用这个字符串生成一个带checkbox状态的表。如下:
    select checkedtable.id as checkedbox,a.id,a.name from table1 
    left outer join 
    (select id from table1 where id in (string)) as checkedtable --- string为上面生成的字符串
    on table1.id=checkedtable.id
    这样你就生成一个前面带一列checkbox状态的表了。
      

  4.   

    打错了,上面的table1应该 as 成 a。
    select checkedtable.id as checkedbox,a.id,a.name from table1  as a
    left outer join 
    (select id from table1 where id in (string)) as checkedtable --- string为上面生成的字符串
    on table1.id=checkedtable.id
      

  5.   

    给GridView关联上数据源的主键(就是把GridView的属性里的DataKeyNames关联上数据源的主键字段)  
      protected void Button1_Click(object sender, EventArgs e)
        {
            string key = "";
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                if (((CheckBox)GridView1.Rows[i].Cells[CheckBox所在的列数].FindControl("CheckBox1")).Checked)
                {
                    key += ",'" + GridView1.DataKeys[GridView1.Rows[i].DataItemIndex].ToString() + "'";
                }
            }然后写delete语句,如delete from A where b in (key)
    具体的就不写了。
        }
      

  6.   

    我的做法是继承CheckBox实现一个CheckBoxWithKey控件,加一个Key属性,该属性通过ViewState保存。同时为GridView的Template中的CheckBox绑定上Key属性,就绑定为一个ID之类的可以作为DataKey的字段。然后PostBack之时你遍历所有的CheckBoxWithKey控件并且检测其Key和Checked属性就可以了。
      

  7.   

    我也找到答案了,Belice(天下无风) 的答案比较符合我的要求,但还需优化
    我的代码:foreach (GridViewRow row in GridView1.Rows)
    {
        CheckBox cb = (CheckBox)row.FindControl("CheckBoxID");
        if (cb.Checked)
        {
            ItemCode = GridView1.DataKeys[row.RowIndex].ToString();
            //......
        }
    }
    代码简洁易懂,谢谢各位!