前两天写了个模块,需要从数据库读出数据在根据数据动态生成WEB控件。因为以前没写过,所以遇到一个问题,调了很久才调通。原来动态生成控件每次刷新页面都得在Page_Load()方法里面重现(生成控件代码不能写在if(!PageIsPost){}里面),不然在其他地方拿不到生成控件的值。用FindControls方法取控件值会抛出控异常。
下面是Page_Load()事件里面的部分代码:
下面是按钮事件里取控件值:
下面是Page_Load()事件里面的部分代码:
SqlConnection conn = new SqlConnection(txtSqlConn.Text);
SqlDataAdapter da = new SqlDataAdapter("select top 1 * from (" + txtSelect.Text + ") t1", conn);
try
{
conn.Open();
DataSet ds = new DataSet();
da.Fill(ds, "InfoTable");
Table tb = new Table();//创建一个表格
tb.BorderWidth = Unit.Parse("0");
tb.Width = Unit.Parse("100%");
for (int i = 0; ds.Tables[0].Columns.Count > i; i++)
{
if (ds.Tables["InfoTable"].Columns[i].DataType.ToString() == "System.Int32")
{
TableRow tr = new TableRow();//创建一行
TableCell cell1 = new TableCell();//创建单元格,也就是第一列
Label lbl = new Label();
lbl.ID = "lblName" + (int.Parse(ViewState["columns"].ToString()) + 1);
lbl.Text = ds.Tables["InfoTable"].Columns[i].ColumnName;
cell1.Controls.Add(lbl);
tr.Cells.Add(cell1);//添加到行中
TableCell cell2 = new TableCell();//创建第二列
DropDownList List = new DropDownList();
List.ID = "List" + (int.Parse(ViewState["columns"].ToString()) + 1);
//List.AutoPostBack = true;
List.Items.Add("无 ");
List.Items.Add("求和");
List.Items.Add("最大值");
List.Items.Add("最小值");
List.Items.Add("平均数");
cell2.Controls.Add(List);
tr.Cells.Add(cell2);
tb.Rows.Add(tr);//添加到表格中
ViewState["columns"] = int.Parse(ViewState["columns"].ToString()) + 1;
}
}
PlaceHolder1.Controls.Add(tb);
}
catch (Exception ex)
{
ErrorInfo.Text = ex.ToString();
}
finally
{
conn.Close();
}
SqlDataAdapter da = new SqlDataAdapter("select top 1 * from (" + txtSelect.Text + ") t1", conn);
try
{
conn.Open();
DataSet ds = new DataSet();
da.Fill(ds, "InfoTable");
Table tb = new Table();//创建一个表格
tb.BorderWidth = Unit.Parse("0");
tb.Width = Unit.Parse("100%");
for (int i = 0; ds.Tables[0].Columns.Count > i; i++)
{
if (ds.Tables["InfoTable"].Columns[i].DataType.ToString() == "System.Int32")
{
TableRow tr = new TableRow();//创建一行
TableCell cell1 = new TableCell();//创建单元格,也就是第一列
Label lbl = new Label();
lbl.ID = "lblName" + (int.Parse(ViewState["columns"].ToString()) + 1);
lbl.Text = ds.Tables["InfoTable"].Columns[i].ColumnName;
cell1.Controls.Add(lbl);
tr.Cells.Add(cell1);//添加到行中
TableCell cell2 = new TableCell();//创建第二列
DropDownList List = new DropDownList();
List.ID = "List" + (int.Parse(ViewState["columns"].ToString()) + 1);
//List.AutoPostBack = true;
List.Items.Add("无 ");
List.Items.Add("求和");
List.Items.Add("最大值");
List.Items.Add("最小值");
List.Items.Add("平均数");
cell2.Controls.Add(List);
tr.Cells.Add(cell2);
tb.Rows.Add(tr);//添加到表格中
ViewState["columns"] = int.Parse(ViewState["columns"].ToString()) + 1;
}
}
PlaceHolder1.Controls.Add(tb);
}
catch (Exception ex)
{
ErrorInfo.Text = ex.ToString();
}
finally
{
conn.Close();
}
下面是按钮事件里取控件值:
string info = "";
for (int i = 0; i < int.Parse(ViewState["columns"].ToString()); i++)
{
Label lbl = (Label)PlaceHolder1.FindControl("lblName" + (i + 1));
DropDownList list = (DropDownList)PlaceHolder1.FindControl("List" + (i + 1));
info += lbl.Text + "," + list.SelectedItem.Text + ";";
}
for (int i = 0; i < int.Parse(ViewState["columns"].ToString()); i++)
{
Label lbl = (Label)PlaceHolder1.FindControl("lblName" + (i + 1));
DropDownList list = (DropDownList)PlaceHolder1.FindControl("List" + (i + 1));
info += lbl.Text + "," + list.SelectedItem.Text + ";";
}