2017-01-03 11 views
0

フォーク、データベースレコードからC#(ASPX/Web)のコントロールを動的に作成し、コントロールデータを取得する

C#でダイナミックコントロールを作成するには、ヘルプが必要です。 ID、テキスト、およびすべての必須の検証プロパティをデータベースに入れています。その値から、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> 

に同じテーブル構造を実装する必要がありますありがとうございます。

答えて

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とコントロールのすべてのタイプをデータベースからループし、動的に作成して値を読み取ります。

さまざまなコントロールと行がたくさんある場合、このプロセスは複雑になりがちなので、アプローチを考えて、これが最適なソリューションかどうかを確認してください。

関連する問題