C# 使用c从Visual Studio中的另一个窗体访问变量#
我正在使用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
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ć,看编辑我已经提供了我现在所拥有的。。我不知道我做错了什么@你找到答案了吗?