如何基于下拉列表值动态创建 VB.NET 控件

本文关键字:VB NET 控件 创建 动态 何基于 下拉列表 | 更新日期: 2023-09-27 18:36:53

请提供任何有用的链接。

我需要创建一个示例问题类型 Web 表单 VB.NET 允许用户执行以下操作:

  1. 用户从下拉列表中选择控件类型(文本框、单选按钮、列表框等)。
  2. 根据 Web 窗体上的控件类型动态生成控件。
  3. 它将始终显示文本框(用户编写问题的位置)和(生成的控件 - 文本框,单选按钮,列表框等),并将这些值保存到数据库中。

  4. 在 Web 表单上显示生成的示例问题。

谢谢。

如何基于下拉列表值动态创建 VB.NET 控件

这样的东西应该可以工作(没有数据库交互;))。

.aspx:

<asp:DropDownList runat="server" id="TypeDropDown" OnSelectedIndexChanged="OnTypeChanged">
  <asp:ListItem>TextBox</asp:ListItem>
  <asp:ListItem>RadioButton</asp:ListItem>
</asp:DropDownList>
<asp:Panel>
    Question: <asp:TextBox runat="server" ID="Question" /> <br />
    Answer: <asp:PlaceHolder runat="server" ID="Place" />
</asp:Panel>

代码隐藏:

