Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
15 / 15 / 5
Регистрация: 26.11.2008
Сообщений: 94

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

02.04.2011, 20:27. Показов 3553. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: в зависимости от опрелённого числа сгенерировать столько же елементов управления определенного типа (TextBox). Но для каждого из елементов нужно создавать екземпляр, которому соответствует переменная, для которой есть имя. И соответственно для каждого текст. поля должно быть свое имя. У меня будет функция, которая будет генерировать строку с именем.
А вот как создать екземпляр с названием, которое хранится в строке???

CodeVariableReferenceExpression ЭТо то или нет?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.04.2011, 20:27
Ответы с готовыми решениями:

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

Присвоить переменной название последнего из городов, название которого содержит более 4 букв
Код Pascal 1Задан список городов. Присвоить переменной Т название последнего из городов, название которого содержит более 4 букв.

В первой строке Memo-поля хранится название отдела
В первой строке Memo-поля хранится название отдела, а в каждой следующей строке - фамилия и оклад сотрудников отдела. Расположить фамилии...

10
 Аватар для SandWraith
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
02.04.2011, 20:50
А что ты понимаешь под "названием" экземпляра? У контролов есть имена, тогда:
C#
1
2
var str = "MyTextBox";
var textBox = new TextBox() { Name = str; }
1
21 / 21 / 3
Регистрация: 11.07.2010
Сообщений: 63
02.04.2011, 20:55
Немного не понял вопрос, предложения противоречат друг другу.

1.
А вот как создать екземпляр с названием, которое хранится в строке???
Если надо создать элемент управления с определенным именем, то
C#
1
2
3
TextBox tb = new TextBox();
tb.Name = "YourString";
// и в массив его
2.
Но для каждого из елементов нужно создавать екземпляр, которому соответствует переменная, для которой есть имя.
Так же как и в прошлом, только вместо массива используйте Dictionary, где ключом будет выступать ваша переменная и ей будет соответствовать ваш созданный элемент управления как значение.
1
15 / 15 / 5
Регистрация: 26.11.2008
Сообщений: 94
02.04.2011, 20:56  [ТС]
тоесть то, что у Вас во второй строке "textBox" может быть одинаковое для любого количества елементов?
C#
1
2
3
4
var str = "MyTextBox";
            var textBox = new TextBox() { Name = str };
            var str = "MyTextBox2";
            var textBox = new TextBox() { Name = str };
так правильно?

C#
1
2
3
4
5
6
7
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox1.Location = new System.Drawing.Point(55, 163);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(212, 48);
this.textBox1.TabIndex = 1;
this.textBox1.Enter += new System.EventHandler(this.textBox1_Enter);
а как мне обратится к елементу по названию?
Оно же хранится в строке, а тут name это textBox1. Можно ли обратится к нему по названию?
0
 Аватар для SandWraith
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
02.04.2011, 21:13
Цитата Сообщение от LudchikLuk Посмотреть сообщение
а как мне обратится к елементу по названию?
Забывайте скорее о "названии" - нету такого. Обратиться можно по имени, выполнив поиск, но это не лучший способ. Правильнее всего созранить ссылку на контрол, в переменной, массиве, либо словаре.

А вообще, зачем вам плодить столько контролов? Расскажите имходную задачу, наверняка есть решение лучше, чем создавать textbox-ы.
1
21 / 21 / 3
Регистрация: 11.07.2010
Сообщений: 63
02.04.2011, 21:22
Цитата Сообщение от LudchikLuk Посмотреть сообщение
а как мне обратится к елементу по названию?
Оно же хранится в строке, а тут name это textBox1. Можно ли обратится к нему по названию?
Если у вас TextBox добавлен на форму, то
C#
1
(Controls["textBox1"] as TextBox).Text = "newText";
Если нет, то думаю не составит труда найти его в контейнере, где вы их храните.
1
15 / 15 / 5
Регистрация: 26.11.2008
Сообщений: 94
02.04.2011, 21:55  [ТС]
Спасибо огромное!!! реально выручили)

Добавлено через 16 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
System.Windows.Forms.TextBox[] ts = new System.Windows.Forms.TextBox[3];
for (int i = 0; i < 3; i++)
            {
                ts[i] = new System.Windows.Forms.TextBox();
            }
 for (int i = 0; i < 2; i++)
            {
                ts[i].Location = new System.Drawing.Point(i*100, 163);
                ts[i].Name = ss[i];
                ts[i].Text = tts[i];
                this.Controls.Add(ts[i]);                
            }
