Cómo crear controles VB.NET dinámicamente basados ​​en valores desplegables

Proporcione cualquier enlace útil.

Necesito crear un formulario web de tipos de preguntas de muestra en VB.NET que permita al usuario lo siguiente:

  1. El usuario selecciona el tipo de control del menú desplegable (TextBox, RadioButton, ListBox, etc.).
  2. Genere controles dinámicamente según el tipo de control en el formulario web.
  3. Siempre mostrará el TextBox (donde el usuario escribe la pregunta) y (control generado - TextBox, RadioButton, ListBox, etc.) y guardará esos valores en la base de datos.

  4. Mostrar preguntas de muestra generadas en el formulario web.

Gracias.

preguntado el 12 de junio de 12 a las 20:06

Qué significa eso: "El usuario escribe preguntas y guarda las preguntas generadas en la base de datos". ? ¿Cómo llenarías controles como ListBox cuando todo lo que sabes es que el usuario quiere un ListBox? -

Creo que vas a estar mirando dos interfaces de usuario diferentes para construir. El primero será crear una interfaz de usuario que le permitirá crear y administrar las preguntas y las posibles respuestas. El segundo será cómo tomar los datos almacenados y generar un formulario para la interacción del usuario para responder las preguntas. -

3 Respuestas

algo como esto debería funcionar (sin interacción con la base de datos;)).

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>

código detrás:

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();
}

fábrica de controles:

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

    if ("RadioButton".Equals(type)) 
      return new RadioButtonList();
  }
}

Respondido el 12 de junio de 12 a las 20:06

Creo que lo que está buscando es una solución de DBMS en la que guarde en la base de datos el tipo de control y luego, cuando sea el momento de mostrar la página que está mirando, el tipo y el uso de un marcador de posición para generar lo que necesita. aquí hay un enlace a wikipedia que explica DBMS: http://en.wikipedia.org/wiki/Database_management_system

Respondido el 12 de junio de 12 a las 20:06

Hice algo similar a esto usando sintaxis declarativa, usando DataBinding.

Lo sentimos, el código es tan largo, pero publicar SOLO la parte relevante sin los repetidores anidados podría no tener sentido. Estoy publicando el código completo del repetidor anidado para el contexto.

En mi configuración, esta es una aplicación de encuestas, con Grupos de preguntas (repetidor externo), compuesto por uno o más Preguntas (repetidor anidado).

La parte relevante de cómo funciona esto está en el repetidor anidado en el ejemplo de código. Tenía todos los controles disponibles en el marcado. pero la propiedad .Visible de cada uno se estableció en función del Tipo de pregunta.

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

Respondido el 12 de junio de 12 a las 21:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.