【问题标题】:How to expose events in a WinForms custom control如何在 WinForms 自定义控件中公开事件
【发布时间】:2011-08-17 12:06:53
【问题描述】:

我开发了一个自定义控件,其作用类似于组框,组标签上带有一个复选框。这个想法是,一旦取消选中该复选框,该组中的所有控件都将被禁用。

我需要公开 Check changed 事件,以便在需要时可以执行外部操作。我还公开了 Check 状态已更改。

目前,当使用该控件时,当组中的任何控件失去焦点时,它会更改检查状态。

当我处理检查更改事件时,是否应该为任何外部处理程序重新触发该事件?

定义的事件:

/// <summary>
/// Event to forward the change in checked flag
/// </summary>
public event EventHandler CheckedChanged;

/// <summary>
/// Event to forward the change in checked state of the checkbox
/// </summary>
public event EventHandler CheckStateChanged;

事件处理代码:

private void chkBox_CheckedChanged(object sender, EventArgs e)
{
    // Disable the controls within the group
    foreach( Control ctrl in this.Controls )
    {
        if( ctrl.Name != "chkBox" && ctrl.Name != "lblDisplay" )
        {
            ctrl.Enabled = this.chkBox.Checked;
        }
    }

    // Now forward the Event from the checkbox
    if (this.CheckedChanged != null)
    {
        this.CheckedChanged(sender, e);
    }
}

private void chkBox_CheckStateChanged(object sender, EventArgs e)
{
    // Forward the Event from the checkbox
    if( this.CheckStateChanged != null )
    {
        this.CheckStateChanged( sender, e );
    }
}

【问题讨论】:

  • 这看起来是正确的。有什么问题?
  • 当用户输入或更改任何字段时,组中的控件将被禁用。然后他们必须重新启用该组并移动到下一个控件。

标签: c# winforms custom-controls


【解决方案1】:

你快到了。您只需使用外部类中的事件处理程序注册您的事件。

CheckedChanged += ExternalChkBox_CheckChanged;

private void ExternalChkBox_CheckChanged(object sender, EventArgs e)
{
    // External trigger
}

【讨论】:

  • 我在控件外部的代码中执行此操作,但我不相信事件的触发不会导致包含的控件被禁用。
  • @TeamWild:我不太确定你的问题是什么。无论如何,您发布的代码应该在自定义控件类中。而我写的代码只应该去外部类。您应该能够从 CustomControl 类本身启用/禁用控件。
  • 感谢您确认我目前的做法。我假设当其中一个控件失去焦点时,组控件被禁用是因为重新触发了检查更改事件。我将不得不回到绘图板上。 :o/
  • @TeamWild:是的,我认为你必须改变它的行为方式。
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多