传递变量的问题得到设置

时间:2014-01-03 00:09:58

标签: c# winforms

您好我正试图了解并设置调用并将变量从一个类存储到另一个类。

它是一个带有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的值? 谢谢你的帮助。

5 个答案:

答案 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对象。你应该:

  1. 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);
        // ...
    
  2. 使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; }
  }