另一个初学者问题来自Delphi你总是可以访问另一个表单控件但是在我早期使用C#/ Visual Studio时,我遇到的问题比实际上要困难得多。
我已经开始编写一个简单的记事本样式应用程序,我有我的主表单和用于选择行号的辅助表单。
从我的主表单中,我调用goto行号表格如下:
private void mnuGoTo_Click(object sender, EventArgs e)
{
Form gotoForm = new GoToForm();
var dialogResult = gotoForm.ShowDialog();
if (dialogResult == DialogResult.OK)
{
// get the text from gotoForm.editLineNumber.Text
MessageBox.Show(gotoForm.editLineNumber.Text); // doesn't work
}
}
正如您在评论代码中看到的,我有一个名为TextBox
的{{1}}控件,该控件位于我的另一种形式(editLineNumber
)。
我的问题(可能是一个初学者问题)是为什么当我输入GoToForm
时editLineNumber
菜单中intellisense
没有显示?
如何从gotoForm.
?
editLineNumber
控件
GoToForm
注释行的错误消息是:
错误CS1061'Form'不包含'editLineNumber'的定义 没有扩展方法'editLineNumber'接受第一个参数 可以找到“表单”类型(您是否缺少使用指令或 装配参考?)
除非我遗漏了一些明显的东西,为什么另一种形式上存在的控件并非公开可用于所有表单?我知道C#/ Visual Studio与Delphi不同,但Delphi允许您访问并查看所有表单上的所有控件而不需要任何额外的工作,这似乎对我来说更合乎逻辑。为什么C#/ Visual Studio会隐藏辅助表单上的控件,这有什么用呢?
答案 0 :(得分:4)
editLineNumber
控件是私有的。您可以将其更改为公开,但不鼓励这样做。
而是在GoToForm
中创建一个返回所需值的属性。
public string LineNumber
{
get { return this.editLineNumber.Text; }
}
现在您可以引用您的新属性:
if (dialogResult == DialogResult.OK)
{
MessageBox.Show(gotoForm.LineNumber);
}
答案 1 :(得分:1)
特别是如果您是C#和WinForms的新手,请不要使用10英尺长的杆触摸设计师代码。正如Grant Winney所说,使用一个属性:
public string GetLineNumberText
{
get { return this.editLineNumber.Text; }
}
应该提到的是,了解表格的方向性非常重要。也就是说,如果我制作Form1
然后在其中定义Form2
,那么您将要小心如何在两种形式之间进行通信。与直接访问表单元素相比,属性几乎总是更好的选择 - 否则代码很难改变。例如,如果您从其他表单中删除editLineNumber
或重命名它,则必须编辑父表单中的每个实例。如果您使用属性,则只需在一个位置进行更改。