Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我不能访问其他表单上的文本框?_C#_Visual Studio - Fatal编程技术网

C# 为什么我不能访问其他表单上的文本框?

C# 为什么我不能访问其他表单上的文本框?,c#,visual-studio,C#,Visual Studio,这里还有一个初学者的问题,来自Delphi,您总是可以访问另一个窗体控件,但在我使用C/Visual Studio的早期,我遇到了一个问题,事实证明这个问题比它应该遇到的困难 我已经开始编写一个简单的记事本风格的应用程序,我有我的主窗体和一个用于选择行号的辅助窗体 从我的主窗体中,我调用goto行号窗体,如下所示: private void mnuGoTo_Click(object sender, EventArgs e) { Form gotoForm = new GoToForm()

这里还有一个初学者的问题,来自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
    }
}
从注释代码中可以看到,我有一个名为editLineNumber的文本框控件,它位于我的另一个表单GoToForm上

我的问题(可能是初学者的问题)是,当我键入gotoForm时,为什么editLineNumber不显示在intellisense菜单中

如何从表单GoToForm访问editLineNumber控件

注释行//不工作的错误消息为:

错误CS1061“表单”不包含“editLineNumber”的定义 并且没有扩展方法“editLineNumber”接受 如果缺少using指令或 汇编参考

除非我遗漏了一些明显的东西,否则为什么存在于另一个表单上的控件不能公开提供给所有表单?我知道C/VisualStudio与Delphi不同,但Delphi允许您访问和查看所有窗体上的所有控件而无需任何额外工作的方式在我看来更符合逻辑。为什么C/Visual Studio在辅助窗体上隐藏控件,这有什么好处?

editLineNumber控件是私有的。你可以把它改成公开的,但这是不可取的

相反,在GoToForm中创建一个返回所需值的属性

public string LineNumber
{
    get { return this.editLineNumber.Text; }
}
现在,您可以只引用新属性:

if (dialogResult == DialogResult.OK)
{
    MessageBox.Show(gotoForm.LineNumber);
}
public string GetLineNumberText
{
    get { return this.editLineNumber.Text; }
}

特别是如果你是C和WinForms新手,不要用10英尺长的杆子碰设计器代码。正如Grant Winney所说,使用一个属性:

if (dialogResult == DialogResult.OK)
{
    MessageBox.Show(gotoForm.LineNumber);
}
public string GetLineNumberText
{
    get { return this.editLineNumber.Text; }
}

应该提到的是,意识到形式的方向性很重要。也就是说,如果我创建了Form1,然后在其中定义了Form2,那么您需要注意如何在这两个表单之间进行通信。属性几乎总是比直接访问表单元素更好的选择——否则代码很难更改。例如,如果从另一个表单中删除或重命名了editLineNumber,则必须编辑父表单中的每个实例。如果使用属性,则只需在一个位置对其进行更改。

从设计器中将其公开,或者最好在GoToForm中添加一个公共属性,该属性返回其内容:公共字符串LineNumber{get{return editLineNumber.Text;}。不要忘记将goToForm变量声明为goToForm而不是基类表单…关于C中访问修饰符的信息:@AdrianoRepetti您的评论非常有用谢谢,我更改了表单goToForm=new goToForm;to GoToForm GoToForm=新的GoToForm;现在我可以访问控制,如果我改变修改为公共。但我正在阅读格兰特·温尼的答案,不鼓励改为公开,所以我不会使用这种方法,尽管它对我有帮助。当然,公共财产最好在第五个单词后看到相同的评论!谢谢你明确的回答,我喜欢这个解决方案。在阿德里亚诺·雷佩蒂的评论的帮助下,我意识到了一个基本的错误——我认为我的第二种形式是错误的。出于好奇,为什么不鼓励对公众进行控制?应该完全避免这样做吗?非常感谢你们,也感谢大家让它看起来不再那么令人畏惧。我现在可以看到,在intellisense下不显示二级表单的所有控件有一些好处,因为它们中的大多数根本不需要,只会增加混乱。