Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
DLD
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 47
1

Правильно обратиться к динамически созданному Controls

13.08.2019, 02:42. Просмотров 962. Ответов 12
Метки нет (Все метки)

Доброго времени суток . . . У меня есть созданные программно Label на chart1, которые имеют имена MyLabel0, MyLabel1, MyLabel2. . . Мне нужно программно изменить положение отдельно взятой Label, задав его в textBox1. Скажите, почему не работает код:
C#
1
 (this.Controls["MyLabel" + i.ToString()] as Label).Location = new Point(120, Convert.ToInt32(textBox1.Text));
Выдает исключение "System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта.""
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2019, 02:42
Ответы с готовыми решениями:

Как обратиться к динамически созданному TextBox
namespace WindowsFormsApplication5 { public partial class Form1 : Form { public...

Как обратиться к созданному listView
Здравствуйте. Пишу программу, и столкнулся с такой проблемой: Создаю listView вот так: new...

Обращение к динамически созданному DataGridView
Здравствуйте! Такая проблема. Создаю DataGriedView динамически по нажатию кнопки на панели...

Как подключить контекстное меню к динамически созданному компоненту
Весь вопрос в заголовке Я делаю так : PictureBox.ContextMenu = contextMenuStrip1; Сама ошибка:...

Как получить глобальный доступ к динамически созданному объекту
вообщем кнопка tb1 определяется в button1_Click и следовательно она локальная,и недоступна в её...

12
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
13.08.2019, 05:04 2
код сам по себе рабочий. NRE возникает скорее всего из-за того что такого элемента нет в коллекции. проверьте отладчиком, на какой именно итерации возникает ошибка. Допускаю, что у вас нет нулевого лейбла, потому что стандартное наименование у контролов начинается с единицы. ну либо вы выходите за верхнюю границу количества лейблов

Добавлено через 1 минуту
и еще, советую использовать numericUpDown, а не textbox. Вам же нужны только числа.
1
DLD
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 47
13.08.2019, 23:48  [ТС] 3
Toros1992, а я изменил код (чтобы найти исключение)
C#
1
2
int r = 1;
(this.Controls["MyLabel" + r.ToString()] as Label).Location = new Point(120, Convert.ToInt32(textBox1.Text));
программно создал 4 Label и при первом обращении к Label1 появилось исключение.

Добавлено через 5 минут
Toros1992, не пойму в чем дело. Создал динамически 4 Label (вижу что создал). Далее запускаю такой код чтобы узнать их имена
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void BtnMyCount_Click(object sender, EventArgs e)
      {
         List<Control> listlLabels = new List<Control>();
         foreach (var label in Controls.OfType<Label>())
         {
            listlLabels.Add(label);
         }
         for (int i = 0; i < listlLabels.Count; i++)
         {
            MessageBox.Show((i.ToString() + "*" + listlLabels[i].ToString()), "");
         }
      }
вообще не появляется MessageBox и List тоже пустой.
0
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
14.08.2019, 01:17 4
Вы их наверное на панели какой то создаёте? В этом случае они будут находиться в коллекции контролов панели, а не формы, в которой вы их ищете
1
14.08.2019, 01:17
DLD
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 47
14.08.2019, 23:16  [ТС] 5
Toros1992, Вид-Другие окна-Структура документа: там нет никаких панелей (это для "перекрестной" проверки). Может быть причина в том, что Label добавляются на Chart по событию Chart1_MouseClick ??

Добавлено через 1 минуту
У меня уже была такая ошибка:
HTML5
1
http://www.cyberforum.ru/windows-forms/thread2486312.html
0
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
14.08.2019, 23:18 6
Лучший ответ Сообщение было отмечено DLD как решение

Решение

Я как раз и имел в виду, что родительским контейнером для ваших контролов является какой-то другой контрол. А вы их ищете в коллекции самой формы. Раз добавляете на chart, то и ищите там де
0
DLD
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 47
15.08.2019, 22:11  [ТС] 7
Toros1992, может код подскажете ?. . . как найти Label на Chart . . .
0
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
15.08.2019, 23:05 8
Покажите код добавления
0
DLD
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 47
16.08.2019, 21:27  [ТС] 9
Toros1992,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Label AddMyLabel(int i) 
{
Label MyLabel = new Label();
MyLabel.Name= "MyLabel" + i.ToString();
 . . . .
}
. . .
private void Chart1_MouseClick(object sender, MouseEventArgs e)
{
. . .
Label MyLabel = AddMyLabel(i);
. . .
}
Добавлено через 16 минут
Toros1992, спасибо. Вы своим постом № 6 направили меня по нужному пути.
0
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
16.08.2019, 21:30 10
DLD, Если проблема решилась, то отлично. Если нет, то в Вашем последнем фрагменте вы обрезали точками все самое нужное.
Вы привели код создания лейбла, а я просил добавления. Нужно понять к какой именно коллекции контролов вы его добавляете.
0
DLD
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 47
16.08.2019, 21:33  [ТС] 11
Toros1992, проблема решилась. А все-таки, разве строки 8 и 11 - это не код добавления ??????? (через вызов метода AddMyLabel). Я думаю, что кликая по Chart1 - контрол добавляется туда же (выходит - так оно и есть)
0
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
16.08.2019, 21:41 12
Это все только код создания экземпляра класса Label. У вас где то ниже по коду должно быть что-то вроде
C#
1
2
3
Controls.Add(MyLabel);
//Или 
MyChart.Controls.Add(MyLabel);
1
DLD
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 47
16.08.2019, 22:26  [ТС] 13
Toros1992, точно есть . . . извините, что не заметил. . . потому что код большой. Еще раз - спасибо.
0
16.08.2019, 22:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2019, 22:26

Как из класса обратиться к Controls формы?
Собственно вопрос в заголовке this.Controls.Add(player.pbplayer); этот код находится в...

Как обратиться к методу собственного элемента через Controls
Часто использую способ обращения к различным элементам при помощи такой конструкции: public void...

Как обратиться к динамически созданным контроллам
Добрый день. Столкнулся с проблемой: после того, как была динамически создана кнопка, дальнейшая...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru