Aftab Iqbal Clips Ответов: 2

Как добавить динамические элементы управления в htmltable с помощью ASP.NET с#


Привет Всем,
попытка добавить некоторые динамические элементы управления в HtmlTable в коде позади но получение ошибки на FindControl и ошибка выглядит следующим образом
Object reference not set to an instance of an object.

И FindControl вызывает эту ошибку
когда я помещаю идентификатор элемента управления вручную в findcontrol, он работает нормально, но когда я использую его с циклом для поиска всех элементов управления, он выдает ошибку.
я буду глубоко признателен Вам за помощь

Желаю вам хорошего дня.

Что я уже пробовал:

HtmlTable table = new HtmlTable();
            HtmlTableRow tr = new HtmlTableRow();
            HtmlTableCell td = new HtmlTableCell();
            foreach (Control c in pnl.Controls)
            {
                TextBox temp_txt = (TextBox)pnl.FindControl(c.ID);  //causing error
                                td.Controls.Add(temp_txt);
                tr.Controls.Add(td);
                table.Controls.Add(tr);
            }            
            pnl.Controls.Add(table);

BillWoodruff

посмотрите, поможет ли это: https://stackoverflow.com/a/3731146

2 Ответов

Рейтинг:
5

Sandeep Mewara

Цитата:
Ссылка на объект не устанавливается на экземпляр объекта.

Подробности об ошибке вы видите: Класс NullReferenceException (System) | Microsoft Docs[^]
Цитата:
Исключение NullReferenceException возникает при попытке доступа к члену типа, значение которого равно null

Возможно потому что:
1. Вы забыли создать экземпляр ссылочного типа
2. Вы забыли измерить массив перед его инициализацией.
3. Вы получаете нулевое возвращаемое значение из метода, а затем вызываете метод для возвращаемого типа.
4. Вы используете выражение (например, связываете список методов или свойств вместе) для получения значения
5. Вы перечисляете элементы массива, который содержит ссылочные типы, и ваша попытка обработать один из элементов вызывает
6. исключение создается методом, который передается null

Цитата:
получение ошибки на FindControl

Это означает, что имя элемента управления неверно или отсутствует в той иерархии элементов управления, где вы пытаетесь его найти.

foreach (Control c in pnl.Controls)
{
    TextBox temp_txt = (TextBox)pnl.FindControl(c.ID);  //causing error
    td.Controls.Add(temp_txt);
С приведенным выше кодом неясно, что вы хотите сделать на самом деле. Приведенный выше код циклически перебирает все элементы управления, присутствующие на панели, а затем добавляет их в таблицу, а затем в конце добавляет таблицу обратно на панель. Как будто управление находится в двух местах. Затем вы добавляете tr/td в таблицу для каждого элемента управления в цикле. Он испорчен - в основном это приводит к несоответствию элементов управления и ошибкам. Кроме того, все ли элементы управления в панели-это текстовое поле, в которое вы бросаете текст?


Aftab Iqbal Clips

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

Рейтинг:
1

F-ES Sitecore

Изменить

foreach (Control c in pnl.Controls)


к

foreach (Control c in pnl.Controls.OfType<TextBox>())


Путь asp.net работа под прикрытием заключается в том, что он преобразует ваш html в буквальные элементы управления, поэтому, хотя ваша страница aspx похожа;

<asp:Panel id="pnl" runat="server">
    <p>Some text</p>
    <asp:Textbox id="txt1" runat="server"/>
</asp:Panel>


asp.net преобразует его в это при компиляции

<asp:Panel id="pnl" runat="server">
    <asp:Literal id="literal1" runat="server"><p>Some text</p></asp:Literal>
    <asp:Textbox id="txt1" runat="server"/>
</asp:Panel>


Он даже делает это для "нетекста", такого как новые строки, интервалы и т. д., Поэтому в вашей панели больше элементов управления, чем вы думаете .OfType гарантирует, что вы получите только те, которые вас интересуют.