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

Новый класс для передачи данных

09.04.2016, 19:10. Показов 1661. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Помогите, пожалуйста, разобраться с задачей. Есть форма1 на ней две кнопки. При нажатии на кнопку1 происходит ряд вычислений, по результатам которых создается массив. Далее, массив передается в таблицу, расположенную на форме3.
При нажатии кнопки2 должна просто открыться форма3, без выполнения каких либо вычислений.

код на первой форме
C#
1
2
 Form3 f3 = new Form3(rezult);
            f3.Show();
код на форме3
C#
1
2
3
4
5
6
7
8
9
 public Form3(string[] rezult)
        {
            InitializeComponent();
            int i = 0;
                while (rezult[i] != null) //цикл заполняет таблицу данными из массива в первой форме
                {
                    dataGridView1.Rows.Add(i.ToString(), rezult[i]);
                    i++;
                }
Это работает, но что бы открыть форму но нажатии кнопки2 приходится немного извращаться
C#
1
2
3
4
string[] pusto;  //создаю пустой массив что бы передать хоть что-то
pusto = new string[0];
Form3 fr3 = new Form3(pusto);
fr3.Show();
немного извращенно, но работает. Прочитал, что в такой ситуации лучше использовать новый класс. К тому же из формы3 то же надо будет передавать данные на форму1, но над этим вопросом я еще не размышлял. Примеров много, но они не понятны. Помогите разобраться.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2016, 19:10
Ответы с готовыми решениями:

Типы данных С# для передачи данных через TCP
подскажите пожалуйста какой тип переменной лучше всего использовать в C# для передачи данных через TCP, что бы можно было передать...

Определяя класс в PHP, мы создаем новый ТИП данных?
Здравствуйте. Собственно говоря, вопрос уже в заголовке. На PHP недавно обратил внимание: программировал на Java, где класс...

Аудиоканал для передачи данных
Хотелось бы передать данные (пакет 100 байт раз в час) через аудиоканал в одну сторону без подтверждения, но с CRC. Например с динамика...

7
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
09.04.2016, 20:05
Лучший ответ Сообщение было отмечено WersaT как решение

Решение

Ну в принципе, больших ошибок нет. Ты всё правильно делаешь.
Только вот это нехорошо:
Цитата Сообщение от WersaT Посмотреть сообщение
создаю пустой массив что бы передать хоть что-то
Достаточно оставить пустой конструктор и вызывать его, если ничего передавать не нужно (это называется перегрузкой конструкторов):
C#
1
2
3
4
public Form3()
{
    InitializeComponent();
}
Хотя зачем открывать форму, предназначенную для отображения массива, без массива?
Ну и изучать второй пункт этого сообщения Ответы на 7 самых частых вопросов по WinForms
1
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 293
09.04.2016, 20:17  [ТС]
если я оставлю конструктор пустым, то как я передам в него данные из формы1?
public Form3()
{
InitializeComponent();
}
а открывать форму без передачи массива нужно для выставления настроек. Там 2 radiobutton и 8 checkbox. Вот эти значения (checked=true/false) нужно будет вернуть на первую форму, да и после вычисления элементы массива, выбранные пользователем нужно вернуть на первую форму. По этому и решил, что создавать новый класс целесообразнее.
Ответы на 7 самых частых вопросов по WinForms
А это я читал, там не понятно.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
09.04.2016, 21:03
Лучший ответ Сообщение было отмечено WersaT как решение

Решение

Цитата Сообщение от WersaT Посмотреть сообщение
если я оставлю конструктор пустым, то как я передам в него данные из формы1?
Один конструктор пустой, для настроек, как ты хочешь.
Второй конструктор такой как у тебя с массивом.
Т.е. в классе Form3 у тебя два конструктора:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public Form3()
{
    InitializeComponent();
}
 
public Form3(string[] rezult)
{
    InitializeComponent();
    int i = 0;
    while (rezult[i] != null) //цикл заполняет таблицу данными из массива в первой форме
    {
        dataGridView1.Rows.Add(i.ToString(), rezult[i]);
        i++;
    }
Для передачи настроек конечно, нужно использовать класс настроек, например такой:
C#
1
2
3
4
5
6
7
8
9
public class SettingsClass
{
    public bool CheckBox1 { get; set; }
    public bool CheckBox2 { get; set; }
    public bool CheckBox3 { get; set; }
    public bool CheckBox4 { get; set; }
    public bool RadioButton1 { get; set; }
    public bool RadioButton2 { get; set; }
}
В классе Program нужно создать свойство типа SettingsClass, для передачи настроек между элементами приложения:
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
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
 
    private static SettingsClass _settings;
 
    public static SettingsClass Settings
    {
        get
        {
            if (_settings==null)
            {
                _settings=new SettingsClass();
            }
            return _settings;
        }
    }
 
}
После этого в любой форме ты можешь обратиться к Program.Settings, чтобы задать или установить соответствующие свойства.
Пример изложенного выше: из первой формы можно открыть форму настроек, изменить их, закрыть форму настроек и увидеть, что изменённые настройки отобразились в первой форме.

Это только один из способов. Можно также использовать Application.Settings — встроенный механизм сохранения настроек, основанный на биндинге.
Вложения
Тип файла: zip WindowsFormsApplication1.zip (20.8 Кб, 6 просмотров)
1
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 293
10.04.2016, 02:11  [ТС]
Пол ночи разбирался, но получилось. Огромное спасибо.
В делфи сделано все гораздо проще form2.Radiobutton1.Checked:=true; и все. Сдесь заморочено.
Еще раз спасибо
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.04.2016, 02:53
Цитата Сообщение от WersaT Посмотреть сообщение
В делфи сделано все гораздо проще form2.Radiobutton1.Checked:=true; и все.
Можно у контролов поставить Modifiers = Public и они будут доступны извне. Но это нарушение принципа инкапсуляции
0
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 293
10.04.2016, 17:21  [ТС]
Можно у контролов поставить Modifiers = Public и они будут доступны извне. Но это нарушение принципа инкапсуляции
Почему такое действие среди программистов считается не желательным? Ведь 12 лет назад делфи было весьма распространено и популярно. Да и в visual studio до конца не отказались. Везде написано, что так делать не надо, но не пишут почему.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.04.2016, 19:35
Цитата Сообщение от WersaT Посмотреть сообщение
Почему такое действие среди программистов считается не желательным?
Потому что есть принципы ООП: инкапсуляция (твой случай), полиморфизм, наследование. Принципы эти не взяты с потолка, а выработаны программистами.
Вот вернёмся к твоему примеру. Ты предлагаешь настройки брать или изменять непосредственно через обращение к контролам формы, как в delphi (хотя уверен, что и там принципы ООП нужно соблюдать):
Delphi
1
form2.Radiobutton1.Checked:=true;
Но ведь для этого нужно держать в памяти вторую форму. И форма, запрашивающая настройки, должна знать об экземпляре второй формы. А если форм не две, а больше? Откуда пятая форма узнает, что первая форма открыла форму настроек и настройки нужно брать оттуда?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.04.2016, 19:35
Помогаю со студенческими работами здесь

Оборудование для передачи данных по Wi-fi
Доброго времени суток всем. Нужна помощь, на расстоянии 2х км есть 2 точки доступа TP-Link с внешней антенной. Соединяю их, между...

Кнопка для передачи данных в БД
Подскажите пожалуйста, создал кнопку. По ней отправляются данные в БД, все хорошо отправляется выводится и т.д. Но эта кнопка слишком...

Сжатие данных для передачи по UART
Добрый день! Контроллер передаёт по UARTу данные (числа разделённые знаком табуляции в формате ASCII) размером от 256 байт до 2 кБ. Я думаю...

Кодировка данных для передачи по TCP/IP
Здравствуйте форумчане!! Тут недавно начал делать сервер, и что делает этот сервер, он принимает команды разного рода, типа &quot;user get...

Разработать библиотеку процедур для приёма-передачи данных по сети на основе протокола UDP и текст для её проверки
Здравствуйте. Вот задание. Разработать библиотеку процедур для приёма-передачи данных по сети на основе протокола UDP и текст для её...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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