【问题标题】:Custom Control Event Handler Issue自定义控件事件处理程序问题
【发布时间】:2012-10-29 16:52:06
【问题描述】:

所有,我有一个使用单例模式调用的自定义用户控件。这个控件可以显示或隐藏,并更新 UI(提供显示/隐藏控件选项)我在控件构造函数中设置了一个事件处理程序。

this.VisibleChanged += new EventHandler(ResultsControl_VisibleChanged);

事件处理程序是

void ResultsControl_VisibleChanged(object sender, EventArgs e)
{
    // Get reference to Show/Hide button.
    var showHideResults = ((SqlEditorForm)this.ParentForm).ShowHideResultsButton;
    if (instance != null)
        showHideResults.Enabled = true;

    // Change the status.
    showHideResults.Text = this.Visible ? 
        "&Hide Query Results" : 
        "&Show Query Results";
    showHideResults.Image = this.Visible ?
        Properties.Resources.HideResultsVS201224 :
        Properties.Resources.ShowResultsVS201224;
}

问题在于我获取ShowHideResultsButton 引用的方式。我收到设计师抛出的以下错误...

我在这里做错了什么?

感谢您的宝贵时间。


编辑。我似乎已经通过移动解决了这个问题

this.VisibleChanged += new EventHandler(ResultsControl_VisibleChanged);

从构造函数到控件的 Load 事件。所以现在的问题变成了:这是一个有效的修复吗?

【问题讨论】:

  • 你确定ResultsControl的父窗体是SqlEditorForm吗?
  • 是的。这是应用的主要形式,整个应用只有两种形式。
  • ResultsControl 是在它上面还是在另一个窗体上?
  • 在我引用SqlEditorForm 的表格上。我相信它是在运行时动态添加的,因此您在下面的回答是有意义的。但是,它现在在 Load 事件中连接时可以工作是没有意义的。
  • Form_Load 事件在表单构造函数之后执行,因此在 InitializeComponent 调用之后,它将 ParentForm 属性设置为 SqlEditorForm 的适当实例。

标签: c# winforms exception custom-controls designer


【解决方案1】:

在您设计UserControl 时,您没有对SqlEditorForm 的引用。只有当您使用设计器或代码将ResultsControl 放在SqlEditorForm 上时,ParentForm 属性才会变为SqlEditorForm。在此之前,IDE 只知道它是 Form 类型。为什么不在SqlEditorForm 中实现ResultsControl_VisibleChanged 事件处理程序?

【讨论】:

  • +1 谢谢你的回答。最后,我使用设计器设置了可行的更改事件处理程序。我现在将测试这是否有效。感谢您在这里的时间...
猜你喜欢
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多