繁体   English   中英

无法从以前的Windows窗体访问Class方法-C#

[英]Cannot access Class methods from previous windows form - C#

我仍然在编写应用程序,我需要在每分钟30分钟内测试一些设备。 使用计时器设置每60秒启动一次并执行事件处理程序中所需的操作是很有意义的。

但是,我需要应用程序等待30分钟,直到我完成计时器为止,因为以下代码会更改我要监视的设备的状态。

我显然不想使用任何形式的循环来执行此操作。 我想到了使用另一个Windows窗体,因为我还显示进度,它将简单地启动计时器并等待其完成。

我遇到的问题是我使用了设备类,并且似乎无法从第二个(实际上是第三个-参见下文)Windows窗体访问设备类中的方法。

我有一个初始的Windows窗体,可以从用户那里获取输入,然后调用第二个Windows窗体,在该窗体上可以确定需要完成哪些测试以及需要使用哪些设备类,然后我想将第三个Windows窗体调用为处理计时器。

我将有多达6-7个设备类,因此只想在实际需要它们时才从第二种形式实例化它们。

我应该将此逻辑放入第一个Windows窗体(程序类??)吗?

我是否还会有无法从那里访问设备类方法的问题?

无论如何,也许有人知道一种更好的方法,可以每分钟进行一次检查而无需执行其余代码(并更改设备的状态),或者我应该如何访问应用程序中的方法?

你好

以下是“致电”表格-

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace TestCall

{
    public partial class Form1 : Form
    {
        NDTClass NDT = new NDTClass();

        public Form1()
        {
            InitializeComponent();

            NDT.NDTOpen();
            NDT.NDT1_CMD1();
            (new Form2()).ShowDialog();
            NDT.NDTClose();

        }

        public class NDTClass
        {
            public static double SWVolt = 0.5;
            public static string Rxstring = "";
            public SerialPort port = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);

            public string NDTOpen()
            {
                port.Open();
                port.Write("CURRENT ?\r\n");
                return Rxstring;
            }

            public void NDTClose()
            {
                port.Close();
            }

            public void NDT1_CMD1()
            {
                port.Write("DUAL MODE\r\n");
            }
        }
    }
}

以下是所谓的表格-

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestCall
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            Form1.NDTClass.SWVolt = 99;
            NDT.NDT1_CMD1();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }
    }
}

调用形式的NDT.NDT1_CMD1()在构建中给我以下错误-

Error   1   The name 'NDT' does not exist in the current context    

在NDTClass中使用变量SWVolt可以正常工作,但是无法在类中使用该方法。

我做错了什么??

谢谢,乔治。 (我希望格式也能正确显示)。

Form1.NDTClass.SWVolt = 99; 之所以起作用,是因为您引用了Form1.NDTClass类中的公共静态字段。 它不绑定任何实例。 但是对于` NDT.NDT1_CMD1(); ,这是行不通的,因为:

  1. NDT1_CMD1()是一个实例方法,您需要该类的实例才能调用它。
  2. Form2中没有名为NDT的类的实例。 Form1包含一个名为NDT的私有字段,但是不能从Form2进行访问。 您需要在Form2中声明Form1.NDTClass NDT = new Form1.NDTClass()

我认为您需要确保您了解变量范围

让我尝试另一种解释: SWVolt作为公共静态字段,具有全局作用域。 可从应用程序中的任何位置访问它。 NDT作为私有实例字段具有Form1单个实例的范围。 也就是说,只能从Form1的实例内部访问它。 任何不属于Form1的代码都看不到它,当然其中包括Form2中的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM