Как обнаружить измененное имя элемента управления C#?

Я создал составной элемент управления с помощью библиотеки элементов управления C# Windows Forms. Когда я использую новый элемент управления в тестовой программе, я хочу найти способ определить, когда имя нового элемента управления изменилось во время разработки, что мне делать?

3 ответа

Решение

Вы можете использовать IComponentChangeServiceSystem.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 событие.

Нет события "OnNameChanged", а само свойство Name-свойство не является виртуальным и, следовательно, не может быть переопределено... Боюсь, что верного пути нет...

Некоторые предложения:

  • Определите свое собственное свойство Name с помощью "new", но унаследованные классы не будут автоматически обгонять это и, что еще хуже, приведут к использованию Control и использованию Control.Name будет просто работать вокруг вашего свойства...

  • Определите виртуальное свойство "MyName" и используйте его только для записи в Name-свойство элемента управления. Тем не менее, вызов Control.Name будет проходить, но, по крайней мере, вы можете принудительно использовать MyName...

  • Введите имя в вашем конструкторе и определите таймер, который будет выглядеть регулярно, если что-то изменилось

В целом я должен признать, что я бы не использовал ни одного из них... Я не знаю, чего именно вы хотите достичь, но я бы попытался найти другой подход для достижения этой цели...

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

         set  
         {
            base.Name = value;

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

}
Другие вопросы по тегам