繁体   English   中英

使用C#从Visual Studio中的其他表单访问变量

[英]Access variable from another form in Visual Studio with c#

我正在使用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仍然为空,而不显示用户名。 我做错了什么,我已经正确完成了所有步骤...

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

在要从中读取值的表单/类中创建一个只读属性:

//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, assuming you have an instance of Form1 named form1:
string val = form1.MyVar;
...
form1.MyVar = "any";

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

出现问题是因为对象的功能不清楚。

您不应该以“我想要这个变量的值”的方式来思考,而是以“假设您有一个form22,这种形式应该具有哪些属性?”的方式思考。

好吧,显然它有一个大小和位置,还有很多其他地方,并且显然您的表单具有显示的某些信息,并且您认为此表单的用户想知道所显示信息的文本。

假设显示的信息名为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中的显示文本可能与MyInformation的显示文本不同在form23中? 答案是否影响MyInformation是否应具有获取描述性文本的功能,或者表单是否应具有获取描述性文本的功能。

这些只是表明您应该考虑的示例:我的对象应该做什么? 我的对象的用户应该能够使用我的对象做什么。 您允许他们做的越多,您更改的能力就越少。 如果您向他们提供的信息不超过要求,您将拥有最大的灵活性。 此外,您需要测试的功能要少得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM