如何检测C#控件名称改变了?

时间:2016-01-20 07:42:50

标签: c# controls composite-controls

我使用C#Windows窗体控件库创建了一个复合控件,当我在测试程序中使用新控件时,我想找到一种方法来检测新控件的名称何时在设计时更改,我应该怎么做?

3 个答案:

答案 0 :(得分:2)

您可以使用此示例中的IComponentChangeService(在System.ComponentModel.Design中):

public class MyControl : UserControl
{
    public event EventHandler NameChanged;
    protected virtual void OnNameChanged()
    {
        EventHandler handler = NameChanged;
        if (handler != null) handler(this, EventArgs.Empty);
    }

    protected override void OnCreateControl()
    {
        base.OnCreateControl();

        IComponentChangeService changeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));
        if (changeService == null) return; // not provided at runtime, only design mode

        changeService.ComponentChanged -= OnComponentChanged; // to avoid multiple subscriptions
        changeService.ComponentChanged += OnComponentChanged;
    }

    private void OnComponentChanged(object sender, ComponentChangedEventArgs e)
    {
        if (e.Component == this && e.Member.Name == "Name")
            OnNameChanged();            
    }
}

此服务仅在设计模式下提供,而不是在运行时提供 我取消订阅并再次订阅ComponentChanged事件(以避免多次订阅)。

在事件处理程序OnComponentChanged中,我检查我的名字是否已更改并引发NameChanged事件。

答案 1 :(得分:0)

没有“OnNameChanged”事件,而且Name-Property本身不是虚拟的,因此无法覆盖......我担心,没有确定的方法......

一些建议:

  • 用“new”定义你自己的Name-Property,但是继承的类不会自动超过这个 - 更糟糕的是 - 强制转换为控制和使用Control.Name只会解决你的属性...

  • 定义一个虚拟的“MyName”-Property并仅使用它来写入Control的Name-Property。仍然会对Control.Name进行调用,但至少可以强制使用MyName ...

  • 在构造函数中缓冲Name并定义一个Timer,以便在某些内容发生更改时正常显示

总而言之,我必须承认,我不会使用其中任何一种......我不知道你想要达到的目标,但我会尝试找到一种不同的方法来达到这个目标......

答案 2 :(得分:-1)

public MyControl : UserControl
{
     public new string Name 
     {
         get  { return base.Name; }

         set  
         {
            base.Name = value;

            // handle the name change here....
         }
    }

}