Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储控件并将控件动态添加到现有窗体的最佳方法是什么_C#_Asp.net_User Controls_Custom Controls_Dynamic Data - Fatal编程技术网

C# 存储控件并将控件动态添加到现有窗体的最佳方法是什么

C# 存储控件并将控件动态添加到现有窗体的最佳方法是什么,c#,asp.net,user-controls,custom-controls,dynamic-data,C#,Asp.net,User Controls,Custom Controls,Dynamic Data,我有一个显示默认控件的通用表单。我正在尝试构建一个表单队列,如果我们有一个需要额外数据的客户端,我希望存储捕获每个客户端数据所需的asp.net控件,并将它们与默认表单一起动态加载 是否有人知道或指导我使用一种体系结构/解决方案来实现这一点[存储表单并加载并将其动态添加到现有表单中,并从中检索数据] 我最初的想法是为每个需要比现有静态表单数据更多数据的客户机使用xml文件,并根据文件名(与客户机名匹配)加载此xml,并将其添加到内容占位符中,然后单击按钮在页面上循环以从这些动态字段中获取数据。我

我有一个显示默认控件的通用表单。我正在尝试构建一个表单队列,如果我们有一个需要额外数据的客户端,我希望存储捕获每个客户端数据所需的asp.net控件,并将它们与默认表单一起动态加载

是否有人知道或指导我使用一种体系结构/解决方案来实现这一点[存储表单并加载并将其动态添加到现有表单中,并从中检索数据]


我最初的想法是为每个需要比现有静态表单数据更多数据的客户机使用xml文件,并根据文件名(与客户机名匹配)加载此xml,并将其添加到内容占位符中,然后单击按钮在页面上循环以从这些动态字段中获取数据。

我建议使用绑定,动态创建用户控件并将子控件绑定到队列的数据(使用绑定源),然后在回发后从绑定源获取数据并在队列中更新。

将所有控件添加到表单中。隐藏可选项并根据需要显示它们

此XML文件适用于此示例:

<?xml version="1.0"?>
<!-- Custom fields per tenant/form -->
<Customers>
  <IBM>
    <Employee>
      <Field Id="FirstName" Label="First name" />
      <Field Id="LastName" Label="Last name" />
    </Employee>
  </IBM>
</Customers>
现在,您可以使用ListView对表单的一部分进行数据绑定,使用XML中的属性为每个字段显示TextBox控件:

<asp:ListView ID="DynamicFields" runat="server"
  DataSourceID="CustomFields"
  ItemPlaceHolderID="Item">
  <LayoutTemplate>
    <fieldset>
      <legend>Custom fields</legend>
      <asp:PlaceHolder ID="Item" runat="server" />
    </fieldset>
  </LayoutTemplate>
  <ItemTemplate>
    <div>
      <asp:Label runat="server"
        Text='<%# XPath("Field/@Label") %>'
        AssociatedControlID="Field" />
      <br />
      <asp:TextBox ID="Field" runat="server" 
        data-field-id='<%# XPath("Field/@Id") %>' />
    </div>
  </ItemTemplate>
</asp:ListView>
当然,当您还希望将数据加载到编辑表单的字段中时,情况会变得更加复杂,但这只是基于您自己建议的一般方法

存储中考虑的一些事情是映射到一个特殊的表,每个数据类型都有列(字符串、数字、日期等)。为此,您需要使用数据类型对XML进行注释,并基于该类型验证输入

<Field Id="FirstName" Label="First Name" Type="String" />
<Field Id="DateOfBirth" Label="Date of birth" Type="DateTime" />

你的想法似乎没那么糟糕!我想要这种动态,我想要根据我添加到数据库中的客户端动态加载控件,而不是每次有新客户端和新字段时重新编码表单和重新发布。更清楚的是,这个表单可以被1000多个不同的ClientsHank使用,这非常有用,如果我们想在xml中定义控件类型,我们可以这样做吗?例如:textbox,带值的下拉列表,required field是的,但是你需要一个更可扩展的xml模式来定义字段。您应该将字段的呈现封装在一个健壮的用户或服务器控件中。接受定义并将其转换为控件、预填充值和添加验证器的程序。我想象它看起来像
。可以检查此控件是否有效以及值是什么:
field.IsValid
field.value
.thnx!我注意到回发时listview中的所有控件都丢失了,不知道为什么。
<asp:ListView ID="DynamicFields" runat="server"
  DataSourceID="CustomFields"
  ItemPlaceHolderID="Item">
  <LayoutTemplate>
    <fieldset>
      <legend>Custom fields</legend>
      <asp:PlaceHolder ID="Item" runat="server" />
    </fieldset>
  </LayoutTemplate>
  <ItemTemplate>
    <div>
      <asp:Label runat="server"
        Text='<%# XPath("Field/@Label") %>'
        AssociatedControlID="Field" />
      <br />
      <asp:TextBox ID="Field" runat="server" 
        data-field-id='<%# XPath("Field/@Id") %>' />
    </div>
  </ItemTemplate>
</asp:ListView>
protected void Save_Click(object sender, EventArgs e) 
{
  foreach(ListViewItem item in DynamicFields.Items)
  {
    TextBox field = item.FindControl("Field") as TextBox;
    string id = field.Attributes["data-field-id"];
    string value = field.Text;
  }
}
<Field Id="FirstName" Label="First Name" Type="String" />
<Field Id="DateOfBirth" Label="Date of birth" Type="DateTime" />
{ "FirstName": value, "LastName": value }