从数据库记录和获取控制数据动态创建C#(ASPX / Web)中的控件

时间:2017-01-03 10:04:57

标签: c# asp.net user-controls dynamic-controls

民间,

在C#中创建动态控件需要一个帮助。 比如,我将ID,Text和所有必需的验证属性放入数据库,并且我需要在ASP WinForm或Web页面中创建一个控件。

请建议我实现相同的视图部分。

这是我的数据库表模板

CREATE TABLE CONTROL(
    PK_CONTROL_ID VARCHAR(128) NOT NULL,
    CONTROL_NAME VARCHAR(128) NOT NULL,
    PRIMARY KEY(CONTROL_ID)
);


CREATE TABLE CONTROLPROPERTY(
    PK_PROPERTY_ID INT NOT NULL IDENTITY(1,1),
    FK_CONTROL_ID INT NOT NULL FOREIGN KEY REFERENCES CONTROLPROPERTY(PK_CONTROL_ID),
    CONTROLPROPERTY VARCHAR(128) NOT NULL,
    CONTROLVALUES VARCHAR(128) NOT NULL,
    PRIMARY KEY(PK_PROP_VALUE_ID)
);


**Example**
PK_CONTROL_ID  CONTROL_NAME
1               TextBox


PK_PROPERTY_ID  FK_CONTROL_ID  CONTROLPROPERTY  CONTROLVALUES
1               1               ID              txtName
2               1               Visible         true
3               1               ToolTip         Name

参考了这个例子,但我需要为不同类型的控制器实现相同的表结构

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="TestControlFirst.index" %>
<%@ Import Namespace="System.Data" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load (object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("ID");
        dt.Columns.Add("Firstname");
        dt.Columns.Add("Lastname");
        for (int i = 0; i < 10; i++)
        {
             DataRow row = dt.NewRow();
            row.ItemArray = new object[] {i,"Joe_"+i.ToString(),"Blow" +i.ToString()};
             dt.Rows.Add(row);
            Repeater1.DataSource = dt;
            Repeater1.DataBind();
        }
     }
}

protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    int rowid = (e.Item.ItemIndex);
    TextBox tb = (TextBox)Repeater1.Items[rowid].FindControl("txtOne");
    Label2.Text = tb.Text;
}
</script>

ASPX页面

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Repeater Demo</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
<asp:Repeater ID="Repeater1" runat="server" onitemcommand="Repeater1_ItemCommand">
<HeaderTemplate>
<table border="1" width="50%">
<tr>
<th>SELECT</th>
<th>ID</th>
<th>FIRST</th>
<th>LAST</th>  
</tr>
</HeaderTemplate>

<ItemTemplate>
<tr>
  <td><asp:Button ID="btnOne" runat="server" Text="SELECT"   /></td>
  <td> <asp:TextBox ID="txtOne" runat="server" Text='<%# Eval("ID") %>' /></td>
<td><%# Eval("Firstname") %></td>
<td><%# Eval("LastName") %></td>

</tr>
</ItemTemplate>

<FooterTemplate>
</table>
</FooterTemplate>
        </asp:Repeater>
    </div>
    <asp:Label ID="Label2" runat="server"></asp:Label>
    </form>
</body>
</html>

提前致谢

1 个答案:

答案 0 :(得分:0)

最好的办法是创建动态控件并通过循环数据库行并根据行值创建控件将它们添加到PlaceHolder。这需要在每次加载页面时发生,包括PostBack

while (reader.Read())
{
    string controlType = reader["CONTROL_NAME"].ToString();

    if (controlType == "TextBox")
    {
        TextBox textbox = new TextBox();
        textbox.ID = reader["ID"].ToString();
        textbox.Visible = Convert.ToBoolean(reader["Visible"]);
        textbox.ToolTip = reader["ToolTip"].ToString();
        PlaceHolder1.Controls.Add(textbox);
    }
    else if (controlType == "Label")
    {
        Label label = new Label();
        label.ID = reader["ID"].ToString();
        label.Visible = Convert.ToBoolean(reader["Visible"]);
        label.Text = reader["Text"].ToString();
        PlaceHolder1.Controls.Add(label);
    }
    else if (controlType == "Button")
    {
        //etc
    }
}

要阅读提交中的表单值,您基本上需要做同样的事情。从数据库中循环所有ID和Control类型,动态创建它们并读取它们的值。

正如您所看到的,如果您有很多不同的控件和行,这个过程会变得非常复杂,所以请考虑一下您的方法,看看这是否是最佳解决方案。