c#使用表单来加载其他用户控件并访问基本控件或属性
本文关键字:控件 访问 属性 用户 表单 其他 加载 | 更新日期: 2023-09-27 18:07:10
目前我有一个c#程序与windows窗体,然后用户控制模板放在窗体上。用户控件模板实际上只是用作占位符。我有一系列从这个用户控件模板继承的其他控件。
每个控件都有导航按钮,如'Continue'和'Back',每个控件都知道下一个需要加载哪个控件。然而,我需要弄清楚的是一种更简单的方法来拥有这些控件的全局变量。
我唯一的解决办法是,我把表单传递给每个控件时,他们被加载,并使用表单内的变量来读取和写入。怎样才能让这些用户控制屏幕建立在包含所有控制可以到达的对象的基本控制之上?
很抱歉这篇文章杂乱无章,但我整个上午都在思考这个问题。
下面是一些代码:
我所写的大部分内容都是基于隐藏和显示用户控件,以便控件中的内容不会在导航过程中丢失。我不需要这样做,因为最终它将从数据库加载数据字段。
初始加载控件的代码:
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();
}
从控件到父控件通信的最佳实践是使用事件,而从父控件到控件通信的最佳实践是调用方法。
但是,如果你不想或不能遵循这种做法,以下是我的建议:
每个UserControl
都有一个ParentForm
属性,它返回包含控件的Form。如果您知道UserControl
将始终附加到MyParentForm
,您只需强制转换ParentForm
,然后您可以访问所有公共控件,方法等。
我的意思是:
public class conTemplate
{
public MyParentForm MyParentForm
{
get
{
return (MyParentForm)this.ParentForm;
}
}
}
通过这种方式,您可以轻松访问MyParentForm
的任何公共成员。您的conInbound
类可以有this.MyParentForm.GlobalSettings.etc...
这样的代码,甚至可以访问任何公共控件。
我不太明白你的问题。听起来你想让用户控件对它的父窗体"做点什么"。如果是这种情况,您可能需要考虑将事件添加到UC中,然后在表单本身上处理它们。
基本上,对于你的UC的"继续",你将有一个事件,当它被按下时被触发。你需要在表单中处理它。我不太确定记忆中的语法,或者我可以为您编写代码。但我认为这是你想走的路线。把您的UC想象成任何其他windows窗体控件。如果你在表单中添加了一个按钮,你就给它分配了它的event方法。对UC做同样的处理。
我发现这个,认为它可能是有帮助的。向下滚动到谈论UC和事件的地方。http://www.akadia.com/services/dotnet_user_controls.html
希望对你有帮助。
编辑来自op的新信息
你可以在UC中声明一个全局变量的类型为yourForm,然后在运行时将该变量设置为ParentForm,如果我理解正确的话。
在你的UC类中,你可以这样做:
private parentFormInstance;
,然后在UC的构造函数中,您可以这样设置它:
parentFormInstance = this.ParentForm
;(或者其他属性名)。
这允许您在设计时使用:
parentFormInstance.DoSomething();
,而编译器不会对你大喊大叫。
这只是基本的建议,但如果你能回过头来,让自己更容易,即使需要一些额外的时间来重新工作,这也是值得的。从长远来看,这会节省你的时间。