目前我有一个带有Windows窗体的C#程序,然后是一个放在窗体上的用户控件模板 . 用户控件模板实际上只是用作占位符 . 我有一系列继承自此用户控件模板的其他控件 .
每个控件都有导航按钮,如“继续”和“后退”,每个控件都知道下一个需要加载哪个控件 . 然而,我需要弄清楚的是一种更容易的方法来获得这些控件的全局变量 .
我唯一的解决方法是在加载表单时将表单传递给每个控件,并使用表单内的变量进行读写 . 将每个用户控制屏幕构建在一个基本控件之外的正确方法是什么,该控件包含所有控件可以访问的对象?
对不起该职位的漫无边际的性质,但我整个上午都在考虑这个问题 .
以下是一些代码:
我写的大部分内容都是基于隐藏和显示用户控件,以便在导航过程中控件中的内容不会丢失 . 我不需要这样做,因为最终它将从数据库加载数据字段 .
从表单点击初始加载控件的代码:
conTemplate1.Controls.Clear();
conInbound Inbound = new conInbound(this);
Inbound.Dock = DockStyle.Fill;
Inbound.Anchor = (AnchorStyles.Left | AnchorStyles.Top);
conTemplate1.Controls.Add(Inbound);
其中一个控件内的“继续”按钮代码:
if ((Parent.Controls.Count - 1) <= Parent.Controls.IndexOf(this))
{
UserControl nextControl = new conPartialClear();
nextControl.Dock = DockStyle.Fill;
Parent.Controls.Add(nextControl);
this.Hide();
Parent.Controls[Parent.Controls.IndexOf(this) + 1].Show();
}
else
{
this.Hide();
Parent.Controls[Parent.Controls.IndexOf(this) + 1].Show();
}
2 回答
从控件到父级进行通信的最佳实践是使用事件,从父级到控件的通信是调用方法 .
但是,如果您不想或不能遵循这种做法,我会推荐这里 .
每个
UserControl
都有一个ParentForm
属性,该属性返回包含该控件的Form . 如果您知道UserControl
将始终附加到MyParentForm
,您只需转换ParentForm
然后您可以访问所有公共控件,方法等 .这就是我的意思:
这样,您就可以轻松访问
MyParentForm
的任何公共成员 . 您的conInbound
类可能包含this.MyParentForm.GlobalSettings.etc...
等代码,甚至可以访问任何公共控件 .我不完全确定我理解你的问题 . 听起来你希望用户控件用它的父表单“做某事” . 如果是这种情况,您可能需要考虑向UC添加事件,然后在表单上处理它们 .
基本上,对于你的UC“继续”,你会有一个被按下时触发的事件 . 您需要在表单中处理它 . 我不确定内存中的语法,或者我会为你编写代码方面的东西 . 但我认为这是你想要的路线 . 您可以将UC视为任何其他Windows窗体控件 . 如果向表单添加按钮,则为其分配事件方法 . 与UC一样 .
我发现了这一点,并认为它可能会有所帮助 . 向下滚动到谈论UC和事件的地方 . http://www.akadia.com/services/dotnet_user_controls.html
希望这可以帮助 .
在OP的新信息后编辑 .
您可以在类型为yourForm的UC中声明一个全局变量,然后在运行时将该变量设置为ParentForm,如果我正确理解您的话 .
所以,在你的UC课程中,你可以这样做:
然后在UC的构造函数中,您可以将其设置为:
parentFormInstance = this.ParentForm
; (或任何属性名称) .这允许您在设计时使用:
没有编译器对你大喊大叫 .
只是基本的建议,但如果你可以回过头来让自己更容易,即使需要一些额外的时间来重新工作,这也是值得的 . 从长远来看,它可以节省您的时间 .