Как найти элемент управления рекурсивно в ASP.NET - PullRequest
3 голосов
/ 03 августа 2011

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

В моей разметке HTML есть пустая таблица asp:

<asp:Table ID="editDataTable" runat="server">
</asp:Table>

А в Page_Load таблица заполнена множеством строк и столбцов (я очень горжусь, что понял это). Внутри некоторых ячеек таблицы есть <asp:TextBox />.

Вы уже догадались, мне нужно получить значение этих текстовых полей!

(Я получил код для рекурсии и проверил его, и, кажется, он хорош.)

Моя таблица состоит из двух столбцов. Левый содержит названия, такие как «Название компании, Телефон» и т. Д., А правый столбец содержит текстовые поля с соответствующим значением заголовка. Таким образом, пользователь может редактировать текстовое поле (например, если номер телефона изменился) и отправить изменения.

Очевидно, что строки добавляются динамически в зависимости от пользователя.

Проблема, с которой я столкнулся: вам нужно ДОБАВИТЬ элемент управления на страницу при заполнении таблицы. Что-то вроде:

myTable.Control.Add(new TextBox());

В моем случае моя таблица называется editDataTable. Так что в моем коде, где я добавляю строки, я тоже добавил элемент управления, как показано ниже.

for (int i = 0; i < rowCount; i++)
{
    editDataTable.Rows.Add(tblRow[j]); // This is where I add the ROW to my sexy table
    editDataTable.Controls.Add(new TextBox()); // This is where I add the control
}

Те, кто проснется, узнают, что вы не можете добавить элемент управления текстовым полем в таблицу!

Итак, наконец, мои вопросы:

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

Вот мой рекурсивный код на всякий случай:

private void getControls(Control parent)
{
    foreach (Control c in parent.Controls)
    {
        if (c is TextBox && c.ID == null)
        {
            //Stuff
        }

        if (c.Controls.Count > 0)
        {
            getControls(c);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Вот пример построения динамической таблицы в ASP.NET во время PageLoad и чтения значений через обратную передачу.Поскольку таблица является динамической, она НЕ будет перестраиваться при обратной передаче страницы на сервер.Если вы хотите перестроить таблицу, вам нужно будет отрендерить ее снова и использовать значения, которые вы извлекаете из Request.Form, чтобы заново заполнить ее.

HTML-разметка

    <asp:Table ID="editDataTable" runat="server">
    </asp:Table>
    <asp:Button runat="server" Text="Submit" OnClick="Submit_Click" />

Разметка кода

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string[] dynamicTable = { "First Name", "Last Name", "Address", "Phone" };

            foreach (string s in dynamicTable)
            {
                TableRow row = new TableRow();
                // Add First Cell with Text to Row
                row.Cells.Add(new TableCell() { Text = s });

                // Create Second Cell
                TableCell textBoxCell = new TableCell();

                // Add Textbox Control to Second Cell
                textBoxCell.Controls.Add(new TextBox() { ID = "Dynamic_" + s.Replace(" ","_") });

                // Add Second Cell to Row
                row.Cells.Add(textBoxCell);

                // Add New Row to Table
                editDataTable.Rows.Add(row);
            }
        }
    }

    protected void Submit_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < Request.Form.Count; i++)
        {
            string key = Request.Form.GetKey(i);
            if (key.Contains("Dynamic_"))
            {
                Response.Write("<p><strong>" + (key.Remove(0,8)).Replace("_"," ") + "</strong>&nbsp;&nbsp;::&nbsp;&nbsp;" + Request.Form[i] + "</p>");
            }
        }
    }
1 голос
/ 03 августа 2011

Вам необходимо добавить TableCell в коллекцию TableRow.Cells и добавить TextBox в коллекцию TableCell.Controls:

TableCell cell = new TableCell();
cell.Controls  = new TextBox();
tblRow[j].Cells.Add(cell);
editDataTable.Rows.Add(tblRow[j]);

Самый прямой способ получить доступ к текстовым полям - сохранить их все в списке:

List<TextBox> textBoxes = new List<TextBox>();

и замените cell.Controls = new TextBox(); выше следующим:

TextBox tb = new TextBox();
textBoxes.Add(tb);
cell.Controls = tb;

И затем вы можете перебирать textBoxes впоследствии без необходимости искать их в дереве.

...