0

我有一个 Windows 应用程序,它使用串行端口向/从微处理器发送和接收消息。

该应用程序运行良好,并且执行了应该执行的操作。现在,我需要对从串行接收的数据进行一些详细说明,并且我想访问 SetText 方法中的变量“值”。 如何从另一个方法或类访问该变量的内容? 感谢您的帮助。

 delegate void SetTextCallback(string text);
    private void SetText(string text)
    {
        if (this.txtOutput.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.BeginInvoke(d, new object[] { text });


        }
        else
        {
            txtOutput.AppendText(text);
        }



        // capture messages from serial port
        if (txtOutput.Text.Length > 0)
        {
            MatchCollection mc = Regex.Matches(txtOutput.Text, @"(\+|-)?\d+");
            if (mc.Count > 0)
            {
                long value = long.Parse(mc[mc.Count - 1].Value);


                if (value > 1 && value < 1000)
                {
                    textBox2.Text = value.ToString();
                }
                else if (value < 2000 && value > 1000)
                {
                    value = value - 1000;
                    textBox3.Text = value.ToString();
                }

            }
        }
    }
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {

        try
        {
            SetText(serialPort1.ReadExisting());
        }

        catch (Exception ex)
        {
            SetText(ex.ToString());
        }

    }
4

4 回答 4

2

考虑一下:

做一个属性

public long Value { get; set; }

在您的代码中使用它。

if (txtOutput.Text.Length > 0)
        {
            MatchCollection mc = Regex.Matches(txtOutput.Text, @"(\+|-)?\d+");
            if (mc.Count > 0)
            {
                value = long.Parse(mc[mc.Count - 1].Value);


                if (value > 1 && value < 1000)
                {
                    textBox2.Text = value.ToString();
                }
                else if (value < 2000 && value > 1000)
                {
                    value = value - 1000;
                    textBox3.Text = value.ToString();
                }

            }

如果要确保此属性保留其值,请使用静态属性。

public static long Value { get; set; }
于 2013-04-26T10:47:39.830 回答
2

如果要在多个地方使用数据,那么不要犹豫,只需创建一个类,其中包含要在方法之间共享的输出变量列表。在该类中为该变量创建属性。现在为这个类全局创建一个对象,并将从微处理器检索到的值分配给这个全局声明的对象中的属性。您可以在任何地方访问它。由于这是一个 Windows 应用程序,因此数据将保留,直到您清除或关闭应用程序。

这是代码。我在 Windows 应用程序中有一个文本框和两个按钮。一键获取数据,一键显示数据。数据是使用文本框从用户那里获取的。在单击显示数据按钮一次获取数据后,它将显示您想要多次推送到对象的数据。

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

 namespace WindowsFormsApplication1
  {
public partial class Form1 : Form
{
    // Declare Global Variable
    DataHolder objDataHolder = new DataHolder();
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Here use your code to load the data retrieved from Microprocessor
        objDataHolder.UserData = txtUserData.Text;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        MessageBox.Show(objDataHolder.UserData);
    }
}

// Class to hold Data 
public class DataHolder
{
    // Here have a list variables that you need to maintain that are retrieved from Microrocessor.
    private string _userdata = string.Empty;

    // Here have a list Properties that you need to maintain that are retrieved from Microrocessor.
    public string UserData
    {
        get
        {
            return _userdata;
        }
        set
        {
            _userdata = value;
        }
    }
}

}

于 2013-04-26T10:52:38.323 回答
1

您可以使用“静态”变量或实例变量访问其他类中的变量

public class Demo1
{
     //Static variable can be accessed without instantiating an instance of Demo1
     public static int Number;      //Demo1.Number
     public string Info {get;set;}
}

public class AnotherClass
{
     void DoSth()
     {
         Demo1.Number ++;
     }
}

或者如果您有 Demo1 的实例,请说 demo1Instance

demo1Instance.Info="Sth you like";
于 2013-04-26T10:44:22.750 回答
0

这就是我所做的,现在正在工作。感谢大家的好建议。我很确定我很快就会在应用程序的其他开发中使用您的示例。

 internal long value;
        private void SetText(string text)
        {
            if (this.txtOutput.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.BeginInvoke(d, new object[] { text });


            }
            else
            {
                txtOutput.AppendText(text);
            }
            // capture messages from serial port
            if (txtOutput.Text.Length > 0)
            {
                MatchCollection mc = Regex.Matches(txtOutput.Text, @"(\+|-)?\d+");

                if (mc.Count > 0)
                {
                    value = long.Parse(mc[mc.Count - 1].Value);
                    if (value > 1 && value < 1000)
                    {
                        textBox2.Text = value.ToString();
                    }
                    else if (value < 2000 && value > 1000)
                    {
                        value = value - 1000;
                        textBox3.Text = value.ToString();
                    }

                }
            }
        }
于 2013-04-26T16:45:07.253 回答