1

我有一个列表视图,我将一些问题绑定到它,以便用户可以回答它们。根据问题的类型,可以通过radiobuttonlist、dropdownlist、textbox等不同的输入控件来回答。

有点像这样:

<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>

以上是我实际拥有的简化示例伪代码。

我希望你明白我真正在寻找什么。

4

2 回答 2

2

您不能有条件地“放置”它们,但可以有条件地设置它们的可见性。

<asp:RadioButtonList runat="server" 
    Visible='<%# (int)DataBinder.Eval(Container.DataItem("QuestionType")) == 1 %>' />
于 2012-11-19T13:26:13.510 回答
1

您需要OnItemDataBound为您的ListView.

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

从那时起,您可以动态地将控件添加到行数据项的 Controls 集合中。

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>. 所以你需要的代码会略有不同——看看这个。一般的想法是转换e.Item.DataItem为 ListView 绑定的任何类型,然后从中获取您需要的值。

现在在回发时获取动态添加的控件的值(假设您需要)将变得很棘手。您必须使用Page.FindControl() 遍历页面上的控件,甚至可能检查 ListView 并在其 DataRows 上调用 FindControl。您可能需要使用反射来查找每个控件的类型。就像我说的,这不会是直截了当的,但你应该能够完成它。

于 2012-11-19T13:37:02.783 回答