从不同的表单访问对象的实例

时间:2016-09-02 19:42:29

标签: c# forms serial-port

我程序的主要形式有一个按钮,可以打开第二个名为PortOpener的表单。 PortOpener设置为打开串行,GPIB,以太网和USB端口以与外部设备通信。您可以选择在PortOpener中打开端口所需的所有数据,然后单击打开端口按钮。这将所有端口信息传递给名为serialWindow的新表单,然后serialWindow打开端口。

这是创建serialWindow的位置以及它如何将数据传递给新表单。

    private void OpenPortButton_Click(object sender, EventArgs e)
    {
        SerialWindow _serialWindow = new SerialWindow();
        _serialWindow.Show();
        _serialWindow.OpenCom(cboPort.SelectedItem.ToString(), cboParity.SelectedItem.ToString(), cboStop.SelectedItem.ToString(), cboData.SelectedItem.ToString(), cboBaud.SelectedItem.ToString(), NamePortTextBox.Text);
    }

这是连接到端口的新serialWindow。

    public void OpenCom(string port, string parity, string stop, string data, string baud, string PortName)
    {
        comm.PortName = port;
        comm.Parity = parity;
        comm.StopBits = stop;
        comm.DataBits = data;
        comm.BaudRate = baud;
        comm.DisplayWindow = rxRichTextBox;
        comm.OpenPort();
    }

端口打开,我可以通过端口传输和接收数据。我可以通过选择不同的COM端口打开表单的多个实例。我试图使它成为mainForm可以将数据传递给serialWindow进行传输。

我知道如何使用此方法将数据从serialWindow传递到mainForm How to access a form control for another form?

我不确定如何区分serialWindows的不同实例。如果mainForm想要通过COM 3传输数据并且打开了6个COM端口,那么您将如何处理每个端口?我是否应该尝试将其发送给所有人,然后让serialWindows检查其打开的COM端口是否与我要传输的端口匹配?

portOpenerForm

serialWindowForm

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

知道所有打开的表单都存储在Application.OpenForms集合中,这一点相对简单。

在SerialWindow表单中添加一个名为(例如)类型为string

的PortName的公共属性

在SerialWindow代码中

public string PortName { get; set; }

现在在OpenCom方法中设置了这个属性

public void OpenCom(string port, string parity, string stop, string data, string baud, string PortName)
{
    this.PortName = port;
    comm.PortName = port;
    ....
    comm.OpenPort();
}

此时,您的mainForm能够识别查看此公共属性的特定SerialWindow

在mainForm中,循环遍历Application.OpenForms集合,其中保留了应用程序打开的所有表单实例,并且只查找SerialWindow类型的表单

foreach(SerialWindow frm in Application.OpenForms.OfType<SerialWindow>())
{ 
    // If this is a SerialWindow, then it has the property PortName
    if(frm.PortName == "COM4")
       ... pass your data to the frm instance
}

这当然可以适用于您想要从mainForm

查看的任何财产