2013-03-13 51 views
3

英語不是我的母語;請原諒打字錯誤。動態創建不同種類的網頁控件

我正在創建一個調查類型的應用程序,我不知道我應該怎麼做,所以我一直在做一些試驗和錯誤。

我有一個問題類

public class Question 
{ 
    public int QuestionID; 
    public string QuestionText; 
    public int InputTypeID; 
    public List<WebControl> Controls; 

    public Question() 
    { 
     //initialize fields; 
    } 

    internal Question(int id, string text, int inputTypeId) 
    { 
     //assign parameters to fields 
     switch(inputTypeId) 
     { 
      case 1: 
       //checkbox 
       break; 
      case 2: 
       //textbox 
       TextBox t = new TextBox(); 
       Controls = new List<WebControl>(); 
       Controls.Add(t); 
       break; 
      ... 
     } 
    } 
} 

我Question.aspx看起來是這樣的:

<asp:Repeater ID="repeater" runat="server"> 
    <ItemTemplate> 
     //Want to display a control dynamically here 
    </ItemTemplate> 
</asp:Repeater> 

我試過,但它顯然沒有奏效...

<asp:Repeater ID="repeater" runat="server"> 
    <ItemTemplate> 
     <%# DataBinder.Eval(Container.DataItem, "Controls") %> 
    </ItemTemplate> 
</asp:Repeater> 

和我剛剛得到這個。

System.Collections.Generic.List`1[System.Web.UI.WebControls.WebControl] System.Collections.Generic.List`1 

一個問題可以有

  • 一個文本框
  • 單選按鈕列表
  • 複選框列表

在這種情況下,應我的問題階層有List<WebControl>或只是WebControl

另外,我怎樣才能渲染中繼器內的webcontrol?

+0

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-03-13 20:39:18

+0

哦,我明白了。謝謝:) – kabichan 2013-03-13 20:40:13

回答

2

你應該在CodeBehind中使用Repeater ItemDataBound()事件來做到這一點。您的問題類應該有一個List<Control>這是WebControl和其他控件的基類,允許不同種類的控件的靈活性。

不必使用的Page_Load只是舉例來說,

void Page_Load(Object Sender, EventArgs e) 
    { 
     Repeater1.ItemDataBound += repeater1_ItemDataBound; 
     Repeater1.DataSource = [your List<Control> containing controls to add]; 
     Repeater1.DataBind(); 
    } 

    void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
    { 

     // Execute the following logic for Items and Alternating Items. 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 

     var controlToAdd = (Control)e.Item.DataItem; 
     ((PlaceHolder)e.Item.FindControl("PlaceHolder1")).Controls.Add(controlToAdd); 

     } 
    }  

而ItemTemplate:它

<ItemTemplate> 
     <asp:PlaceHolder id="PlaceHolder1" Runat="server" /> 
    </ItemTemplate> 
+0

我測試了一個文本框,它的工作!非常感謝! – kabichan 2013-03-13 21:20:40