.NET 动态控件(标签、文本框和下拉列表)创建






4.73/5 (10投票s)
.NET 动态控件创建
目录
引言
在介绍动态控件之前,我想先说明控件在页面上的工作方式。起初我一直疑惑控件如何在回发后仍然保留在页面上。
答案就在这里...
每次我们运行页面时,它都会被发布到服务器,并且每次都会创建一个新的网页实例,这意味着页面和页面上的控件会在每次往返中丢失。ASP.NET 使用 viewstate解决了这个问题,viewstate是页面的一个默认属性。当我们把页面的 viewstate 设置为 true 时,viewstate 属性会提供一个 dictionary 对象,用于在同一页面的多个往返之间保留值。这意味着在页面加载结束之前,控件将被保留在页面上,并且在页面加载之后,我们将能够看到这些控件。
什么是动态控件
现在让我们来谈谈“动态”这个概念。动态控件不是 aspx 页面上框架解析的控件,而是通过触发另一个控件的事件来进行页面回发创建的控件。例如,在按钮点击事件中创建一个 textbox。
但是,更好地理解是页面上的所有控件实际上在页面生命周期的某个阶段都是动态的。
这里要记住的一点是,当我们在任何事件中创建一个控件,并且希望在任何其他操作中保留它们时,我们应该在页面的每次回发中创建它们。
动态控件示例
正如前面所讨论的,我们可以在任何事件中创建一个控件。在这里,我们将使用一个 listbox,并在它的 SelectedIndexChanged 事件中创建一个控件。
在深入了解之前,让我们先看一下数据库设计,这样可以清楚地了解我们要做什么以及如何进行。
请下载并在 SQL Server 中还原数据库。
可以在 此链接 找到还原步骤。
现在,让我详细说明一下。在页面加载时,我填充 listbox。我将 MASTERDATATABLELIST 表绑定到 Listbox,其中 listbox 的 DataTextField 是表描述 (TABLENAMEDESC),Datavalue 字段是 FILTERQUERY。(该字段包含 SQL 查询 select 语句。)
示例
| TABLENAMEDESC | FILTERQUERY | 
| ROLES | SELECT Role "Role Description" , RoleID "Role Code" FROM AllRoles | 
public void BindListControl()
{
       string connectionStr = System.Configuration.ConfigurationManager.ConnectionStrings
				["ConnectionString"].ToString();
        SqlHelpe dataaccessHelper = new SqlHelpe(connectionStr);
         DataSet dataSet = new DataSet();
         string Mainquery = ViewState["MainQuery"].ToString();
        // View state is used here as per my requirement but recommended to avoid here
         dataSet = dataaccessHelper.ExecuteSelectQuery(Mainquery);
         lstTables.DataSource = dataSet.Tables[0];
         lstTables.DataTextField = "TABLENAMEDESC";
         lstTables.DataValueField = "FILTERQUERY";
         lstTables.DataBind();
}
现在让我们看看动态控件的创建。我们将根据 select 查询中的字段创建控件,并且它会随着查询在选择中的更改而改变。我们将使用相同的控件字段作为过滤器参数来检索数据。
屏幕设计

现在让我们考虑 listbox 数据“COUNTRY”的 SelectedIndexChanged 事件上的 select 查询。
 
 
根据查询,占位符将是数据表,并且数据表的每个单元格将包含 Label 和 Textbox。
 
 
创建动态文本框和标签的代码如下
double rCount = Math.Ceiling(((double)columnCount / 4));
                int k = 0, rowsCount;
                rowsCount = (int)rCount;
                Table table = new Table();
                table.ID = "Table1";
                PlaceHolder1.Controls.Add(table);
                for (int i = 0; i < rowsCount; i++)
                {
                    int kC = 0;
                    TableRow row = new TableRow();
                    for (int j = 0; j < 4; j++)
                    {
                        TableCell cell = new TableCell();
                        Label lbl = new Label();
                        lbl.CssClass = "captions";
                        lbl.Width = 130;
                        lbl.ID = "Lable_" + i + "Col_" + j;
                        lbl.Text = StringArry[k, kC + 1].ToString();
                        TextBox tb = new TextBox();
                        tb.ID = StringArry[k, kC];
                        tb.Attributes.Add("EventHandler", "TextChanged");
                        // Add the control to the TableCell
                        cell.Controls.Add(lbl);
                        cell.Controls.Add(tb);
                        // Add the TableCell to the TableRow
                        row.Cells.Add(cell);
                        k = k + 1;
                        if (i * 4 + j == (columnCount - 1))
                        {
                            break;
                        }
                    }
                    // Add the TableRow to the Table
                    table.Rows.Add(row);
                }
            }
