我正在使用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仍为空,而不是显示用户名。我做错了什么,我已经完成了所有正确的步骤......
答案 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是否应该具有获取描述性文本的功能,或者表单是否应该具有获取描述性文本的功能。
这些只是表明你应该思考的例子:我的对象应该做什么?我的对象的用户应该如何处理我的对象。你允许他们做的越多,你就能越少改变。如果您向他们提供的信息不是必需的,那么您将获得最大的灵活性。此外,您还需要测试更少的功能。