DataGrid和其模板列Checkbox都是动态生成的,代码如下:private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
//Label1.Text=Request.Form["username"].ToString(); //try
{
if (!IsPostBack)
{
OleDbConnection AccessConn=new OleDbConnection(ConfigurationSettings.AppSettings["AccessConn"].ToString()); string sql="select id,username,target,target_id from users where users.username='" + Request.Form["username"].ToString() + "' order by target_id"; OleDbCommand Cmd=new OleDbCommand(sql,AccessConn);
OleDbDataAdapter adp=new OleDbDataAdapter(Cmd);
DataSet ds=new DataSet();
adp.Fill(ds,"d"); //OleDbCommand Sql2=new OleDbCommand("select * from test2",AccessConn);
//OleDbDataAdapter adp2=new OleDbDataAdapter(Sql2);
//adp2.Fill(ds,"d"); DataGrid DG=new DataGrid();
DG.BackColor=Color.LightGoldenrodYellow;
DG.CellPadding=2;
DG.ForeColor=Color.Black;
DG.BorderColor=Color.Tan;
DG.HeaderStyle.BackColor=Color.Tan;
DG.HeaderStyle.ForeColor=Color.Black;
DG.HeaderStyle.Font.Bold=true;
DG.AlternatingItemStyle.BackColor=Color.PaleGoldenrod;
DG.AutoGenerateColumns=false;
DG.DataSource=ds.Tables["d"];
DG.DataKeyField="ID"; TemplateColumn tm=new TemplateColumn();
tm.ItemTemplate=new ColumnTemplate1();
tm.HeaderText="Choose the Targets to Bench";
DG.Columns.Add(tm); //DG.ItemDataBound+= new System.Web.UI.WebControls.DataGridItemEventHandler(DG_ItemDataBound);
DG.DataBind(); Panel1.Controls.Add(DG);

} } //catch(Exception ee)
//{
// this.Response.Write("<script language=\"javascript\">alert(\""+"Error:\\n"+ee.Message+"\")</script>" );
//}
}public class ColumnTemplate1 : ITemplate
{
//第一个模板列
public void InstantiateIn(Control container)
{
//LiteralControl l = new LiteralControl();
//l.DataBinding += new EventHandler(this.OnDataBinding); //数据绑定
//container.Controls.Add(l);CheckBox c=new CheckBox();
c.DataBinding+=new EventHandler(this.OnDataBinding);
container.Controls.Add(c);
//为模板列加入LiteralControl
} public void OnDataBinding(object sender, EventArgs e)
{
CheckBox c=(CheckBox) sender;
DataGridItem container=(DataGridItem) c.NamingContainer;
c.Text = ((DataRowView)container.DataItem)["target"].ToString();//绑定stuname字段
}
}
问题是如何在一个按钮按下的时候取得多个Checkbox的值?解决现给分!

解决方案 »

  1.   

    http://singlepine.cnblogs.com/articles/266538.htmlusing System.Data.SqlClient;
    using System.Text;private void btndelete_Click(object sender, System.EventArgs e)
    {
                StringBuilder s=new StringBuilder();
                foreach(DataGridItem di in DataGrid1.Items) 
                { 
                     if(((CheckBox)(di.FindControl("chkExport"))).Checked==true) 
                     { 
                      s.Append(",").Append(DataGrid1.DataKeys[di.ItemIndex].ToString());
                     } 
                } 
                if(s.ToString().StartsWith(",")==true)
                {
                    delete(s.ToString().Substring(1,s.ToString().Length-1));
                }
    }
    private void delete(string id)
    {
                SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
                string sql=@"declare @sql nvarchar(400)
                            set @sql = 'delete from testgrid where UserID in('+@UserID+')'
                            exec( @sql)";
                SqlCommand comm=new SqlCommand(sql,conn);
                SqlParameter parm1=new SqlParameter("@UserID",SqlDbType.VarChar,200);
                parm1.Value=id;
                comm.Parameters.Add(parm1);
                conn.Open();
                comm.ExecuteNonQuery();
                conn.Close();
                DataBind();
    }
      

  2.   

    谢谢小山!不过问题就出在这里:因为Datagrid控件是自动生成的,所以编译的时候报错"找不到类型或命名空间名称“DG”(是否缺少 using 指令或程序集引用?)"曾经看过一篇文章说是自动生成控件不能放在Page_Load中间,我担心是不是因为控件并未被系统所识别;但是我将自动生成空间代码放在OnInit中,结果一样也不识别不了DG.为什么??
      

  3.   

    CheckBox cb=(CheckBox)dg.Items[i].FindControl("mycheck");
    这样就能访问啦
      

  4.   

    To handsome0916,还是一样的问题啊,DG找不到
      

  5.   

    把DataGrid DG=new DataGrid();定义到Page_Load外面呢

    protected System.Web.UI.WebControls.DataGrid DG;
    private void Page_Load(object sender, System.EventArgs e)
    {
         //DataGrid DG=new DataGrid();
         DG.BackColor=Color.LightGoldenrodYellow;
         DG.CellPadding=2;
        //.....其他代码
    }
      

  6.   

    谢谢! 现在DG可以找到了,但我这里情况有些特殊:Checkbox c是在一个模板列的类里产生的,在遍历的时候c还是没法找到. 试着仿照以上的方法把CheckBox c=new CheckBox();也放在外面,出错:"“PES_CR.bonus_CompleteBenck.c”表示“字段”,此处应为“类”"我是学asp.net不久,请多指教!!
      

  7.   

    问题归根结底就是:
    动态产生DataGrid,动态产生一个模板列(内置CheckBox),且模板列用类产生,类里面CheckBox的名称统一为c现在要在提交的时候提取c的值.不管是用findControl,还是DataGrid遍历,要么出错"未将对象引用设置到对象的实例",要么就在遍历的时候完全忽略foreach (Control di in DG.Controls)这一句,就跟没放这句话一样.百思不得其解,请高手指点迷津!!
      

  8.   

    应该是服务器端控件还是客户端控件吧,你动态生成时,定义是用的服务器端的话,名字会自动被改掉的,试试客户端用Response来取吧
      

  9.   

    是不是DATAGRID把每一列都当作值来取呢?虽然显示的是CHECKBOX,但实际上是列,用TABLE的取法?