但现在的问题是,如果查询包含许多字段怎么办?嗯,我们可以显示,但我们会失去页面的美观。我甚至想介绍如何在页面上绑定 dropdown。
因此,如果查询包含超过 8 个字段,那么我们将看到 dropdown 而不是 textbox。所以我们将显示以下查询:
 
 

现在,我们将使用控件添加参数并传递到 where 条件中,以在加载按钮点击时获取数据(见下文)
 
 
创建动态下拉列表的代码如下
double rCount = 2; Math.Ceiling(((double)columnCount / 3));
int k = 0, rowsCount;
rowsCount = (int)rCount;
Table table = new Table();
table.ID = "Table1";
PlaceHolder1.Controls.Add(table);
for (int i = 0; i < rowsCount; i++)
{
    int kC = 0;
    TableRow row = new TableRow();
    for (int j = 0; j < 3; j++)
    {
        TableCell cell = new TableCell();
        Label lbl = new Label();
        lbl.Width = 25;
 
        lbl.Text = "  ";
        DropDownList ddlist = new DropDownList();
        ddlist.Attributes.Add("EventHandler", "SelectedIndexChanged");
        ddlist.CssClass = "DropDownText";
        ddlist.ID = "ddl_" + k;
        ddlist.DataSource = dtStringArry;
        ddlist.DataTextField = dtStringArry.Columns["Col2"].ToString();
        ddlist.DataValueField = dtStringArry.Columns["Col1"].ToString();
        ddlist.DataBind();
        ddlist.Items.Insert(0, new ListItem("-SELECT-", "SELECT"));
        ddlist.SelectedIndex = 0;
        TextBox tb = new TextBox();
        tb.ID = "txt_" + k;
        tb.Attributes.Add("EventHandler", "TextChanged");
        cell.Controls.Add(ddlist);
        cell.Controls.Add(lbl);
        cell.Controls.Add(tb);
        row.Cells.Add(cell);
        k = k + 1;
        if (i * 3 + j == (columnCount - 1))
        {
            break;
        }
    }
    // Add the TableRow to the Table
    table.Rows.Add(row);
}
读取 textbox 控件数据
TextBox tb = (TextBox)PlaceHolder1.FindControl(controlArrry[i, 0]);
 if (!String.IsNullOrEmpty(tb.Text))
 {
	string name1 = null;
	string strValue = tb.Text.ToString();
	name1 = tb.ID + " Like " + "'%" + tb.Text.Trim() + "%'" + " OR ";
	whereQuery += name1;
 }
读取 dropdown 控件数据
DropDownList ddl = (DropDownList)PlaceHolder1.FindControl("ddl_" + i);
if (!String.IsNullOrEmpty(ddl.SelectedValue) && ddl.SelectedValue != "SELECT")
{
	TextBox tb = (TextBox)PlaceHolder1.FindControl("txt_" + i);
	if (!String.IsNullOrEmpty(tb.Text))
	{
	 string name1 = null;
	 string strValue = tb.Text.ToString();
	 name1 = ddl.SelectedValue + " Like " + "'%" + tb.Text.Trim() + "%'" + " OR ";
	 whereQuery += name1;
	}
}
历史
- 2011年6月26日:初始版本
- 2011年6月29日:上传源代码
- 2011年7月2日:更新图片


