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的值?解决现给分!
{
// 在此处放置用户代码以初始化页面
//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的值?解决现给分!
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();
}
这样就能访问啦
如
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;
//.....其他代码
}
动态产生DataGrid,动态产生一个模板列(内置CheckBox),且模板列用类产生,类里面CheckBox的名称统一为c现在要在提交的时候提取c的值.不管是用findControl,还是DataGrid遍历,要么出错"未将对象引用设置到对象的实例",要么就在遍历的时候完全忽略foreach (Control di in DG.Controls)这一句,就跟没放这句话一样.百思不得其解,请高手指点迷津!!