【问题标题】:Accessing form variables from user control in C#在 C# 中从用户控件访问表单变量
【发布时间】:2012-08-01 16:35:47
【问题描述】:

我有一个包含多个表单的应用程序。有一个 MainForm,然后在此 MainForm 中打开其他表单。打开的子窗体之一(我们将称之为 Form1)包含一个用户控件,其中包含控件,例如数据网格视图。这个 datagridview 控件有几个被触发的事件,一个是“cellclick”事件。

此单击事件必须访问在 Form1 中声明的公共计时器对象。

目前只是为了让它工作,我使用了代码:

((Form1)this.Parent.Parent.Parent.Parent.Parent).clickTimer.Start();

然而,这似乎不是我可以访问此 Timer 对象的最佳方式,并且可能会成为 Form1 及其用户控件的未来开发的一个令人头疼的问题。

从用户控件的 datagridview 点击事件中访问我的 Form1 计时器的替代方法是什么?

感谢任何建议,因为我现在对此一无所知。

谢谢

【问题讨论】:

  • 我怀疑这个设计;我会努力让子控件独立于他们的父母。

标签: c# winforms


【解决方案1】:

您可以让用户控件将 Timer 实例作为构造函数参数并将其存储在私有支持字段中以供将来访问。

【讨论】:

  • 这在使用表单设计器时可能会出现问题。
  • @Erno 如果您保留默认构造函数,则不会,而是添加一个新构造函数供您自己使用。
  • @AlexanderR - 你将如何同时使用?
  • 我不需要更改我的 Form1 设计器以使用重载的构造函数吗?目前这是调用用户控件的唯一位置。
  • 您在用户控件上有两个构造函数,一个 - 默认自动生成的 - 不接受参数,另一个接受 Timer 对象。然后只需在代码中调用您想要的那个。当然,您需要处理在类的其余部分中未初始化的计时器字段。
【解决方案2】:

我想出了更优雅的方式来访问我的 Form1 对象(而不是使用 Parent.Parent.Parent...等):

Control activeForm = this.FindForm();

所以现在我有:

((Form1)activeForm).clickTimer.Start();

上面的代码为我提供了 userControl 存在于内部的表单(Form1),并且由于 UC 存在于内部的表单将始终有一个 Timer,因此即使用户控件放置在不同的表单上(比如 Form2 )。

但是,@Darin 确实提供了一个很好的替代方案,但我选择使用我的解决方案,因为它为我提供了解决问题的最快方法,所需的代码更改最少,但我的表单的可维护性仍然很低。当然,具体到我的情况。

【讨论】:

  • PS - 感谢您的建议..只是需要让我的大脑正常工作。
【解决方案3】:

您可以在子表单中创建一个静态事件并在父表单中注册。

在“cellclick”上触发事件并在父窗体的事件处理程序中触发计时器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多