我正在创建一个简单的表单。我创建了两个简单的类,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);
}
}
我有几个问题 -
答案 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旨在为动态控制提供持久性。但是,在我的情况下,我无法让它工作。