2009-04-28 2 views
1

Я знаю, как манипулировать текстовым полем формы, из формы, но я не знаю, как манипулировать текстовым полем из CLASS в его собственном файле в форме.В C#, как бы я использовал делегат для манипулирования формой из пользовательского класса, который я создал?

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

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

+0

Это похоже на: http://stackoverflow.com/questions/717454/accessing-class-members-with-invoke-from-a-different-thread-in-c, http://stackoverflow.com/ вопросы/717264/c-accessing-form-members-from-another-class, http://stackoverflow.com/questions/717074/how-to-access-form-objects-from-another-cs-file-in- c – Groo

+0

Да, они похожи, но они по-настоящему не помогают мне. Спасибо за помощь, хотя, надеюсь, кто-то может скоро ответить. – OneShot

ответ

3

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

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

Например:

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; 
    } 
} 

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

+0

Разве это уже потокобезопасно или это толо означает, что вы еще не сделали этого? Мне нужно, чтобы он был потокобезопасным, не могли бы вы отбросить его туда? – OneShot

+0

Чтобы сделать это потокобезопасным, вам нужно будет проверить, нужно ли вам вызывать обработчик событий или нет. Я изменю код ... –

+0

Большое вам спасибо! Я посмотрю, смогу ли я заставить его работать сейчас. – OneShot

 Смежные вопросы

  • Нет связанных вопросов^_^