protected override void OnInit(EventArgs eventArgs) {
  base.OnInit(eventArgs);
  CreateDynamicControl(); 
}
private void CreateDynamicControl() {
  Place.Controls.Clear();
  Place.Controls.Add(ControlFactory.Create(TypeDropDown.SelectedValue);
}
private void OnTypeChanged(object sender, EventArgs eventArgs) {
  CreateDynamicControl();
}

控制工厂:

static class ControlFactory {
  public static Control Create(string type) {
    if ("TextBox".Equals(type))
      return new TextBox();
    if ("RadioButton".Equals(type)) 
      return new RadioButtonList();
  }
}

我认为您正在寻找的是一个 DBMS 解决方案,您可以在其中保存控件的类型,而不是在需要显示您正在查看的类型并使用占位符生成所需内容的页面时。这里有一个维基百科的链接,解释了DBMS: http://en.wikipedia.org/wiki/Database_management_system

我使用声明性语法,使用DataBinding做了类似的事情。

抱歉,代码太长了,但是只发布相关部分而不发布嵌套中继器可能没有意义。 我正在发布完整的嵌套中继器代码以供上下文使用。

在我的设置中,这是一个调查应用程序,具有问题(外部中继器),由一个或多个问题(嵌套中继器)组成。

其工作原理的相关部分位于代码示例中的嵌套转发器中。 我在标记中拥有所有可用的控件。但是.每个属性的可见属性都是根据问题类型设置的。

    <asp:Repeater ID="Repeater1" runat="server">
        <ItemTemplate>
            <div class="questiongroup">
                <asp:HiddenField runat="server" ID="lblQuestionGroupId" Value='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "QuestionGroupId").ToString()) %>'>
                </asp:HiddenField>
                <asp:HiddenField runat="server" ID="hfSortOrder" Value='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "SortOrder").ToString()) %>'>
                </asp:HiddenField>
                <asp:HiddenField runat="server" ID="hdnPointsAwarded" Value='0'></asp:HiddenField>
                <br />
                <h3><asp:Label runat="server" ID="txtQuestionGroupName" MaxLength="50" Columns="50" Text='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "QuestionGroupName").ToString()) %>'></asp:Label>
                </h3>
                Score Section
                <asp:CheckBox runat="server" ID="chkIsScoreSection" Enabled="false" TabIndex="-1"
                    Checked='<%# Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "IsScoreSection")) %>' />
                Minimum required correct answers:
                <asp:Label runat="server" ID="lblMinimumForScore" MaxLength="3" Columns="3" Text='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "CommentsRequiredMinimumYesAnswers").ToString()) %>'></asp:Label>
                  Point Value <asp:Label ID="lblPossiblePoints" runat="server" Text='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "PossiblePoints").ToString()) %>' />
                          <br />
                Group Instructions
                <br />
                <asp:Label runat="server" ID="lblGroupInstructions" TextMode="MultiLine" Columns="50" Rows="3"
                    Text='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "GroupInstructions").ToString()) %>'></asp:Label>
                <br />
                <div class='questionseditor'>
                </div>
                <br />
                <div class="questionsdiv">
                    <asp:Repeater ID="childRepeater" runat="server" DataSource='<%# ((DataRowView)Container.DataItem).Row.GetChildRows("Relation2") %>'>
                        <ItemTemplate>
                        <div class="question">
                            <asp:HiddenField ID="hdnQuestionType" runat="server" Value='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) %>' />
                            <asp:HiddenField ID="hdnQuestionId" runat="server" Value='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionId'"]").ToString()) %>' />
                            <asp:HiddenField ID="hfQuestionSortOrder" runat="server" Value='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"SortOrder'"]").ToString()) %>' />
                            <asp:RequiredFieldValidator SetFocusOnError="True" ID="YesNoForScoreRequiredFieldValidator" runat="server"
                                ControlToValidate="lstYesNoForScore" Display="Dynamic" ErrorMessage="Required<br />"
                                Enabled='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "1" %>'></asp:RequiredFieldValidator>
                            <asp:RequiredFieldValidator SetFocusOnError="True" ID="MemoRequiredFieldValidator" runat="server" ControlToValidate="txtMemoAnswer"
                                Display="Dynamic" ErrorMessage="Required<br />" 
                                Enabled='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "2" %>'></asp:RequiredFieldValidator>
                            <asp:RequiredFieldValidator SetFocusOnError="True" ID="NumericAnswerRequiredFieldValidator" runat="server"
                                ControlToValidate="txtNumericAnswer" Display="Dynamic" ErrorMessage="Required<br />"
                                Enabled='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "3" %>'></asp:RequiredFieldValidator>
                            <asp:RegularExpressionValidator SetFocusOnError="True" Display="Dynamic" runat="server" ID="NumericTextRegexValidator"
                                ValidationExpression="^'d*[0-9](|.'d*[0-9]|,'d*[0-9])?$" Enabled='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "3" %>'
                                ErrorMessage="*Invalid<br />" ControlToValidate="txtNumericAnswer"></asp:RegularExpressionValidator>
                            <asp:RequiredFieldValidator SetFocusOnError="True" ID="RequiredFieldValidator1" runat="server" ControlToValidate="lstYesNoNonScored"
                                Display="Dynamic" ErrorMessage="Required<br />" Enabled='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "5" %>'></asp:RequiredFieldValidator>
                            <asp:Label ID="lblQuestionText" runat="Server" Text='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionText'"]").ToString()) %>'></asp:Label><br />
                            <asp:RadioButtonList runat="server" ID="lstYesNoForScore" RepeatDirection="Horizontal"
                                Visible='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "1" %>'>
                                <asp:ListItem Text="Yes" Value="1"></asp:ListItem>
                                <asp:ListItem Text="No *" Value="0"></asp:ListItem>
                            </asp:RadioButtonList>
                            <asp:TextBox ID="txtMemoAnswer" runat="server" Visible='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "2" %>'
                                TextMode="MultiLine" Rows="3" Width="100%"></asp:TextBox>
                            <asp:TextBox ID="txtNumericAnswer" runat="server" Visible='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "3" %>'
                                cols="5"></asp:TextBox>
                            <uc1:MultipleChoiceControl ID="MultipleChoiceControl1" runat="server" Visible='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "4" %>'
                                QuestionId='<%# Convert.ToInt32(DataBinder.Eval(Container.DataItem, "['"QuestionId'"]")) %>' />
                            <asp:RadioButtonList runat="server" ID="lstYesNoNonScored" RepeatDirection="Horizontal"
                                Visible='<%#  Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(  DataBinder.Eval(Container.DataItem, "['"QuestionTypeId'"]").ToString()) == "5" %>'>
                                <asp:ListItem Text="Yes" Value="1"></asp:ListItem>
                                <asp:ListItem Text="No" Value="0"></asp:ListItem>
                            </asp:RadioButtonList>
                            <br />
                            </div>
                        </ItemTemplate>
                    </asp:Repeater>
                </div>
                Comments for this Question Group (Required if score not awarded)
                <asp:TextBox ID="txtGroupComments" runat="server" TextMode="MultiLine" Rows="3" Width="100%"></asp:TextBox>
            </div>
        </ItemTemplate>
    </asp:Repeater>