что я делаю не так? добавляеться только один текстбокс.


ой извините, все правильно))
1
21 / 21 / 3
Регистрация: 11.07.2010
Сообщений: 63
02.04.2011, 22:00
У меня создается 2, как и должно быть.
0
15 / 15 / 5
Регистрация: 26.11.2008
Сообщений: 94
03.04.2011, 23:39  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
namespace Educational_Software
{
    public partial class Form1 : Form
    {
        
        //for generating inputs and requared elements
        System.Windows.Forms.TextBox[] textboxes;
        System.Windows.Forms.Label[] labels;
        System.Windows.Forms.PictureBox[] pictureboxes;
        System.Windows.Forms.Button[] buttons;
 
        public Form1()
        {
            InitializeComponent();            
            …
        }
 
        public void show_exercise_panel()
        {
            …
            int n = all_available_subjects[curr_position.current_subject].ex_number_of_answers(curr_position.current_block, curr_position.current_exercise);
            
            create_inputs(n); 
        }
 
        public void create_inputs(int k)
        {
            textboxes = new System.Windows.Forms.TextBox[k];
            labels = new System.Windows.Forms.Label[k];
            pictureboxes = new System.Windows.Forms.PictureBox[k];
            buttons = new System.Windows.Forms.Button[k];
            for (int j = 0; j < k; j++)
            {
                textboxes[j] = new System.Windows.Forms.TextBox();
                labels[j] = new System.Windows.Forms.Label();
                pictureboxes[j] = new System.Windows.Forms.PictureBox();
                buttons[j] = new System.Windows.Forms.Button();
            }
            //MessageBox.Show("" + k);            
            for (int j = 0; j < k; j++)
            {
                string ts = generate_numer_str();
                init_controls(ts, j, labels[j], textboxes[j], pictureboxes[j], buttons[j]);
            }
 
        }
 
        public void init_controls(string sname, int h, Label l, TextBox t, PictureBox p, Button b)
        {
            //MessageBox.Show(sname);
            string wel = "Відповідь №";
            l.Name = "Label" + sname;            
            l.Location = new System.Drawing.Point(10, 100 * h);
            l.Text = wel + (h+1).ToString();
            this.panelInput.Controls.Add(l);
 
            t.Name = "TextBox" + sname;
            t.Location = new System.Drawing.Point(120, 100 * h);
            t.Size = new System.Drawing.Size(200, 30);
            t.TextChanged += new System.EventHandler(this.change_equation);
            this.panelInput.Controls.Add(t);            
 
            b.Name = "Button" + sname;
            b.Location = new System.Drawing.Point(330, 100 * h);
            b.Text = "Очистити";
            b.Click += new System.EventHandler(this.remove_text);
            this.panelInput.Controls.Add(b);            
 
            p.Name = "PictureBox" + sname;
            //MessageBox.Show(p.Name);
            p.Location = new System.Drawing.Point(120, 30 + 100 * h);
            p.Size = new System.Drawing.Size(200, 50);
            p.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.panelInput.Controls.Add(p);
 
        }
 
        public void change_equation(object sender, EventArgs e) 
        {
            TextBox sn = sender as TextBox;
            string tempstr = sn.Text;
            
            string stn = "PictureBox" + sn.Name.Remove(0, 7);
            //MessageBox.Show(sn.Name + "  " + (this.panelInput.Controls[stn] as PictureBox).Name);
            WriteEquation(tempstr, (this.panelInput.Controls[stn] as PictureBox));
        }
 
        private string GetGifFilePath(string img)
        {
            return Path.Combine(Path.GetTempPath(), img);
        }
 
