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

Обращение к элементу на другой форме

28.02.2016, 20:18. Показов 3303. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, Господа.

Начинаю работать с C#, помогите решить задачку.
есть две формы Главная (form1) и вторая (ConnectCom). При нажатии кнопки на второй форме, на первой форме в MenuStrip1 должно поменяться свойство Enable двух кнопок. Попробовал много вариантов, ничего не работает, вот один из них:
Главная (form1):
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
using System.Windows.Forms;
using System.IO.Ports;
namespace Example1
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }
 
        private void подключитьсяToolStripMenuItem_Click(object sender, EventArgs e)  //вызвать форму с настройками ком
        {
                ConnectCom f = new ConnectCom(); // создаем форму             
                f.ShowDialog(); // показываем            
        }
        private void отключитьсяToolStripMenuItem_Click(object sender, EventArgs e) //закрыть ком 
        {
            Class1.Port.Close();
        }  
     
        public Boolean DisconEnabled // через данный метод (или как он называется) будем обращаться с другой формы
        {
            get { return отключитьсяToolStripMenuItem.Enabled; }
             set { отключитьсяToolStripMenuItem.Enabled = value; }
        }
 
        public Boolean ConEnabled   // через данный метод (или как он называется) будем обращаться с другой формы
        {
            get { return подключитьсяToolStripMenuItem.Enabled; }
            set { подключитьсяToolStripMenuItem.Enabled = value; }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            DisconEnabled = false;
        }
    }
}
Вторая форма:
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
using System.Windows.Forms;
using System.IO.Ports;
 
namespace Example1
{
    public partial class ConnectCom : Form
    {
        public ConnectCom()
        {
            InitializeComponent();
              
        }
 
        private void ConnectCom_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();   //чтение портов доступных в системе
            comboBoxPort.Items.Clear();  //Очистка содержимого бокса
            comboBoxPort.Items.AddRange(ports); //Добавление найденных портов в бокс
            comboBoxPort.SelectedIndex = comboBoxPort.Items.Count-1; // выбрать последний элемент 
            comboBoxSpeed.SelectedIndex = 3;   // по умолчанию 9600         
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
           string portname1 = comboBoxPort.SelectedItem.ToString(); //выбрать ком порт из комбобокса
           string portSpeedstr = comboBoxSpeed.SelectedItem.ToString(); // выбрать скорость из комбобокса
           int portSpeed = Convert.ToInt32(portSpeedstr);  // преобразовать из строки в инт32
           Class1.Open(portname1, portSpeed);
           Form1 FMAin = new Form1(); // типо создаю переменную для обращения к главной форме     мне кажется ошибка тут    
           FMAin.DisconEnabled = true; // 
           FMAin.ConEnabled = false;
           this.Hide(); // закрыть форму
         
        }
    }
}
Добавлено через 8 минут
Сам разобрался, спасибо
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
using System.Windows.Forms;
using System.IO.Ports;
namespace Example1
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }
 
        private void подключитьсяToolStripMenuItem_Click(object sender, EventArgs e)  //вызвать форму с настройками ком
        {
                ConnectCom f = new ConnectCom(); // создаем форму             
                f.ShowDialog(this); // сделал так        
        }
        private void отключитьсяToolStripMenuItem_Click(object sender, EventArgs e) //закрыть ком 
        {
            Class1.Port.Close();
        }  
     
 
        private void Form1_Load(object sender, EventArgs e)
        {
            DisconEnabled = false;
        }
    }
}
вторая:
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
using System.Windows.Forms;
using System.IO.Ports;
 
namespace Example1
{
    public partial class ConnectCom : Form
    {
        public ConnectCom()
        {
            InitializeComponent();
              
        }
 
        private void ConnectCom_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();   //чтение портов доступных в системе
            comboBoxPort.Items.Clear();  //Очистка содержимого бокса
            comboBoxPort.Items.AddRange(ports); //Добавление найденных портов в бокс
            comboBoxPort.SelectedIndex = comboBoxPort.Items.Count-1; // выбрать последний элемент 
            comboBoxSpeed.SelectedIndex = 3;   // по умолчанию 9600         
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
           string portname1 = comboBoxPort.SelectedItem.ToString(); //выбрать ком порт из комбобокса
           string portSpeedstr = comboBoxSpeed.SelectedItem.ToString(); // выбрать скорость из комбобокса
           int portSpeed = Convert.ToInt32(portSpeedstr);  // преобразовать из строки в инт32
           Class1.Open(portname1, portSpeed);
           ((Form1)this.Owner).отключитьсяToolStripMenuItem.Enabled = true;  // вот так норм работает
           ((Form1)this.Owner).подключитьсяToolStripMenuItem.Enabled = false;
           this.Hide(); // закрыть форму
         
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.02.2016, 20:18
Ответы с готовыми решениями:

Обращение к элементу другой формы
Всем привет! Никто не подскажет как при даблклике по строке DataGridView, вывожу окно второй формы, и данные переданные на 2 форму забить в...

Обращение к элементу управления на другой форме
Добрый день! Есть две формы. В первой форме выпадающий список КомбоБокс. Во второй форме 3 поля ТекстБокс и кнопка сохранить. Нужно сделать...

Обращение к элементу другой формы
На Activity_1 например есть кнопка по ее нажатию в editText Activity_2 что-то добавляется . подскажите способы как это организовать. ...

5
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
28.02.2016, 20:38
dinar1990, ну это, конечно, будет работать, но всегда лучше использовать события, а делать публичные поля и гвоздями прибивать формы друг к другу при помощи свойства Owner и обращения через него, что нарушает инкапсуляцию и делает код черезчур связанным и непереносимым.
1
0 / 0 / 0
Регистрация: 24.01.2016
Сообщений: 25
28.02.2016, 21:54  [ТС]
Как это реализовать?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
28.02.2016, 22:04
dinar1990, в FAQ, на хабре, и еще очень много где на просторах интернета приведены примеры.

Кроме того, конкретно в вашем случае можно сделать еще проще, я сначала не заметил, что вы меняете свойства первой формы только при закрытии второй. Метод ShowDialog возвращает управление только тогда, когда форма закроется. И он возвращает значение свойства DialogResult формы, для которой вызывался. Соотвественно, вам достаточно вместо
C#
1
2
          ((Form1)this.Owner).отключитьсяToolStripMenuItem.Enabled = true;  // вот так норм работает
           ((Form1)this.Owner).подключитьсяToolStripMenuItem.Enabled = false;
Написать, к примеру,
C#
1
this.DialogResult = DialogResult.OK;
А потом на первой форме проверять:
C#
1
2
3
4
5
6
                ConnectCom f = new ConnectCom(); // создаем форму             
                if(f.ShowDialog()==DialogResult.OK)
{ 
     this.отключитьсяToolStripMenuItem.Enabled = true;  // вот так норм работает
      this.подключитьсяToolStripMenuItem.Enabled = false;
}
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
28.02.2016, 23:42
dinar1990, Относительно хорошее решение выглядит так:
В классе Device(который вы почему-то назвали Class1, sic!) вам нужно создать событие, которе будет вызываться тогда, когда состояние прибора меняется:
Класс Device
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public static class Device
    {
        public static SerialPort Port { get; private set; }
        public static event EventHandler StateChanged = delegate { }; 
 
        public static void Open(string portName)
        {
            Port = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One);
            Port.Open();
            StateChanged(Port, EventArgs.Empty);
        }
 
        public static void Close()
        {
            Port.Close();
            StateChanged(Port, EventArgs.Empty);
        }
    }


Далее, код первой формы должен подписаться на это событие и в обработчике настраивать доступность своих кнопок:
Главная форма
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 partial class Form1 : Form
    {
        private Button btOpen;
        private Button btClose;
 
        public Form1()
        {
            InitializeComponent();
 
            //создаем кнопки
            btOpen = new Button {Parent = this, Text = "Open"};
            btClose = new Button {Parent = this, Text = "Close", Top = 100 };
 
            //подписыаемся на события изменения состояния устройства
            Device.StateChanged += UpdateInterface;
        }
 
        private void UpdateInterface(object sender, EventArgs e)
        {
            //настраиваем доступность кнопок, в зависимости от состояния прибора
            btOpen.Enabled = !Device.Port.IsOpen;
            btClose.Enabled = Device.Port.IsOpen;
        }
    }


После этого, вам больше не нужно заботится ни о каких кнопках, ни о каких формах. Как только девайс поменяет свое состояние - главная форма обновит доступность своих кнопок.
(обратите внимание, теперь закрытие порта нужно делать через Device.Close() а не через Device.Port.Close()).
2
0 / 0 / 0
Регистрация: 24.01.2016
Сообщений: 25
29.02.2016, 19:59  [ТС]
Спасибо всем, помогли очень сильно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.02.2016, 19:59
Помогаю со студенческими работами здесь

Обращение к элементу управления другой формы
Здравствуйте! В коде обработки события нажатия кнопки формы есть вызов функции из стандартного модуля документа Эксель, в которую...

Обращение к другой форме
Здравствуйте, уважаемые форумчане. Подскажите, пожалуйста, как исполнить такой момент. У меня есть Form1, на которой есть 7...

Обращение к другой форме
Здравствуйте! Помогите пожалуйста разобраться с задачкой. Есть окно Form3, на нем есть 2 кнопки, при нажатии на первую - в richTextbox на...

Обратиться к элементу управления на другой форме
У меня такой не странный вопрос, как из одного окна в другом выключить кнопку? Если делаем так: //вызов из второй формы Первая...

Как обратиться к элементу в другой форме?
Есть две формы, главная и подчиненная (MDI). На главной есть StatusBar. Как мне к нему обратиться из подчиненной формы? Сорри за возможно...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru