Bice90 Ответов: 2

Как изменить содержимое динамически создаваемого текстового поля? [С#]


уважаемый друг,

У меня есть вопрос по поводу упомянутой проблемы в названии.

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

Итак, когда я нажимаю на один из них, создается новое текстовое поле. Имя текстового поля будет именем слоя +"txtbox1". Так, например: appletxtbox1. Допустим, я одновременно создаю второе текстовое поле с именем appletxtbox2. Кроме того, предположим, что textbox1 содержит вес яблока в кг, а textbox2-в фунтах. Затем, я хочу, чтобы вручную обновить значение в поле textbox2, которая содержит вес в фунтах и исходя из этого я хочу, чтобы обновить значение в текстовое поле textbox1, с помощью TextBoxChanged обработчик событий. Я стараюсь описать его лучше, показывая фактическую часть кода.

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

TextBox txtbxAt;
Label labi = sender as Label;
private void setLabelClick(object sender, EventArgs e)
{
txtbxAt = new TextBox();
txtbxAt.Name = labi.Text+"AtBox"; //labi is the name of the clicked label and I add the "atBox" to it, so I create an ID that I can follow later.
txtbxAt.Text = element.SomeValue.ToString(); //I put some value in the textbox; element is from a class I created
txtbxAt.TextChanged += new EventHandler(txtbxAt_TextChanged); //create eventhandler
groupBox3.Controls.Add(txtbxAt); //add textbox to the form

}


Таким образом, основываясь на приведенном выше коде, я могу динамически создавать текстовое поле и писать в нем. Но тогда, если есть подобное текстовое поле, я не могу сделать их "перекрестными помехами". Поэтому, когда я нахожусь в eventhandler, я не могу обновить другое текстовое поле, написав в нем. Я протестировал eventhandler, просто создав всплывающее окно сообщений и напечатав некоторые из используемых мной значений. Это было успешно, так что eventhandler может видеть значения, с которыми я хочу работать.

В текстовом поле textchanged eventhandler я хочу сделать что-то вроде

(f.Symbol+"AtBox").Text = f.SomeValue.ToString();
, где f-это просто элемент, который я знаю по меткам, которые я нажимаю. Поэтому, когда я набираю box1, я хочу обновить box2 и наоборот.

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

Не могли бы вы подсказать мне, как добраться до динамически создаваемого текстового поля и обновить его значение на основе значения другого динамически создаваемого текстового поля?

Заранее благодарю вас!

2 Ответов

Рейтинг:
17

OriginalGriff

Сделать это не сложно, но это будет сделано тем, что вы пытаетесь сделать: все, что вам нужно сделать, это "найти" правильный контроль. Это не сложно само по себе: он находится в коллекции groupBox3.Controls, поэтому он легко доступен.

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

Control[] matched = Controls.Find(f.Symbol + "AtBox", true);
if (matched.Length > 0 && matched[0] is TextBox tb)
    {
    tb.Text = ...
    }
Я думаю, так и должно быть.


Bice90

Большое вам спасибо, вы даже не представляете, как это мне помогло! Это работает, как я и ожидал! Похоже, мне придется копнуть глубже в этой теме об элементах управления.
Хорошего вам дня!

OriginalGriff

Всегда пожалуйста!

Рейтинг:
11

RickZeeland

Другим вариантом было бы использовать привязка данных, см. статью CodeProject: Понимание Простой Привязки Данных[^]


Bice90

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