【问题标题】:Setting Radio Button property from another class从另一个类设置单选按钮属性
【发布时间】:2019-02-26 15:04:30
【问题描述】:

我是 Windows 从设计和使用 Visual Studio 2017 版的新手。我在 mainFrom 中有两个单选按钮。我在主窗体中为两个单选按钮提供了单选按钮 Check_changed 事件处理程序,如下所示。

    private void radioButtonSystem_CheckedChanged(object sender, EventArgs e)
    {
        if (radioButtonSystem.Checked == true)
        {
            Address = 192;            
            ToAddress = 150;          
        }
     }

默认情况下,我在设计时将属性中的两个单选按钮都设置为 false。

我有一个串行端口类,我从硬件接收数据,根据传入的数据,我必须将其中一个单选按钮设置为 true。主窗口类拥有串口类的实例

我想知道如何访问单选按钮并将状态从串行类更改为 true??

提前谢谢你。

已编辑:

我已经尝试过这样但我仍然没有看到单选按钮被选中。有人可以建议我我在做什么可能是错的。 我在这样的串行类中有代码。

    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.radioButtonSystem.Checked = true;
        }
     }

它在 mainfrom 中引发 RadioButton_checkChanged 事件,但它没有显示,因为它被设置为 true 并在应用程序中被选中。它显示如下

它应该显示为系统一设置为 true 并被选中,但我没有看到。

【问题讨论】:

  • 喜欢radioButtonSystem.Checked = true?
  • 决定。您是否有关于 WPF 或 WinForms 的问题(编辑您的问题并删除错误的标签)?它不能/不应该两者都有关,因为这两个 UI 框架彼此之间有很大的不同......
  • 主窗口类是否拥有串口类的实例?如果没有,谁会?就好像你在问“我怎么从我家到加油站”,但我们不知道其中任何一个的街道地址;也许你住在威斯康星州的希博伊根,而你心目中的加油站就在劳德代尔堡。 (编辑:希博伊根不在密歇根)
  • @EdPlunkett 是的,主窗口类拥有串口类的实例。
  • 我会给串行端口类一个或多个事件,当传入的数据以重要的方式发生变化时它会引发这些事件。然后主窗口会将处理程序附加到这些事件,并相应地设置自己的复选框。如果您没有编写串口类,请将其子类化。

标签: c# winforms


【解决方案1】:

您应该尝试使主窗体无效,例如

... 
Software.FrmMain frmMain = new Software.FrmMain();
if (comBuffer[3] == 100){
   frmMain.radioButtonSystem.Checked = true;
   frmMain.Invalidate(true);
};

这将使主窗体的所有子窗体以及单选按钮无效。

另一种方法是在您调用主窗体时将其作为参数传递给您的另一个窗体。然后您将编辑已创建的表单上的单选按钮。通过创建一个新实例,您将编辑一个未显示的实例。 喜欢:

TestForm form = new TestForm(this);
form.Show();

在您的表单构造函数中,您将拥有

public TestForm(MainForm _main){
   ...
}

然后,您可以将 radioButtons 设置为 _main 的子项,选中或取消选中。

【讨论】:

    【解决方案2】:

    有很多方法可以做到这一点:

    1) 您可以设置单选按钮属性 Modifiers:public 并且您可以从串行端口类访问此单选按钮,例如

    Form1.radiobutton1.checked = true
    

    2) 您可以在 mainform 上声明私有值并创建 getter 和 setter 方法以使用初始化表单对象来访问此变量。您可以使用计时器检查此变量状态,如果为 true,则选中单选按钮。或者直接使用form1中的public变量。

    3) 使用backgroundworker监听串口类变量,如果变量发生变化,直接改变主窗体中的radiobutton状态。

    【讨论】:

    • 我已经设置了单选按钮的属性 Modifiers:public;我在串行类中为 main 创建了实例,并在收到数据和满足条件时将属性设置为 true。它在 mainfrom 中引发 radiobutton_checkchanged 事件,但未在 mainfrom 中显示为选中状态。我将它设置为 true,我可以在调试时看到它是 true,但我无法理解为什么它没有显示为 mainfrom 中的选择。有什么想法吗??
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2011-10-28
    • 2010-12-04
    • 1970-01-01
    • 2014-04-16
    • 2018-02-28
    • 2014-08-23
    相关资源
    最近更新 更多