【问题标题】:Accessing an instance of an object from a different form从不同的表单访问对象的实例
【发布时间】:2016-09-03 14:43:51
【问题描述】:

我的程序的主窗体有一个按钮,可以打开名为 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

感谢您的帮助

【问题讨论】:

  • 即使只考虑表单可能不是最好的方法,我也会在 mainForms 类中创建一个 Dictionary,它会跟踪所有打开的端口和相应的 serialWindow 实例。使用 COM3 或 USB1 等键可以让您区分连接。连接时添加引用,断开连接时删除它们。
  • 您可以采用多种方法。有关几个不同的选项,请参阅标记的副本。如果您仍然无法解决此问题,请发布一个新问题,其中包含一个很好的 minimal reproducible example,它清楚地显示了您尝试过的内容,以及对代码现在做什么以及您想要什么的精确而详细的解释它要做什么,以及您在实现该目标时遇到了什么具体问题。
  • Peter Duniho,不确定您是否在拖钓。如果您阅读了整个问题,您会发现我知道如何在 2 个表单之间传递数据,并提供了一个示例链接,您声称我的问题是重复的。我需要帮助的是在打开该表单的多个版本时与正确的表单交谈。 Steve 通过 Application.OpenForm.OfType 帮助解决了这个问题。

标签: c# forms serial-port


【解决方案1】:

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

在您的 SerialWindow 表单中添加一个名为(例如)字符串类型的 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 中检查的任何属性

【讨论】:

  • Application.OpenForms.OfType 完成了工作。感谢您帮助展示如何区分同一对象的多种形式。
  • 这是一种礼貌的行为,向未来的读者解释了一个反对意见和一个有用的建议,以避免错误的答案
  • 什么反对票?我接受了你的回复作为答案,并投票赞成你发布它。我没有显示赞成票所需的声誉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多