我有一个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());
}
}
答案 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();
}
}
}
}