        private void WriteEquation(string equation, PictureBox pbx)
        {
            //MessageBox.Show(equation);
            if (pbx.Image != null)
                pbx.Image.Dispose();
 
            if (equation.Length > 0)
            {
                string tempGifFilePath = GetGifFilePath(pbx.Name + ".gif");
                try
                {
                    NativeMethods.CreateGifFromEq(equation, tempGifFilePath);
                    pbx.Image = Image.FromFile(tempGifFilePath);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
            else
            {
                pbx.Image = Image.FromFile(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "emptyeq.gif"));
            }
        }
 
 
        public void remove_text(object sender, EventArgs e)
        {
            Button sen = sender as Button;
            string sn = sen.Name.Remove(0, 6);            
            (this.panelInput.Controls["TextBox" + sn] as TextBox).Text = "";
            
        }
Возникла другая проблема.
Во время выполнения я создаю групы елементов (метку, тексбокс, кнопку, которая очищает этот чекбокс, и пикчебокс, в котором отображается формула, соответствующая строке в тексбоксе).
Для этого я подключаю обработчики события
C#
1
2
b.Click += new System.EventHandler(this.remove_text);
t.TextChanged += new System.EventHandler(this.change_equation);
Тоесть для тексбокса каждой групы есть кнопка, по нажатию на которую, этот чекбокс очищается.
Но почему то все кнопки работают для первого тексбокса. Та же проблема и со вторым обработчиком.
Интересно, что когда я поставила месиджбокс, то все заработало правильно
C#
1
2
3
        public void init_controls(string sname, int h, Label l, TextBox t, PictureBox p, Button b)
        {
            MessageBox.Show(sname);
Проблема как то со ссылками? Или что-то должно очищаться?

Добавлено через 26 минут
я уже нашла проблему
C#
1
2
3
4
5
6
7
public string generate_numer_str()
        {
            int T;
            System.Random randomNumberGenerator = new System.Random();
            T = randomNumberGenerator.Next(1000, 9999);
            return T.ToString();
        }
Функция, котороя генерировала уникальный номер для групы елементов, возвражала результат в диапазоне от 1 до 100, и поетому их названия совпадали. Увеличила диапазон и все заработало!

Всем спасибо, что научили меня новому!!

Добавлено через 1 час 5 минут
таки проблема была не в этом, я просто в цикле месиджбокс ставила.
Если функцию, которая генерирует произвольное число ставить в цикле, то она какбуд-то вызываеться один раз и на каждой итерации присваивает одно и то же первое значение, потому что если вставить дополнительную переменную, которая будет собирать все эти значения а потом выводить, то оказываеться что каждый раз одиковое значение.
C#
1
2
3
4
5
for (int j = 0; j < k; j++)
            {
                string ts = generate_numer_str();
                init_controls(ts, j, labels[j], textboxes[j], pictureboxes[j], buttons[j]);
            }
интересно почему если функция вызывается внутри цикла, то она вызываться не на каждой итерации а только первый раз? это что-то с распределением памяти связано?
0
21 / 21 / 3
Регистрация: 11.07.2010
Сообщений: 63
03.04.2011, 23:41
Выложите сам проект, пожалуйста.
0
 Аватар для SandWraith
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
03.04.2011, 23:46
Цитата Сообщение от LudchikLuk Посмотреть сообщение
System.Windows.Forms.TextBox[] textboxes;
System.Windows.Forms.Label[] labels;
System.Windows.Forms.PictureBox[] pictureboxes;
System.Windows.Forms.Button[] buttons;
???
Если у вас есть набор элементов, например, связка картинка+текст+кнопка и необходимо их многократно пробублировать, то необходимо вынести их в отдельный UserControl, а затем многократно создавать уже его. Логику работы такого "кирпичика" системы так же можно реализовать внутри UserControla.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2011, 23:46
Помогаю со студенческими работами здесь

Возможно ли вызвать функцию, имя которой хранится в переменной типа char* ?
Или возможно ли создать указатель на функцию по имени в переменной. Извиняюсь за неконкретный вопрос, просто ещё не полностью продумал...

Создать древовидное меню, структура которого хранится в XML-файле
Добрый день. Мне нужно сделать древовидное меню и чтобы оно загружалась из xml файла, подскажите в какой компонент загружать , каким...

Возможно ли циклом менять название переменной структуры?
Имеется структура: struct SPEC { char vuz1; char vuz2; char vuz3; }; Заполнение происходит так: for (i=0;i&lt;m;i++) ...

Возможно ли взять число из массива в название переменной?
Дан текст, имеющий вид x1+x2+...+xn, где xi - цифра или двузначное число. Если до или после знаков + имеются пробелы, удалите их. Найдите...

Создать функцию с именем, которое хранится в переменной
Думаю суть вопроса понятна. Пытался реализовать следующим образом: class Controller{ function __construct(){ foreach...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru