Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 25.09.2020
Сообщений: 8

Считать текст из динамических контролов

25.09.2020, 02:08. Показов 1482. Ответов 12

Студворк — интернет-сервис помощи студентам
Здравствуйте, тема уже заезженная, но в часто задаваемых вопросах момент один все же не освещен
Знаю, как считать данные из динамических созданных textbox
Но задача такая: создать метод, который создаст матрицу из чисел, которые будут введены в текстбоксы(для каждого числа отдельный, потому создаются динамически)
Но при этом как только создается экземпляр формы, в нем уже нет информации о том, что введено в текстбоксы
Делал примерно так:
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
 public void CreateTextBoxesForMatrix (int countRows)
        {
            groupBox1.Controls.Clear();
            int startLocation_X = -35;
            int startLocation_Y;
            
 
            for (int i = 0; i < countRows; i++)
            {
                startLocation_Y = 20;
                startLocation_X += 55;
                for (int j = 0; j < countRows; j++)
                {
                    groupBox1.Controls.Add(value: new TextBox()
                    {
                        Name = $"textBox{j + 1 + i * countRows}".ToString(),
                        Location = new Point(startLocation_X, startLocation_Y),
                        Text = "",
                        Size = new Size(50, 10)
                    });
                    startLocation_Y += 40;
                }
            }
        }
А считываю вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static double[,] CreateMatrix() 
        { 
            var form1 = new Form1();
            int n = form1.SizeOfMatrix; // выбирает свойство, возвращающее нужный размер матрицы
            double[,] matrix = new double[n, n];
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    var a = (form1.groupBox1.Controls[$"textBox{j + 1 + i * n}"] as TextBox).Text;
                    matrix[i, j] = Convert.ToDouble(a);
                }
            }
            return matrix;
        }
В итоге выскакивает исключение, так как строки в текстбоксах пустые в новом экземпляре формы(
Подскажите кто-нибудь, как это можно обойти
Заранее благодарен
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.09.2020, 02:08
Ответы с готовыми решениями:

Создание события для динамических контролов
Привет всем у меня такая проблемка Я создал динамически массив контролов, как сделать событие чтоб при нажатие на один из этих...

Обработчик события для массива динамических контролов
Как создать сразу для всего массива динамически созданных контролов один одинаковый обработчик события? //В цикле picbox.Click += new...

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

12
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
25.09.2020, 04:59
C#
1
var form1 = new Form1();
тут вы создаёте новую форму, но вероятно хотели извлечь текст из уже созданной...
1
0 / 0 / 0
Регистрация: 25.09.2020
Сообщений: 8
25.09.2020, 10:35  [ТС]
Someone007, в этом вся и проблема
Я не знаю, как без экземпляра формы добраться до groupbox и до контролов внутри него
(groupbox является полем этой формы)
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
25.09.2020, 10:39
Цитата Сообщение от nickolaycat Посмотреть сообщение
как без экземпляра формы добраться до groupbox и до контролов внутри него
Никак. Нужно каким-то образом передать ссылку на нужный экземпляр формы в метод (или только информацию, которая требуется методу).

Метод CreateMatrix у вас где находится? В каком-то другом классе или в классе формы?
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
25.09.2020, 10:39
nickolaycat
Передать тот экземпляр 'form1', в котором происходит ввод значений, в качестве параметра метода 'CreateMatrix':
C#
1
public static double[,] CreateMatrix(Form1 form1)
Хотя, более корректным решением будет передача в качестве параметра не формы и не контролов, а именно коллекции значений, необходимых для работы функции.
1
0 / 0 / 0
Регистрация: 25.09.2020
Сообщений: 8
25.09.2020, 12:32  [ТС]
Метод находится в другом классе

Добавлено через 2 минуты
Спасибо. А не подскажете, где тогда лучше создавать экземпляр формы? Чтоб в нем сохранилась информация, которая мне требуется
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
25.09.2020, 12:52
nickolaycat
У вас метод 'CreateMatrix' вызывается из самой формы?
0
0 / 0 / 0
Регистрация: 25.09.2020
Сообщений: 8
25.09.2020, 14:14  [ТС]
Да, по нажатию кнопки
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
25.09.2020, 14:20
Лучший ответ Сообщение было отмечено nickolaycat как решение

Решение

nickolaycat
Тогда сигнатуру метода заменить на:
C#
1
public static double[,] CreateMatrix(Form1 form1)
В самом методе убрать код создания формы.

А в точке вызова вызывать его, передавая 'this' (т.е. ссылку на ту форму, которая его вызывает), т.е CreateMatrix(this);
1
0 / 0 / 0
Регистрация: 25.09.2020
Сообщений: 8
28.09.2020, 20:31  [ТС]
Решение помогло, всем спасибо
Но вот возник уже вопрос на будущее: если бы метод создания матриц вызывался бы не из формы, то передать его через this, разумеется, было бы невозможно, как тогда бы следовало передать экземпляр формы в метод?
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
05.10.2020, 05:27
nickolaycat
Форма ведь в любом случае есть, вот указатель на неё и передать. Только конкретно в этом случае это немного бессмысленным выглядит. Как-то так?
C#
1
2
3
var form = new Form1();
SomeClass.CreateMatrix(form);
form.ShowDialog();
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
06.10.2020, 21:32
nickolaycat, плохое решение, когда методы модели, типа CreateMatrix, зависят от формы. Форма должна быть оболочкой над этими методами, а у вас наоборот, все равно что компьютер зависит от монитора.
Если необходимо передать данные из формы в метод модели, то эти данные сохраняются в массив и уже массив передается в метод. Т.е. в компьютер для обработки передаются даннные о кликах мыши, а не пихаются сами мышь с монитором.
0
0 / 0 / 0
Регистрация: 25.09.2020
Сообщений: 8
07.10.2020, 22:06  [ТС]
Через создание нового экземпляра не получится, в нем введенной информации нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2020, 22:06
Помогаю со студенческими работами здесь

Ошибка System.NullReferenceException при создании динамических контролов
На форме по нажатию на кнопки можно создать до трех контролов DateTimePicker. Их значение нужно передать в класс Class1. Если создается все...

Удаление динамических контролов
В класе описана кнопка котороая создайот динамически кнопку і текстБокс. кнпока которая создайотся динамически должна удалять і саму себя і...

Создание динамических контролов.
Почитал,у вас на форуме как создать динамически контролы,пробовал не получилось.А надо было создать радиобаттоны(создаю голосование).Решил...

Отличие динамических и статических контролов
Почему когда я создаю статических контрол с именем допустим 'Name1', то Private Sub Name1_Click() работает правильно и обрабатывается...

Сложный уровень: как поймать событие от динамических контролов?
Народ, если кто в курсе темы, может подскажет в какую сторону двигаться... В общем есть класс, в нём объявлены пару контролов и одно...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru