2009-10-19 50 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旨在爲動態控件提供持久性。但是,我無法得到這個工作在我的情況。