简体   繁体   English

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

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

I am writing an app, still, where I need to test some devices every minute for 30 minutes. 我仍然在编写应用程序,我需要在每分钟30分钟内测试一些设备。 It made sense to use a timer set to kick off every 60 secs and do whats required in the event handler. 使用计时器设置每60秒启动一次并执行事件处理程序中所需的操作是很有意义的。

However, I need the app to wait for the 30 mins until I have finished with the timer since the following code alters the state of the devices I am trying to monitor. 但是,我需要应用程序等待30分钟,直到我完成计时器为止,因为以下代码会更改我要监视的设备的状态。

I obviously don't want to use any form of loop to do this. 我显然不想使用任何形式的循环来执行此操作。 I thought of using another windows form, since I also display the progress, which will simply kick off the timer and wait until its complete. 我想到了使用另一个Windows窗体,因为我还显示进度,它将简单地启动计时器并等待其完成。

The problem I am having with this is that I use a device Class and cant seem to get access to the methods in the device class from the 2nd (3rd actually - see below) windows form. 我遇到的问题是我使用了设备类,并且似乎无法从第二个(实际上是第三个-参见下文)Windows窗体访问设备类中的方法。

I have an initial windows form where I get input from the user, then call the 2nd windows form where it work out which tests need to be done and which device classes need to be used, and then I want to call the 3rd windows form to handle the timer. 我有一个初始的Windows窗体,可以从用户那里获取输入,然后调用第二个Windows窗体,在该窗体上可以确定需要完成哪些测试以及需要使用哪些设备类,然后我想将第三个Windows窗体调用为处理计时器。

I will have up to 6-7 device classes and so wanted to only instantiate them when actually requiring them, from the 2nd form. 我将有多达6-7个设备类,因此只想在实际需要它们时才从第二种形式实例化它们。

Should I have put this logic into the 1st windows form (program class ??) ? 我应该将此逻辑放入第一个Windows窗体(程序类??)吗?

Would I not still have the problem of not being able to access device class methods from there too ? 我是否还会有无法从那里访问设备类方法的问题?

Anyway, perhaps someone knows of a better way to do the checks every minute without the rest of the code executing (and changing the status of the devices) or how I should be accessing the methods in the app ?? 无论如何,也许有人知道一种更好的方法,可以每分钟进行一次检查而无需执行其余代码(并更改设备的状态),或者我应该如何访问应用程序中的方法?

Hi, 你好

The following is the "calling" form - 以下是“致电”表格-

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");
            }
        }
    }
}

The following is the called form - 以下是所谓的表格-

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)
        {

        }
    }
}

The NDT.NDT1_CMD1() in the called form gives me the following error in the build - 调用形式的NDT.NDT1_CMD1()在构建中给我以下错误-

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

The use of the variable SWVolt within the NDTClass works fine but the use of the method in the class is not possible. 在NDTClass中使用变量SWVolt可以正常工作,但是无法在类中使用该方法。

What have I done wrong ?? 我做错了什么??

Thanks, George. 谢谢,乔治。 (I hope the formatting comes out corrrectly too). (我希望格式也能正确显示)。

Form1.NDTClass.SWVolt = 99; works because you are referencing a public static field in the Form1.NDTClass class. 之所以起作用,是因为您引用了Form1.NDTClass类中的公共静态字段。 It is not tied to any instance. 它不绑定任何实例。 However for ` NDT.NDT1_CMD1(); 但是对于` NDT.NDT1_CMD1(); , that doesn't work because: ,这是行不通的,因为:

  1. NDT1_CMD1() is an instance method and you need an instance of that class to call it. NDT1_CMD1()是一个实例方法,您需要该类的实例才能调用它。
  2. There is no instance of your class named NDT in Form2. Form2中没有名为NDT的类的实例。 Form1 contains a private field named NDT, but that is not accessible from Form2. Form1包含一个名为NDT的私有字段,但是不能从Form2进行访问。 You need to declare Form1.NDTClass NDT = new Form1.NDTClass() in Form2. 您需要在Form2中声明Form1.NDTClass NDT = new Form1.NDTClass()

I think you need to make sure you understand variable scope . 我认为您需要确保您了解变量范围

Let me attempt an alternate explanation: SWVolt as a public static field, has global scope. 让我尝试另一种解释: SWVolt作为公共静态字段,具有全局作用域。 It is accessible from anywhere in the application. 可从应用程序中的任何位置访问它。 NDT as a private instance field has the scope of a single instance of Form1. NDT作为私有实例字段具有Form1单个实例的范围。 That is it is only accessible from inside an instance of Form1. 也就是说,只能从Form1的实例内部访问它。 Any code that is not part of Form1 cannot see it, which of course includes the code in Form2. 任何不属于Form1的代码都看不到它,当然其中包括Form2中的代码。

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

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