vebi1000 Ответов: 2

Почему переключатель checked не установлен в true.


Я разрабатываю небольшое приложение с использованием visual studio 2017 edition. У меня есть два переключателя в главном меню. Я поставил их свойства checked в false при проектировании и установить proprty модификаторы для общественности. У меня есть событие RadioButton_checkedChanged в файле mainFroms.cs, как показано ниже.
private void radioButtonA_CheckedChanged(object sender, EventArgs e)
{
    if (radioButtonA.Checked == true)
    {
        Address = 192;
        ToAddress = 150;
    }
}
private void radioButtonB_CheckedChanged(object sender, EventArgs e)
{
    if (radioButtonB.Checked == true)
    {
        Address = 255;
        ToAddress = 100;
    }
}

У меня есть класс последовательного порта, где я получаю данные от аппаратного обеспечения. У меня есть экземпляр последовательного порта в mainForm.
в последовательном классе я использовал экземпляр mainFrom для изменения состояния переключателя. как будто проверено на истинность.

Что я уже пробовал:

void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
   {
      //retrieve number of bytes in the buffer
       int bytes = configcomPort.BytesToRead;
       //create a byte array to hold the awaiting data
       byte[] comBuffer = new byte[bytes];
       //read the data and store it
       configcomPort.Read(comBuffer, 0, bytes);
       if(comBuffer[0] == 6 && comBuffer.Length > 5)
       {
           Software.FrmMain frmMain = new Software.FrmMain();
           if (comBuffer[3] == 100) frmMain.radioButtonA.Checked = true;
       }
    }

Я не знаю, почему это не было установлено RadioButton Checked в true. Во время отладки я вижу, что статус true и событие RadioButton_CheckChanged возникает в mainFrom, но в конструкторе radiobutton пуст. он показывал не выбранный или проверенный фасль.
Может ли кто-нибудь указать мне, где я делаю что-то не так?? как решить эту проблему??

Заранее спасибо.

Rob Philpott

Почему вы создаете новую форму, когда данные получены? Это странно, и это не сработает. Эта форма никогда не отображается, и даже если бы это было так, то возникли бы глубокие проблемы с потоками, как указано в ответе ниже...

vebi1000

@Rob Philpott когда полученные данные мне нужно установить, какая система подключена, для настройки у меня есть переключатели для двух систем A и B. В зависимости от данных я должен установить одну из них. эти переключатели находятся в основном от. У меня есть еще один класс последовательной связи. Как назвать тех, переключатель chechkChanged evnts из класса последовательный порт??

2 Ответов

Рейтинг:
2

Richard Deeming

Software.FrmMain frmMain = new Software.FrmMain();
if (comBuffer[3] == 100) frmMain.radioButtonA.Checked = true;

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

Вы сказали, что COM - порт находится на главной форме-той же форме, что и переключатели. Если это так, просто обновите переключатели на текущем экземпляре:
if (comBuffer[3] == 100) this.radioButtonA.Checked = true;

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

Взгляните на эту серию статей для лучшего понимания:
Передача информации между двумя формами, Часть 1: Родитель-Ребенок[^]
Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^]
Передача информации между двумя формами, Часть 3: Ребенок ребенку[^]


Рейтинг:
1

TheRealSteveJudge

Вы пытаетесь установить Радиобаттон.Проверено свойство из другого потока.
Пожалуйста, прочтите это:
Как сделать Потокобезопасные вызовы элементов управления Windows Forms | Microsoft Docs[^]
Там вы можете найти пример настройки свойства Text текстового поля.

private void SetText(string text)
{
	// InvokeRequired required compares the thread ID of the
	// calling thread to the thread ID of the creating thread.
	// If these threads are different, it returns true.
	if (this.textBox1.InvokeRequired)
	{
		StringArgReturningVoidDelegate d = new StringArgReturningVoidDelegate(SetText);
		this.Invoke(d, new object[] { text });
	}
	else
	{
		this.textBox1.Text = text;
	}
}


jsc42

Вы говорите: "в конструкторе radiobutton пусто". Этого и следовало ожидать. Конструктор форм показывает дизайн формы, а не то, что происходит во время выполнения.