2012-07-02 4 views
0

у меня есть 2 списков строк и я хотел бы, чтобы динамически создать сетку текстовых:ASP.net динамическая сетка текстовых полей

List<string> X = {"A", "B", "C"}; 
List<string> Y = {"1", "2", "3", "4"}; 

      A  B  C 
    1 TBX TBX TBX 
    2 TBX TBX TBX 
    3 TBX TBX TBX 
    4 TBX TBX TBX 

    [Button] 

Когда вводить данные в текстовые поля и нажмите кнопку, I» d хотел бы иметь возможность перебирать эти текстовые поля и определять координаты «X» и «Y», связанные с каждым текстовым полем.

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

У меня не будет проблем с итерацией и фактической логикой, но я не могу понять, как получить данные в контейнере, чтобы его можно было повторить. Должен ли я динамически создавать текстовые поля при чтении опубликованных данных? На что это похоже?

+0

веб-форм или MVC ?? –

+0

Веб-формы. Это своего рода ручка ввода данных для ввода трубчатых данных. Будет javascript материал, который делает некоторый синтаксический анализ. – Mark

ответ

4

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

Вот ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DynamicControls.aspx.cs" Inherits="Test2.DynamicControls" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:PlaceHolder ID="PHDynamicTable" runat="server"></asp:PlaceHolder> 
     <asp:Button runat="server" ID="btnSubmit" Text="Submit" 
      onclick="btnSubmit_Click" /> 
    </div> 
    </form> 
</body> 
</html> 

код за

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace Test2 
{ 
    public partial class DynamicControls : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected override void OnPreInit(EventArgs e) 
     { 
      base.OnPreInit(e); 
      CreateTextBoxesInTable(); 
     } 

     private void CreateTextBoxesInTable() 
     { 
      PHDynamicTable.Controls.Clear(); 

      List<string> X = new List<string>() { "A", "B", "C" }; 
      List<string> Y = new List<string>() { "1", "2", "3", "4" }; 

      Table table = new Table(); 
      table.ID = "dynamicTable"; 

      TableRow tr; 
      foreach (string y in Y) 
      { 
       tr = new TableRow(); 

       foreach (string x in X) 
       { 
        TableCell tc = new TableCell(); 

        TextBox textBox = new TextBox(); 
        textBox.ID = "txt_" + x + y; 
        tc.Controls.Add(textBox); 

        tr.Cells.Add(tc); 
       } 

       table.Rows.Add(tr); 
      } 

      PHDynamicTable.Controls.Add(table); 
     } 

     protected void btnSubmit_Click(object sender, EventArgs e) 
     { 
      if (PHDynamicTable.Controls.Count > 0) 
      { 
       Table dynamicTable = (Table)PHDynamicTable.FindControl("dynamicTable"); 
       if (dynamicTable != null) 
       { 
        foreach (TableRow tr in dynamicTable.Rows) 
        { 
         foreach (TableCell tc in tr.Cells) 
         { 
          TextBox textBox = (TextBox)tc.Controls[0]; 
          string text = textBox.Text; 
          //Do whatever you want with the control 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Немного скриншотов

экран ввода с данными

enter image description here

на постбэка (подать)

enter image description here

после того, как подать

enter image description here

+0

Спасибо. Я в основном пошел по этому пути, но так, как вы это делали, это чище. – Mark

+0

Я думал, что это выглядит идеально для того, что я делаю, но PHDynamicTable - это «ничего», если я вызову CreateTextBoxesInTable из OnPreInit. Если я вызову его из Page_Load в предложении «If Not IsPostback», таблица исчезнет после нажатия кнопки обновления. Мне нужно вникать в порядок событий загрузки страницы. Наверное, не плохо. – Resource

+0

ОК. Это OnPreLoad. – Resource

2

Вопросы удобства использования в стороне, я собираюсь предположить, что вы находитесь в ASP.NET Webforms, а не ASP.NET MVC. В веб-формах это становится своего рода кошмаром. Конечно, вы могли бы установить два элемента управления. Один источник данных управления становится первым списком, а второй источник данных - вторым. Затем в шаблоне вторичного ретранслятора вы помещаете свой asp: textbox. Однако идентификатор здесь, даже если он явно задан, будет фактически сгенерированным значением, поскольку ретранслятор является тем, что известно в ASP.nET Webforms как контейнер именования; что означает, что значения идентификаторов будут изменены во время выполнения.

На обратной стороне вы можете выполнить итерацию над деревом управления родительского ретранслятора, чтобы найти дочерний ретранслятор. Затем в дочернем ретрансляторе вы можете перебирать элементы управления ретранслятора, чтобы найти свои текстовые поля. что-то вроде:

<asp:Repeater> 
    <itemtemplate> 
     <asp:repeater> 
      <itemtemplate> 
       <asp:textbox /> 
      </itemtemplate> 
     </asp:repeater> 
    </itemtemplate> 
</asp:repeater> 

Затем в коде позади, на публикацию [псевдокода]

foreach(Control c in myTopRepeater.Controls){ 
    if(c == RepeaterControl) //is of type repeater. again, pseudo code 
    { 
     foreach(Control subC in c) 
     { 
      if(subC == textBox) 
      { 
       //Compare generated name, etc to my Lists 

      } 
     } 
    } 
} 

Это может помочь читать на называющих контейнеры. Вы можете получить предсказуемую настройку именования, но она не на 100% интуитивно понятна. http://www.4guysfromrolla.com/articles/031710-1.aspx

Удачи вам!

+0

Да, так я бы рекомендовал делать это в Web Forms. – saille

Смежные вопросы