2017-01-03 52 views
0

伙计们,动态创建从数据库记录C#(ASPX /网络)的控制和取出控制数据

需要一个帮助在C#创建动态控件。 像,我把ID,文本和所有必需的验证属性到数据库中,并从该值我需要在ASP WinForm或网页中创建一个控件。

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

这里是Refered这个例子中我的数据库表模板

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> 

相同的表结构在此先感谢

回答

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和控制类型,动态创建它们并读取它们的值。

正如你所看到的,如果你有很多不同的控件和行,这个过程会变得非常复杂,所以想想你的方法,看看这是否是最好的解决方案。