Как обнаружить измененное имя элемента управления C#?
Я создал составной элемент управления с помощью библиотеки элементов управления C# Windows Forms. Когда я использую новый элемент управления в тестовой программе, я хочу найти способ определить, когда имя нового элемента управления изменилось во время разработки, что мне делать?
3 ответа
Вы можете использовать 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
событие.
Нет события "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....
}
}
}