![](/img/trans.png)
[英]Changing a string variable from another Form in Visual Studio (c#)
[英]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.