ASP.Net - 显示控件集合

时间:2009-10-19 03:33:09

标签: c# asp.net user-controls controls collections

我正在创建一个简单的表单。我创建了两个简单的类,Question和QuestionSection。

然后我创建一些问题的子类,例如SimpleQuestion,MultipleChoiceQuestion,具有不同的行为和标记。

QuestionSection具有一系列问题的属性,如此 -

private List<Question> _Questions = new List<Question>();
public List<Question> Questions
{
    get { return _Questions; }
}

设置在例如SurveyForm.aspx上,如此 -

<uc:QuestionSection ID="ucQuestionSection" runat="server">
        <questions> 
            <uc:SimpleQuestion ID="qFirstName" runat="server" QuestionText="First name" />
            <uc:SimpleQuestion ID="qLastName" runat="server" QuestionText="Last name" />
            <uc:MultipleChoiceQuestion ID="qEmail" runat="server" QuestionText="Email address" />
        </questions>
</uc:QuestionSection>  

在我的QuestionSection.ascx页面上,我有 -

<div class="portlet-section-body form-fields">
    <asp:Panel ID="pnlQuestions" runat="server" ></asp:Panel>
</div>

由QuestionSection.ascx.cs上的此函数加载

protected void Page_Init(object sender, EventArgs e)
{
      foreach (Question q in Questions)
      {
          pnlQuestions.Controls.Add(q);                
      }
}

我有几个问题 -

  1. 这是个好主意吗?
  2. 我在回发和持久控制方面遇到了一些问题。我的想法是这些问题控制不是动态的,因此应该起作用。但是,在回发时,问题控件不会显示。
  3. 在QuestionSection中使用比Panel控件更好的控件吗?我考虑过只使用this.Controls.Add,但我看不出如何在控件集合的任何一侧添加div。

2 个答案:

答案 0 :(得分:0)

你提出了几个问题。首先,动态创建的控件在回发时不能正确保留,如果您希望它们的事件有效,则必须在每次回发时重新创建。

其次,更好的方法是使用控件来创建问题。此控件允许您定义要创建的控件模式。

我不确定问题对象的HTML定义是什么,但这里是一个如何修改QuestionSection.ascx以使用listview的示例:

<div class="portlet-section-body form-fields">
    <asp:ListView runat="server" ID="QuestionsListView" 
        onitemcommand="QuestionsListView_ItemCommand">
        <LayoutTemplate>
            <div>
                <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
            </div>
            <div>
                <asp:Button runat="server" ID="bnSave" Text="Save" 
                    CommandName="Save" />
                <asp:Button runat="server" ID="bnCancel" Text="Cancel" 
                    CommandName="Cancel" />
            </div>
        </LayoutTemplate>
        <ItemTemplate>
            <div class="QuestionRow">
                <asp:Label runat="server" Text='<%#Eval("QuestionText") %>' 
                    AssociatedControlID="tbAnswer"></asp:Label>
                <asp:TextBox runat="server" ID="tbAnswer"></asp:TextBox>
            </div>
        </ItemTemplate>
    </asp:ListView>
</div>

以下是填充它并处理按钮单击事件的代码。如果您需要其他事件类型,请尝试将事件连接到ListView控件本身,而不是子控件:

protected void Page_Load(object sender, EventArgs e)
{
    List<string> Questions = new List<string>()
                                 {
                                     "First Name",
                                     "Last Name",
                                     "Email Address"
                                 };
    QuestionsListView.DataSource =
        from q in Questions
        select new
        {
            QuestionText = q
        };

    QuestionsListView.DataBind();
}

protected void QuestionsListView_ItemCommand
    (object sender, ListViewCommandEventArgs e)
{
    switch(e.CommandName)
    {
        case "Save":
            break;

        case "Cancel":
            break;
    }
}

答案 1 :(得分:0)

对于第3部分 - 在QuestionSection中使用比Panel控件更好的控件吗?

是的,占位符控件。它不会在控件周围添加div。

此外,还有dynamic placeholder control旨在为动态控制提供持久性。但是,在我的情况下,我无法让它工作。