为什么我无法访问另一个表单上的文本框?

时间:2016-07-13 15:48:22

标签: c# visual-studio

另一个初学者问题来自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)。

我的问题(可能是一个初学者问题)是为什么当我输入GoToFormeditLineNumber菜单中intellisense没有显示?

如何从gotoForm.

表单访问editLineNumber控件

GoToForm注释行的错误消息是:

  

错误CS1061'Form'不包含'editLineNumber'的定义   没有扩展方法'editLineNumber'接受第一个参数   可以找到“表单”类型(您是否缺少使用指令或   装配参考?)

除非我遗漏了一些明显的东西,为什么另一种形式上存在的控件并非公开可用于所有表单?我知道C#/ Visual Studio与Delphi不同,但Delphi允许您访问并查看所有表单上的所有控件而不需要任何额外的工作,这似乎对我来说更合乎逻辑。为什么C#/ Visual Studio会隐藏辅助表单上的控件,这有什么用呢?

2 个答案:

答案 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或重命名它,则必须编辑父表单中的每个实例。如果您使用属性,则只需在一个位置进行更改。