代码之家  ›  专栏  ›  技术社区  ›  Ronnie Overby

动态ASP.NET Web窗体

  •  4
  • Ronnie Overby  · 技术社区  · 15 年前

    我正在创建一个ASP.NET应用程序,在该应用程序中,程序管理员将能够为用户将要填写和提交的表单定义自定义字段。

    管理员需要定义各种类型的字段,如复选框、单选按钮、文本框和文本区域,以便用户填写。管理员还可以定义是否需要这些自定义字段。

    我现在正处于计划阶段,我想知道如何将这些自定义字段定义存储在数据库中,以及如何将它们呈现出来并使它们发挥作用。

    编辑

    最终用户使用这些动态创建的表单字段提交的表单数据也必须保存在数据库中。

    我如何解决这个问题?

    6 回复  |  直到 10 年前
        1
  •  4
  •   RSolberg    15 年前

    如果没有这样做或类似的事情,我认为您的DB结构可能包括控件类型、名称、值类型(如果已验证)、验证方式(如果需要)。然后,当您在读取所需控件的记录/数据集时,您可能会将记录集中的控件类型与转换后的值进行比较,然后将其添加到WebForm中。

    例如:

    if(drow["ControlType"].ToString().ToUpper() == "TEXTBOX")
    {
        Label lbl = new Label();
        lbl.Text = drow["ControlLabel"].ToString();
        TextBox txt = new TextBox();
    
        //TO GET THE VALUE ON POSTBACK LATER
        txt.ID = drow["ControlID"].ToString();
    
        //PROBABLY NOT NECESSARY
        Div myDiv = new Div();
        myDiv.Controls.Add(lbl);
        myDiv.Controls.Add(txt);
    
        //ADD THE DIV ABOVE TO THE FORM/PANEL/DIV/ETC.
        MyForm.Controls.Add(myDiv);
    }
    

    理论上,这会将标签放在文本框控件旁边。我不知道DIV是否可以工作,但是您可以运行复选框、文本框、标签等类型的内容。

    一旦控件和标签在页面上,您将需要某种形式的操作,以使服务器将值保存到数据库中。我建议将表名和列名与对象列表一起存储。然后将表单字段映射到用于插入的DB列。(请记住,这个解释好像是在20万英尺的地方)

        2
  •  6
  •   Ronnie Overby    15 年前

    这是我快速制作的概念证明。

    DynamicForms.zip

    我内置了vs 2008 SP1。AppData文件夹中有一个SQL Server数据库,因此如果您想运行它,sqlExpress将提供帮助。

    我建得很快,所以很马虎。

        3
  •  2
  •   Jay S    15 年前

    可能需要以下基本结构:窗体、字段、字段类型。您将需要每个字段的业务对象和数据表,以便存储每个字段的配置。

    您可能需要该字段具有多个可设置的属性(如必需),以便您可以为每个字段单独跟踪这些属性。

    然后,您将需要某种实用程序来读取数据层,然后对于每个字段和字段类型,了解要生成的控件类型以及如何将控件添加到当前页。

    使用主页面上的asp:place holder标记将允许您使用表单生成实用程序向此占位符动态添加控件。

    最后,您可能希望为生成的表单的不同部分构建一个带有多个类的样式表,以便客户机可以自定义您生成的任何控件表的字体、间距等。

    编辑:

    如果表单上输入的数据需要持久化,那么您需要决定是否要有一个可定制的数据层。您可以拥有一个空的数据库表,在该表上使用alter table脚本,以允许客户机根据需要向数据库添加列,然后可以设置绑定到哪个列的控件。控件与数据库列之间的映射对于正确存储数据至关重要。

        4
  •  0
  •   Fabio Vinicius Binder    15 年前

    每个控件都可以实例化并添加到页面中。 例子:

     Label label = new Label();
     CheckBox check = new CheckBox();
    

    在此之后,应将控件添加到任何容器的Controls属性中:

    Panel1.Controls.Add(label);
    

    要在回发后检索控件,可以使用findcontrol方法。

    TextBox name = (TextBox) Panel1.FindControl("name of control");
    
        5
  •  0
  •   codeulike    15 年前

    正如其他人所说,通过在运行时动态地向ASP.NET页添加控件,确实有一些方法可以做到这一点。

    或者,尽管我没有用 Microsoft Infopath 从我听说的情况来看,它做了很多你想做的事情(即,允许超级用户设计表单/问卷,上网,然后再收集数据)

    如果您的客户端具有适当的Microsoft Office版本,则它们可能已经有了InfoPath。

        6
  •  0
  •   Community Romance    7 年前

    我以前做过这个。 我用了两张桌子

    keyfield_master:对于字段名,键入,它是强制的还是非强制的?

    keyfield_details:根据(值和描述)存储自定义字段值。

    使用页面加载事件创建该字段

    if (keyField_type == "T") // Textbox
    {
       txtBox.Attributes.Add("Type", "T"); // type of field for validation
       txtBox.Attributes.Add("IsKeyField", "Y"); // to mark it as a custom field
       if (isMandatory == "Y")
         txtBox.Attributes.Add("IsMandatory", "Y"); // is it mandatory
    
       // you could set layout of these controls using HTML Tables or any other way you prefer.
    
      htmlCell.Controls.Add(txtBox);
      htmlRow.Cells.Add(htmlCell);
      tbHTML.Rows.Insert(2, htmlRow);
    }
    else if // other controls type
    {
      // ...
    }
    

    另外,你也可以参考这个问题 "How to validate dynamically created controls?" 这个问题和那个程序有关?

    此外,验证可以是客户端,如上述问题中所述? 或者服务器端将创建的字段存储在一个列表中,然后您可以在提交时检查该列表。