如何访问此方法中的变量

时间:2013-04-26 10:41:24

标签: c#

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

该应用程序工作正常,并做了应该做的事情。现在,我需要对从串行收到的数据做一些详细说明,我想在SetText方法中访问变量“value”。 如何从其他方法或类访问该变量的内容? 谢谢你的帮助。

 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 个答案:

答案 0 :(得分: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; }

答案 1 :(得分: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;
        }
    }
}

}

答案 2 :(得分: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";

答案 3 :(得分: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();
                    }

                }
            }
        }