Member 12731597 Ответов: 3

Заполните последовательно пронумерованные текстовые поля из кода позади


У меня есть последовательно пронумерованные метки и текстовые поля с именами, например txtAmount1 - txtAmount9, и мне нужно установить их .Текстовое значение из базы данных. Я могу создать DataConnector и из него заполнить DataTable, а затем выполнить итерацию в процедуре foreach, но как я могу ссылаться на требуемые текстовые поля?

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

My code so far is:
DataTable dtFields = dcFields.DataSelect("SELECT [Sub-Type] FROM tblTransportSubType WHERE Type = '"+ bu +"'");
int co = 1;
foreach (DataRow row in dtFields.Rows)
{
lblType1.Text = row["Sub-Type"].ToString();
co ++;
}

Richard Deeming

"SELECT [Sub-Type] FROM tblTransportSubType WHERE Type = '"+ bu +"'"

Не делай этого так!

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

BillWoodruff

WPF ? Жерех ?

3 Ответов

Рейтинг:
26

Maciej Los

Подобный этому:

for(int i = 1; i<=9; i++)
{
    TextBox tb = (TextBox) this.Controls[string.Format("TxtBox{0}", i)];
    tb.Text = i.ToString();
}


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

Для получения более подробной информации, пожалуйста, смотрите:
Контроль.Собственность Управления (Системы.Окна.Формы) | Microsoft Docs[^]


BillWoodruff

Привет, есть ошибка в том, как вы используете "формат".

Maciej Los

Спасибо, Билл.
Исправлено!

Рейтинг:
20

F-ES Sitecore

Вы можете использовать FindControl, чтобы программным путем найти руководство.

for(int i = 1; i <=3; i++)
{
    TextBox txtAmount = (TextBox) FindControl("txtAmount" + i.ToString());

    System.Diagnostics.Debug.WriteLine(txtAmount.Text);
}


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

Поиск элементов управления | The ASP.NET форумы[^]


Рейтинг:
10

BillWoodruff

Если это WinForms, вы можете использовать оператор 'Find любого ControlCollection, чтобы найти все экземпляры элементов управления с указанным ключом' Name. Оператор 'найти имеет необязательный параметр SearchAllChildren, который будет рекурсивно работать свой путь через ContainerControls внутри своей целевой экземпляре коллекции controlcollection.

Для WPF, посмотрите на использование метода findname с 'запись visualtreehelper [^]

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

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

Если бы я не мог использовать привязку данных, я мог бы сделать что-то вроде этого:

Dictionary<int, Label> IndexToLabel = new Dictionary<int, Label>
{
    {0, label1 }, {1, label2} // and so on
};
По сути, жесткое кодирование быстрого доступа к этикеткам.


Richard Deeming

Поскольку числа являются последовательными, a List<Label> возможно, это лучший выбор, чем словарь. :)

BillWoodruff

Привет, Ричард, я подумал об этом, но решил, что хочу, чтобы индексы были "запечены", а не зависели от ординарности. спасибо, Билл