首页 文章

C#使用表单加载其他用户控件并可以访问基本控件或属性

提问于
浏览
3

目前我有一个带有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 回答

  • 2

    从控件到父级进行通信的最佳实践是使用事件,从父级到控件的通信是调用方法 .

    但是,如果您不想或不能遵循这种做法,我会推荐这里 .

    每个 UserControl 都有一个 ParentForm 属性,该属性返回包含该控件的Form . 如果您知道 UserControl 将始终附加到 MyParentForm ,您只需转换 ParentForm 然后您可以访问所有公共控件,方法等 .

    这就是我的意思:

    public class conTemplate
    {
        public MyParentForm MyParentForm
        {
            get
            {
                return (MyParentForm)this.ParentForm;
            }
        }
    }
    

    这样,您就可以轻松访问 MyParentForm 的任何公共成员 . 您的 conInbound 类可能包含 this.MyParentForm.GlobalSettings.etc... 等代码,甚至可以访问任何公共控件 .

  • 0

    我不完全确定我理解你的问题 . 听起来你希望用户控件用它的父表单“做某事” . 如果是这种情况,您可能需要考虑向UC添加事件,然后在表单上处理它们 .

    基本上,对于你的UC“继续”,你会有一个被按下时触发的事件 . 您需要在表单中处理它 . 我不确定内存中的语法,或者我会为你编写代码方面的东西 . 但我认为这是你想要的路线 . 您可以将UC视为任何其他Windows窗体控件 . 如果向表单添加按钮,则为其分配事件方法 . 与UC一样 .

    我发现了这一点,并认为它可能会有所帮助 . 向下滚动到谈论UC和事件的地方 . http://www.akadia.com/services/dotnet_user_controls.html

    希望这可以帮助 .

    在OP的新信息后编辑 .

    您可以在类型为yourForm的UC中声明一个全局变量,然后在运行时将该变量设置为ParentForm,如果我正确理解您的话 .

    所以,在你的UC课程中,你可以这样做:

    private parentFormInstance;
    

    然后在UC的构造函数中,您可以将其设置为:

    parentFormInstance = this.ParentForm ; (或任何属性名称) .

    这允许您在设计时使用:

    parentFormInstance.DoSomething();
    

    没有编译器对你大喊大叫 .

    只是基本的建议,但如果你可以回过头来让自己更容易,即使需要一些额外的时间来重新工作,这也是值得的 . 从长远来看,它可以节省您的时间 .

相关问题