您好我正试图了解并设置调用并将变量从一个类存储到另一个类。
它是一个带有2个按钮和2个文本框的窗体。
Class Utility是执行所有后端计算并存储变量ActiveUserId和ActiveUserName。现在,我想要做的就是存储两个文本框的值,并能够在之后获取它们。
namespace WindowsFormsApplication1
{
class Utility
{
public int ActiveUserID;
public string ActiveUserName;
public int _ActiveUserID
{
get { return ActiveUserID;}
set { ActiveUserID = value; }
}
public string _ActiveUserName
{
get { return ActiveUserName; }
set { ActiveUserName = value; }
}
public void StoreActiveUser(int currentUserID, string currentUserName)
{
ActiveUserID = currentUserID;
ActiveUserName = currentUserName;
}
public int GetActiveUser()
{
return ActiveUserID;
}
}
}
另一个班级是
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Utility tool1 = new Utility();
tool1.StoreActiveUser(Int32.Parse(textBox1.Text), textBox2.Text);
MessageBox.Show(String.Format("the values are :{0} {1}", tool1.ActiveUserID.ToString(), tool1._ActiveUserName));
}
private void button2_Click(object sender, EventArgs e)
{
Utility tool1 = new Utility();
MessageBox.Show(String.Format("the values are :{0} {1}",tool1.ActiveUserID.ToString(),tool1._ActiveUserName));
MessageBox.Show(String.Format(tool1.GetActiveUser().ToString()));
}
}
}
我在文本框中输入一些值,然后按下按钮1,消息显示正确的值。
当我按下按钮2时,我应该在消息框中显示实用程序类中的ActiveUserID和ActiveUserName的值,我得到的是“0”
然后我添加了一个返回activeUserID但返回0的函数;
我是不是永久存储了button1_Click中ActiveUserID的值? 谢谢你的帮助。
答案 0 :(得分:1)
您正在第二个按钮中创建一个新对象,请尝试以下方法:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Utility tool1;
public Form1()
{
InitializeComponent();
tool1 = new Utility();
}
private void button1_Click(object sender, EventArgs e)
{
tool1.StoreActiveUser(Int32.Parse(textBox1.Text), textBox2.Text);
MessageBox.Show(String.Format("the values are :{0} {1}", tool1.ActiveUserID.ToString(), tool1._ActiveUserName));
}
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show(String.Format("the values are :{0} {1}", tool1.ActiveUserID.ToString(), tool1._ActiveUserName));
MessageBox.Show(String.Format(tool1.GetActiveUser().ToString()));
}
}
}
答案 1 :(得分:1)
它们可能都具有相同的名称(tool1),但它们是Utility类的两个完全独立的实例。因此,button1_Click中tool1实例中存储的数据与button2_Click中的tool1实例中的数据不同。
您需要做的是更改tool1的范围,使其成为button1_Click和button2_Click的全局。所以像这样:
Utility tool1 = new Utility();
private void button1_Click(object sender, EventArgs e)
{
tool1.StoreActiveUser(Int32.Parse(textBox1.Text), textBox2.Text);
MessageBox.Show(String.Format("the values are :{0} {1}", tool1.ActiveUserID.ToString(), tool1._ActiveUserName));
}
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show(String.Format("the values are :{0} {1}",tool1.ActiveUserID.ToString(),tool1._ActiveUserName));
MessageBox.Show(String.Format(tool1.GetActiveUser().ToString()));
}
答案 2 :(得分:1)
您每次都在创建一个新的Utility
对象。你应该:
在Utility
构造函数中创建一个Form()
对象,并将其另存为字段:
private Utility Tool { get; set; }
public Form() {
InitializeComponent();
Tool = new Utility();
}
private void button1_Click(object sender, EventArgs e) {
Tool.StoreActiveUser(Int32.Parse(textBox1.Text), textBox2.Text);
// ...
使Utility
成为静态类,并引用Utility.StoreActiveUser
而不是创建任何实例。
答案 3 :(得分:1)
Utility tool1 = new Utility();
此处的问题是scope。每次调用该行代码时,都会创建一个新的局部变量。您需要将单个实例实例化为类成员。
答案 4 :(得分:1)
您的问题不是一个完整的答案,但您的Utility类也可以改进。这些字段应该是私有的,并以下划线(按照惯例)开头,属性应该是公共的:
class Utility
{
private int _activeUserID;
private string _activeUserName;
public int ActiveUserID
{
get { return _activeUserID;}
set { _activeUserID = value; }
}
public string ActiveUserName
{
get { return _activeUserName; }
set { _activeUserName = value; }
}
// You don't need this method, you can store id and username like this:
// tool1.ActiveUserID = currentUserID;
// tool1.ActiveUserName = currentUserName;
public void StoreActiveUser(int currentUserID, string currentUserName)
{
ActiveUserID = currentUserID;
ActiveUserName = currentUserName;
}
// no need for this method either, you can use this:
// int id = tool1.ActiveUserID;
public int GetActiveUser()
{
return ActiveUserID;
}
}
下一步可能是将属性转换为自动属性:
class Utility
{
public int ActiveUserID { get; set; }
public string ActiveUserName { get; set; }
}