Добавить делегат или свойство события в этот класс? - PullRequest
3 голосов
/ 04 октября 2010

Я создал элемент управления, где другие разработчики могут создавать экземпляр и использовать. В элементе управления есть нажатие кнопки. Как я могу позволить разработчикам добавлять свой собственный код в определенную часть моего элемента управления? Я не уверен, если или как именно использовать делегата или событие в этом сценарии. Может ли кто-нибудь помочь в следующем примере:

public class MyControl : CompositeControl
{
   ...
   void btnSubmit_Click(object sender, EventArgs e)
   {
      //DO SOMETHING
      if (success)
      {
         //CALL DEVELOPER'S LOGIC
      }
   }
}

В коде разработчиков, как они могут передать свою логику, если нажатие кнопки элемента управления прошло успешно?

protected override void CreateChildControls()
{
    var ctlMyControl = new MyControl();

    //ADD SuccessCode() TO ctlMyControl
    //SO IT IS TRIGGERED ON SUCCESS
    //MAYBE SOMETHING LIKE:
    //ctlMyControl.SuccessEvent = SuccessCode()??

    this.Control.Add(ctlMyControl);
}

protected void SuccessCode()
{
    //DO SOMETHING
}

Как мне обновить MyControl, чтобы разрешить это?

Ответы [ 4 ]

5 голосов
/ 04 октября 2010

Вам необходимо добавить событие к элементу управления, например:

void btnSubmit_Click(object sender, EventArgs e) {
    //DO SOMETHING
    if (success) {
        OnSomethingCompleted();
    }
}

///<summary>Occurs when the operation is successfully completed.</summary>
public event EventHandler SomethingCompleted;
///<summary>Raises the SomethingCompleted event.</summary>
internal protected virtual void OnSomethingCompleted() { OnSomethingCompleted(EventArgs.Empty); }
///<summary>Raises the SomethingCompleted event.</summary>
///<param name="e">An EventArgs object that provides the event data.</param>
internal protected virtual void OnSomethingCompleted(EventArgs e) {
    if (SomethingCompleted != null)
        SomethingCompleted(this, e);
}

В форме вы можете добавить обработчик к событию, например так:

myControl.SomethingCompleted += myControl_SomethingCompleted;

void myControl_SomethingCompleted(object sender, EventArgs e) {
    //Do things
}

Для получения дополнительной информации см. Документацию .

1 голос
/ 04 октября 2010

Поскольку ваше событие использует сигнатуру по умолчанию типа EventHandler, вам просто нужно предоставить публичное событие типа EventHandler.Итак, взгляните на код ниже.

Вот как вы реализуете новое событие!

public class MyControl : CompositeControl
{
   //New public event declaration of type EventHandler
   public event EventHandler Submit_OnClick;

   void btnSubmit_Click(object sender, EventArgs e)
   {
      //DO SOMETHING
      if (success)
      {
         //CALL DEVELOPER'S LOGIC

         //Code to raise the event only if there are subscribers.
         if (Submit_OnClick != null)
         {
           Submit_OnClick(this, new EventArgs());
         }
      }
   }
}

Вот как вы используете новое событие!

protected override void CreateChildControls()
{
    var ctlMyControl = new MyControl();
      //Subscribed to the newly added event of your MyControl class
        ctlMyControl.Submit_OnClick += new EventHandler(SuccessCode);

    //ADD SuccessCode() TO ctlMyControl
    //SO IT IS TRIGGERED ON SUCCESS
    //MAYBE SOMETHING LIKE:
    //ctlMyControl.SuccessEvent = SuccessCode()??

    this.Control.Add(ctlMyControl);
}

//Modified the signature to be compliant with EventHandler type
protected void SuccessCode(object sender, EventArgs e)
{
    //DO SOMETHING
}

Наслаждайтесь!

0 голосов
/ 04 октября 2010

Вы должны добавить событие к вашему элементу управления.

Примерно так:

public class MyControl : CompositeControl
{
       public event EventHandler Success;
       ...
       void btnSubmit_Click(object sender, EventArgs e)
   {   
       //DO SOMETHING
        if (success)
        {
             //CALL DEVELOPER'S LOGIC
             OnSuccess();
        }
   }

    private static void OnSuccess()
    {
         if(Success != null)
         {
              Success(this, EventArgs.Empty); //or you can pass event args you want. But you should use EventHandler<T> instead.
         }
    }
}

И чем другие разработчики могут использовать свой элемент управления следующим образом:

protected override void CreateChildControls()
{
    var ctlMyControl = new MyControl();

    ctlMyConstrol += SuccessCode;

    this.Control.Add(ctlMyControl);
}

protected void SuccessCode(object sender, EventArgs e)
{
    //DO SOMETHING
}

Вы можете узнать больше о событиях на MSDN.

0 голосов
/ 04 октября 2010

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

Вот сообщение в блоге Я недавно писал, чтоидет через процесс.

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