2009-10-19 51 views
1

我正在创建一个简单的窗体。我创建了两个简单的类,Question和QuestionSection。ASP.Net - 显示一组控件

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

QuestionSection具有设定,比如说,像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页面的问题集合的性质,像所谓

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

我有 -

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

回答

0

您提出了几个问题。首先,动态创建的控件在回发时不能正确保留,并且如果您希望其事件能够正常工作,则必须在每次回发中重新创建。

其次,更好的方法是使用控件来创建问题。通过此控件可以定义要创建的控件模式。

我不知道这个问题对象的HTML定义是什么,但这里是一个如何修改QuestionSection.ascx使用列表视图的例子:

<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; 
    } 
} 
+0

感谢您的努力。这不适用于我,因为我正在寻找问题控制的行为和外观的灵活性(例如,为多项选择问题创建问题的子类)。 我仍然不确定问题控件是动态的。他们不是在页面上启动,然后由QuestionSection控件引用,而不是在代码中创建?无论哪种方式,我意识到我需要添加重新加载代码(从保存加载),并可以使用它来解决持久性问题。 – Spongeboy 2009-10-19 23:00:46

0

第3部分 - 有没有更好的控制QuestionSection使用比Panel控件?

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

此外,还有一个dynamic placeholder control旨在为动态控件提供持久性。但是,我无法得到这个工作在我的情况。