如何在C#Windows应用程序中修复“名称...在当前上下文错误中不存在”?

时间:2019-08-13 17:17:27

标签: c# windows forms sharpdevelop

前段时间我做了一个简单的C#应用​​程序(作为控制台应用程序),现在我在Sharpdevelop中制作了一个新版本的Windows应用程序。我是C#和图形应用程序的新手,却遇到了这个令人困惑的错误。

我想做什么:在UI上,我有一个按钮,用于检查COM3串行端口是否已打开,如果没有打开,则将其打开,如果已打开,则将其关闭,然后在列表框中写一条有关它的消息。问题是无论我将串行处理部件放在何处,都会得到有关不在当前上下文中的错误,或者得到“对象引用未设置为对象实例”的错误。

我使用Sharpdevelop的模板创建了该应用,因此我在几个文件中都有代码:

Program.cs:

using System;
using System.Windows.Forms;
namespace SerialClient_v2
{
    class Program
    {   
        [STAThread]

        void Main(string[] args)
        {
            SerialHandle SH=new SerialHandle();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm(SH));
        }       
    }   
}

Mainform.cs:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO.Ports;

namespace SerialClient_v2
{
    public partial class MainForm : Form
    {   
        private SerialHandle _sh;
        public MainForm(SerialHandle sh)
        {
            InitializeComponent();
            _sh = sh;

        }
        void ConnectBtnClick(object sender, EventArgs e)
        {
            try{
                if(_sh._serialPort.IsOpen){
                    listBox1.Items.Add(DictionaryClass.strDisconnecting);
                    //Program._serialPort.Close();
                }
                else{
                    //Program._serialPort.Open();
                    listBox1.Items.Add(DictionaryClass.strConnecting);
                }
            }
            catch (Exception ex)  
            {  
                listBox1.Items.Add("Error opening/writing to serial port :: " + ex.Message);  
            }
        }
    }
}

SerialHandle.cs :(这是我的文件,以前在控制台应用程序的Main函数中提供的东西在这里。DictionaryClass只是一个翻译帮助类,可以轻松在两种语言之间切换)

using System;
using System.IO.Ports;

namespace SerialClient_v2
{
    public class SerialHandle
    {
        bool SerialComm;  
        public SerialPort _serialPort;



        public SerialHandle()
        {
            SerialPort _serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); 
            _serialPort.Handshake = Handshake.None; 

            _serialPort.ReadTimeout = 1000;   

            _serialPort.Open();
        }

    }

    public static class DictionaryClass{
        //DICTIONARY:
        public static string  strConnecting="Initializing serial communication!";
        public static string  strDisconnecting="Closing serial port";
    }
}

问题在于无法检查SH._serialPort.IsOpen,因为它不在上下文中。 SH是在Main函数中创建的,所以我不明白为什么它没有被看到。对不起初学者的问题。

2 个答案:

答案 0 :(得分:0)

只需将初始化语句SerialHandle SH=new SerialHandle();移动到MainForm.cs类中

答案 1 :(得分:0)

最简单的解决方案是将SH对象实例传递给主要形式:

在SerialHandle.cs中(使用_sh._serialPort.IsOpen)

private SerialHandle _sh;

public MainForm(SerialHandle sh)
{
    _sh = sh;
}

在Program.cs中:

Application.Run(new MainForm(SH));