Каков наилучший способ хранить элементы управления и динамически добавлять элементы управления в существующую форму - PullRequest
1 голос
/ 23 декабря 2011

У меня есть общая форма, которая показывает элементы управления по умолчанию. Я пытаюсь создать очередь форм, в которой, если у нас есть клиент, которому нужны дополнительные данные, я бы хотел хранить элементы управления asp.net, необходимые для сбора данных для каждого клиента, и загружать их динамически вместе с формой по умолчанию.

Кто-нибудь знает или направляет меня к архитектуре / решению, чтобы реализовать это [хранить формы, загружать и динамически добавлять их в существующую форму и извлекать данные из них, переданные].

Первоначально я думал использовать файл XML для каждого клиента, которому требуются дополнительные данные, чем существующие данные статической формы, и загрузить этот файл XML на основе имени файла (совпадающего с именем клиента) и добавить его в заполнитель содержимого, а затем выполнить цикл через страницу при нажатии кнопки, чтобы получить данные из этих динамических полей.

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

Добавьте все элементы управления в форму. Скройте дополнительные и покажите их как требуется.

1 голос
/ 23 декабря 2011

Этот 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>

Начните с настройки XmlDataSource на странице.Вы можете поменять его для SqlDataSource, если вы планируете хранить определение формы в базе данных вместе с клиентом, а не в файлах XML.

<asp:XmlDataSource ID="CustomFields" runat="sever" 
  DataFile="~/App_Data/CustomFields.config"
  XPath="//Customers/IBM/Employee">
</asp:XmlDataSource>

В этом случае мы будем использовать один файл XML, для каждого клиента будет свой узел, а для каждого типа формы - другой узел.В этом примере IBM является клиентом, а Employee - формой.Конечно, атрибут XPath должен быть установлен динамически:

protected void Page_Load()
{
  if(!Page.IsPostBack)
  {
    CustomFields.XPath = String.Format("//Customers/{0}/{1}", CustomerName, FormName);
  }
}

Теперь вы можете связать данные части формы, используя 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>

В вашем коде теперь вы можете получить значения для каждого поля и отобразить их обратно, используя атрибут data-field-id:

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

Конечно, это становится сложнее, когдаВы также хотите загрузить данные в поля для редактирования форм, но это всего лишь общий подход, основанный на вашем собственном предложении.

Некоторые вещи, которые следует учитывать при хранении, - это сопоставление со специальной таблицей со столбцами для каждого типа данных (строки, числа, даты и т. Д.).Для этого вам необходимо аннотировать ваш XML типом данных и проверять вводимые данные на его основе.

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

Если вам это не нужно, вы можете рассмотреть возможность сериализации всех значений водна строка (JSON?) для хранения в одном столбце в базе данных.Это делает практически невозможным выполнение запросов к данным.

{ "FirstName": value, "LastName": value }
0 голосов
/ 23 декабря 2011

Я предлагаю использовать binding , динамически создавать пользовательский элемент управления и привязывать подэлемент управления к данным вашей очереди (с источником привязки), а после обратной передачи получать данные из источника привязки и обновлять в очереди.

...