C# 使用c从Visual Studio中的另一个窗体访问变量#

C# 使用c从Visual Studio中的另一个窗体访问变量#,c#,forms,visual-studio,variables,visual-studio-2013,C#,Forms,Visual Studio,Variables,Visual Studio 2013,我正在使用c#和Visual Studio。我想从另一个窗体访问变量。我发现了一些东西,比如: textBox1.Text = form22.textBoxt17.Text; 但我不想访问文本框值,我只想访问一个变量。我试过这个: string myVar1 = Form2.myVar2; 但这不起作用 有什么帮助吗 更新 这就是我现在得到的: private string _firstName = string.Empty; public string fi

我正在使用c#和Visual Studio。我想从另一个窗体访问变量。我发现了一些东西,比如:

textBox1.Text = form22.textBoxt17.Text;
但我不想访问文本框值,我只想访问一个变量。我试过这个:

string myVar1 = Form2.myVar2;
但这不起作用

有什么帮助吗

更新 这就是我现在得到的:

        private string _firstName = string.Empty;
        public string firstName
        {
            get
            {
                return _firstName ;
            }
            set
            {
                if (_firstName != value)
                    _firstName = value;
            }
        }
在formLogin(变量所在的位置)中,就在公共部分类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 form类的实例变量。然后,从任何具有引用的客户端代码中,您可以读取该属性的值:

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。您还表示,您不愿意共享此信息,只是为了共享信息的描述性文本。此外,表单用户无法更改此信息

这给了你很多好处。例如,假设您不想在文本框中显示文本,而是在组合框中显示文本。或者你根本不想再展示它了。需要MyInformation描述性文本的表单用户不必更改

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

public MyInformation SpecialInformation 
{
     get {return this.mySpecialInformation;}
     set
     {
         this.mySpecialInformation = value;
         this.UpdateDisplay(mySpecialInformation);
     }
}
是否仍应为显示的文本提供属性取决于您的模型:世界上所有MyInformation对象是否都具有相同的显示文本,或者form22中显示的文本是否可能与form23中MyInformation的显示文本不同?这个问题的答案会影响MyInformation是否应该具有获取描述性文本的功能,或者表单是否应该具有获取描述性文本的功能


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

到底什么不起作用?是否有错误消息?在返回文本框17.Text部分之前,我会获取所有信息。但这是我的错,我解释得不好。我想访问一个与任何txtBox、标签或按钮都没有关联的变量,它在代码中,但在Form1.cs中声明。我想从Form2.csI提到的第一个代码中访问它,我在这里找到的一个例子是textBox17。每个人都在问如何访问textBox17的值,我想访问一个变量,该变量在声明和定义的表单上没有显示。在这种情况下,我应该返回什么@E-bat@StevanMarjanović,看编辑我已经提供了我现在所拥有的。。我不知道我做错了什么@你找到答案了吗?