如何在私有静态无效函数中使用字符串值设置 WinForm 文本 属性

How to set a WinForm text property using string values in a private static void function

我正在尝试将一些第三方 C# 示例代码合并到我的程序中。第三方代码是扫描 COM 端口上的设备的 WinForms NET 4.6.2 应用程序的一部分。

就我而言,我想在方法 private static void PortStatusCallback() 中插入一行(或两行)代码。我添加的代码旨在用 PortStatusCallback() 中的一些变量值填充 Form1 上的一些文本框。完整的方法如下;我建议的添加是单行 myPortname.Text = portname;。此添加 returns 错误消息 非静态字段、方法或 属性 需要对象引用 'Form1.myPortname'

谁能建议一种从静态方法访问字段的方法?我是 C# 编程的新手,所以如果你能为我写出代码,我将不胜感激。谢谢。

private DLL.PortStatusCallbackFuncPtr _PortStatusInstance = new DLL.PortStatusCallbackFuncPtr(PortStatusCallback);  // Allocated to prevent garbage collection

private static void PortStatusCallback([MarshalAs(UnmanagedType.LPStr)] String portname, DLL.PortStatusTypes status, byte curScanAdr, byte maxScanAdr, byte foundType)
        {
            string statusMsg = "\r\nPortInfo Callback: " + portname + " status:" + status.ToString() + " curScanAdr:" + curScanAdr.ToString() + " maxScanAdr:" + maxScanAdr.ToString() + " foundType:" + foundType.ToString("X2");

            myPortname.Text = portname; // this line is added by me and throws up a CS0120 error.

            MyStatusBox.Invoke((MethodInvoker)delegate () { MyStatusBox.AppendText(statusMsg); });

            Console.Write(statusMsg);
        }

此答案假设您的 Form1 class 代表您申请的主要表格; class 的一个实例是在 Program.cs 中创建的,并且从未创建过其他实例,并且当您关闭表单时,该应用程序就会消失(即典型的 WinForms 应用程序)。

创建一个半私有属性:

Private static Form1 CurrentForm { get; private set; }

在 Form1 构造函数中(或在 Load 处理程序中),执行以下操作:

CurrentForm = this;

现在,表达式 Form1.CurrentForm 将解析为您的主窗体(从您应用程序的任何位置)。

最后将您出错的行更改为:

CurrentForm.myPortname.Text = portname;

尝试像这样使用 static modifier

private static DLL.PortStatusCallbackFuncPtr _PortStatusInstance = new DLL.PortStatusCallbackFuncPtr(PortStatusCallback);  // Allocated to prevent garbage collection