2012-11-19 47 views
1

我有一個列表視圖,我將一些問題綁定到它以便用戶可以回答它們。 根據問題的類型,它可以通過像單選按鈕列表,下拉列表,文本框等不同的輸入控制來回答..有條件地在Web窗體上放置控件

有點像這樣:

<itemtemplate> 
    if (#eval("QuestionType") == 1) 
     { 
      <asp:RadioButtonList runat="Serer" /> 
     } 
    elseif(#eval("QuestionType") == 2) 
     { 
      <asp:DropDownList runat="Serer" /> 
     } 
    elseif(#eval("QuestionType") == 3) 
     { 
      <asp:CheckboxList runat="Serer" /> 
     } 
</itemtemplate> 

以上是簡化的例子僞碼是什麼我其實有。

我希望你明白我在找什麼。

回答

1

您需要添加一個事件處理程序OnItemDataBound事件爲您ListView

<asp:ListView ID="lstVw" runat="server" OnItemDataBound="lstVw_ItemDataBound"> 
    <ItemTemplate></ItemTemplate> 
</asp:ListView> 

從這一點可以動態控件添加到該行的數據項的控件集合。

protected void lstVw_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
     int val = int.Parse(e.Item.DataItem.ToString()); 

     switch (val) 
     { 
      case 1: 
       RadioButtonList list = new RadioButtonList(); 
       list.Items.Add("Option 1"); 
       list.Items.Add("Option 2"); 

       e.Item.Controls.Add(list); 

       break; 
      case 2: 
       // Add a dropdown list 
       break; 
      case 3: 
       // Add a checkbox list 
       break; 
      default: 
       // 
       break; 
     } 
    } 
} 

有一點需要注意 - 我將我的ListView直接綁定到List<int>。所以你需要的代碼會略有不同 - 看看this。總體思路是將e.Item.DataItem轉換爲ListView綁定的任何類型,然後從中獲取所需的值。

現在獲取動態添加控件的回發值(假設您需要)會變得棘手。您必須使用Page.FindControl()來遍歷頁面上的控件,或者甚至可能檢查ListView並在其DataRows上調用FindControl。您可能需要使用反射來查找每個控件的類型。就像我說過的那樣,這不是直接的,但你應該能夠完成它。

2

您不能有條件地「放置」它們,但可以有條件地設置其可見性。

<asp:RadioButtonList runat="server" 
    Visible='<%# (int)DataBinder.Eval(Container.DataItem("QuestionType")) == 1 %>' /> 
+0

它說:「不可調用的成員'System.Web.UI.WebControls.ListViewItem.DataItem'不能像一個方法一樣使用。」 –

+0

它工作。我只是用Eval而不是DataBinder.Eval(Container.DataItem –