使用c#从Visual Studio中的另一个表单访问变量

时间:2017-05-23 13:48:14

标签: c# forms visual-studio variables visual-studio-2013

我正在使用c#和Visual Studio。我想从另一个表单访问变量。我发现了一些类似的东西:

textBox1.Text = form22.textBoxt17.Text;

但我不想访问textBox值,我只想访问一个变量。我试过这个:

string myVar1 = Form2.myVar2;

但这不起作用。

任何帮助?

更新 这就是我现在所拥有的:

        private string _firstName = string.Empty;
        public string firstName
        {
            get
            {
                return _firstName ;
            }
            set
            {
                if (_firstName != value)
                    _firstName = value;
            }
        }

在formLogin中(变量所在的位置),位于public partial class formLogin : Form

下方

然后,稍后在代码中,单击事件的内部按钮:

            OleDbCommand command2 = new OleDbCommand();
            command2.Connection = connection;
            command2.CommandText = "select firstName from logindb where username = '" + txtUsername.Text + "' and password = '" + txtPassword.Text + "'";
            firstName = command2.ExecuteScalar().ToString();

我在formLoad事件中用formAntonyms(从我想要访问变量的位置)写这个:

        formLogin fli = new formLogin();
        lblName.Text = fli.firstName;            

所有这一切的问题在于,当formAntonyms打开时,lblName仍为空,而不是显示用户名。我做错了什么,我已经完成了所有正确的步骤......

2 个答案:

答案 0 :(得分:1)

您走在正确的道路上,不应将控件或变量直接暴露给客户端代码。

在要从以下位置读取值的表单/类中创建只读属性:

//Form2.cs
public string MyVar{get{ return textBoxt17.Text;}}

然后,将form22作为已加载的Form2表单类的实例变量。然后,从任何引用它的客户端代码中,您可以读取属性的值:

string myVal = frm22.MyVar;

修改

根据您的上一条评论,您在Florm1中有一个变量,并希望从Form2访问它,原理与前一个示例相同,但是现在公开一个私有变量而不是暴露一个私有变量,而不是生活在Form2中它现在生活在Form1:

//Form1.cs
private string _myVar = string.Empty

public string MyVar
 {
    get
    { 
       return _myVar ;
    }
    set
    { 
       if(_myVar != value)
           _myVar = value;
    }
 }

该属性现在是可读/写的,因此您可以从客户端代码

更新其值
From From2, I  assume you have a instance of Form1 named form1:
string val = form1.MyVar;
...
form1.MyVar = "any";

答案 1 :(得分:0)

首先,直接从类访问变量是不良的面向对象设计。它降低了可维护性和可重用性。

您的问题出现了,因为您不清楚对象的功能。

你不应该以“我想要这个变量的价值”的方式来思考,而是在:“假设你有一个表单22,这样的表格应该有哪些属性?”。

嗯,显然它有一个大小和位置以及很多其他的,显然你的表单有一些显示的信息,你认为这个表单的用户想要知道所显示信息的文本。

假设显示的信息名为MyInformation。请注意,您只能显示信息的说明。此描述性文本不是信息本身。

表单的正确面向对象设计将是

class Form22 : Form
{
    public string MyInformationText {get {return ...; }
    ...
}

现在,您正在与Form22的用户通信,表明Form22有一些MyInformation。您还传达了您不愿意共享此信息,只是为了共享信息的描述性文本。此外,您表单的用户无法更改此信息。

这给你带来很多好处。例如,假设您不希望在TextBox中显示文本,而是在ComboBox中显示文本。或许你根本不想再显示它了。想要MyInformation的描述性文本的表单用户不必更改。

当然,如果您希望表单的用户更改信息,您的设计可能会有所不同。可能这也意味着您需要更改显示的信息描述。但同样:您表单的用户不需要知道这一点。同样,这使您可以自由地更改它,而无需用户进行更改:

public MyInformation SpecialInformation 
{
     get {return this.mySpecialInformation;}
     set
     {
         this.mySpecialInformation = value;
         this.UpdateDisplay(mySpecialInformation);
     }
}

如果您仍然应该为显示的文本提供属性,则取决于您的模型:世界上的所有MyInformation对象是否具有相同的显示文本,或者可能是form22中显示的文本可能与显示的不同形式23中的MyInformation文本?这个问题的答案会影响MyInformation是否应该具有获取描述性文本的功能,或者表单是否应该具有获取描述性文本的功能。

这些只是表明你应该思考的例子:我的对象应该做什么?我的对象的用户应该如何处理我的对象。你允许他们做的越多,你就能越少改变。如果您向他们提供的信息不是必需的,那么您将获得最大的灵活性。此外,您还需要测试更少的功能。