2016-01-20 34 views
0

我开始用现有应用程序中的用户控件和拆分容器重组表单。在我有一个名为GlobalFunctions的课程之前,有一个名为ResetAllForms()的方法。当我从frmMainGlobalFunctions.ResetAllForms()这将设置表单中的所有属性,以我想为他们的默认值(禁用/启用,可见或不可见。)无法从WinForms应用程序中的其他类访问UserControl对象

之前,我访问他们像formName.Textbox1.Enabled = True但现在如果我尝试从用户控件名称调用它们,如UserControlA.Textbox1.Enabled = True它给我一个错误,指出“引用非共享成员需要对象引用”。我知道这意味着实例化一个用户控件的副本,但我只是从工具箱中拖放,所以我不知道它的名字是什么。

回答

0

显然它是在后端安装用户控件。我通过使用IntelliSense从主表单中找到它的名字。

因此,在我的GlobalFunctions.ResetAllForms()方法中,我发现它为frmMain.UserControlA1.Textbox1。那么我可以像这样设置它; frmMain.UserControlA1.Textbox1.Enabled = True

显然,当它在后端实例化时,它只是向用户控件名称添加一个。

+1

虽然你可以这样做,而且这是一种快速的方法,但最好为你的用户控件提供一个公共的ResetControls方法,并调用它而不是直接访问内部控件。 –

+0

所以我听到你说的是你应该在每个控件上创建一个方法来做到这一点? – CryptoJones

+1

不是强制性规则,但它更好。访问这些属性是以某种方式反对封装。但这是一个折衷。当您决定将这些控件放在某个用户控件中时,您应该看看您的目标。当你创建一个用户控件时,一个目标就是让你的其他应用程序部分与该用户控件的实现和内容无关,也许你决定使用一个蒙面文本框而不是文本框,或者你决定使用数字而不是文本框,在这种情况下,您只能使用公共方法和属性与控件进行交互。 –