В C # как бы я использовал делегат для управления формой из пользовательского класса, который я сделал? - PullRequest
1 голос
/ 28 апреля 2009

Я знаю, как манипулировать текстовым полем в Форме, из Формы, но я не знаю, как манипулировать текстовым полем из КЛАССА в его собственном файле для Формы.

Может ли кто-нибудь объяснить мне, как я написал бы Делегат и CallBack, чтобы я мог просто вызвать метод из Класса в другом файле и изменить материал в текстовом поле из другой формы?

Я не понимаю, как я мог бы объяснить это лучше. Спасибо за любую помощь!

1 Ответ

3 голосов
/ 28 апреля 2009

Ваш класс не должен менять форму.

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

Например:

class MyClass
{
   public event EventHandler DoSomething;

   public void DoWork()
   {
         // do some stuff

         // raise the DoSomething event.
         OnDoSomething(EventArgs.Empty);
   }

   protected virtual void OnDoSomething(EventArgs args )
   {
       // This code will make sure that you have no IllegalThreadContext
       // exceptions, and will avoid race conditions.
       // note that this won't work in wpf.  You could also take a look
       // at the SynchronizationContext class.
       EventHandler handler = DoSomething;
       if( handler != null )
       {
           ISynchronizeInvoke target = handler.Target as ISynchronizeInvoke;

           if( target != null && target.InvokeRequired )
           {
               target.Invoke (handler, new object[]{this, args});
           }
           else
           {
                handler(this, args);
           }
       }
   }
}

И в своей Форме вы делаете это:

MyClass c = new MyClass();
c.DoSomething += new EventHandler(MyClass_DoSomething);
c.DoWork();

private void MyClass_DoSomething(object sender, EventArgs e )
{
    // Manipulate your form
    textBox1.Text = " ... ";
}

Если вы хотите передать некоторые данные из вашего класса в форму, вы можете использовать универсальный делегат EventHandler и создать свой собственный класс EventArgs, который содержит информацию, необходимую вашей форме.

public class MyEventArgs : EventArgs
{
    public string SomeData
    { get; 
      private set;
    }

    public MyEventArgs( string s ) 
    {
        this.SomeData = s;
    }
}

Тогда, конечно, вам придется использовать универсальный обработчик событий в вашем классе и передавать соответствующие данные в конструктор вашего собственного класса eventargs. В обработчике событий вы можете использовать эти данные.

...