Как переопределить событие в UserControl - PullRequest
1 голос
/ 24 марта 2010

У меня есть приложение WinForms (OwnerForm) с некоторым UserControl.

Когда текстовое поле UserControl изменяется, я хочу фильтровать содержимое OwnerForm.

Но как мне это сделать? Я не хочу указывать OwnerForm внутри пользовательского элемента управления.

Я знаю решение для добавления обработчиков вручную для MyUserControl.tb.TextChanged для некоторых функций в форме владельца, но я думаю, что это плохой способ. Я предпочитаю иметь переопределенные функции, но я не могу себе представить, как это сделать. Есть предложения?

Заранее спасибо,

Ответы [ 5 ]

3 голосов
/ 24 марта 2010

сделать это, если ваш usercontrol сделан из VB.NET, должен обработать событие и повторно вызвать его для потребителя вашего контроля:

Public Class FilterBox

    <Browsable(True)> _
    Public Shadows Event TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)


    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

        RaiseEvent TextChanged(sender, e)

    End Sub

End Class

сделать это, если ваш usercontrol сделан из C #, просто перенаправить событие TextChanged в текстовое поле вашего usercontrol:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Craft
{

    public partial class FilterBox : UserControl
    {
        public FilterBox()
        {
            InitializeComponent();            
        }

        [Browsable(true)]
        public new event EventHandler TextChanged
        {
            add
            {
                textBox1.TextChanged += value;
            }
            remove
            {
                textBox1.TextChanged -= value;
            }
        }//TextChanged "surfacer" :-)

    }//FilterBox
}//Craft

в отношении потребления, FilterBox в VB.NET и Filterbox в C # одинаковы. но реализация в C # более проста: она просто подключает событие программиста-потребителя непосредственно к событию usercontrol textbox1.

я думаю, что заголовок статьи Определение методов добавления и удаления методов доступа к событиям в VB.NET должен быть: Хотите быть предметом зависти всех ваших друзей VB ?

Как видно из кода реализации выше, C # имеет меньше накладных расходов во время выполнения.

Код C # выше невозможен в VB.NET: Кто-то может спросить: «Почему меня это должно волновать?» Что ж, C # позволяет программистам определять свои собственные события добавления и удаления подписки. В результате разработчик C # может расширить поведение добавления и удаления методов подписки. Одним из полезных применений обработчика добавления и удаления является отображение события в элементе управления

примечание: использовать измененное событие текстового поля вашего usercontrol. в конструкторе VS выберите панель инструментов Свойства, щелкните значок события (молнии), дважды щелкните TextChanged, добавьте необходимую логику.

1 голос
/ 24 марта 2010

Переопределить (расширить) элемент управления. Посмотрите, сможете ли вы подключить обработчик событий к событию Changed текстового поля. Если вы не можете найти такое событие, то проверьте, есть ли у него функция OnTextChanged, которую вы можете переопределить (ее имя может отличаться, но большинство авторов, пишущих о контроле, придерживаются соглашения о том, чтобы сделать функции On * виртуальными, чтобы люди, элемент управления может переопределить его).

Если все это не удастся, запустите ваш отладчик и приступайте к правописанию. Ищите вышеупомянутые события и / или функции, а затем начинайте гадать, пытаясь вызвать или перехватить их.

1 голос
/ 24 марта 2010

Создайте событие FilterChanged в UserControl, которое будет вызываться при событии TextChanged внутреннего TextBox. Тогда у вас это будет хорошо инкапсулировано.

0 голосов
/ 24 марта 2010

Вы можете предоставить некоторый контроллер для таких операций.

[Примечание: это псевдокод, проверьте обработчик события для текстового сообщения]


public interface IOperationController
{
  bool DataChanged(string newData,string oldData);
}


public class YourControl:UserControl
{
  private IOperationController_controller;

  public void SetController(IOperationControllercontroller)
  {
    _operationController = controller;
  }

  private void OnTextChanged(object sender, TextChangedEventArgs e)
  {
   if(_operationController != null && _operationController.DataChanged(e.Value,textBox.Text))
   {
    //perform your operation
   }
  }
}

public class OwnerForm:Form,IOperationController
{
  public OwnerForm()
  {
    yourControlInstance.SetController(this)
  }
}


0 голосов
/ 24 марта 2010

Вы можете переопределить, только если вы продлите TextBox. Поэтому вам, вероятно, следует зарегистрировать обработчик в текстовом поле (смена текста), где вы выполняете фильтрацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...