2012-04-18 7 views
0

Все, что я пытаюсь сделать, это обновить textBox (в данном случае txtInit) из другого класса. Я много читал о том, как должен измениться сам пользовательский интерфейс, и что-то об использовании диспетчера. Я нашел ответ на здесь, что, казалось, близко, но я не мог заставить его работать на меня ... он сказал, чтобы попытаться с помощью строки:C# Обновление TextBox из другого класса

MainForm.Dispatcher.Invoke(new Action(delegate() {MainForm.myInstance.txtInit.Text = "Text"};); 

В моем классе ServerSide, мне нужно отправить строку в txtInit textbox на моем MainForm .. и это все, что мне нужно сделать .. спасибо за любую помощь.

+2

Пожалуйста, добавьте тег, чтобы указать, используете ли вы C# в настольное приложение (WPF, WinForms) или веб-приложение (ASP.NET). – DOK

+0

Это будет настольное приложение, я использую Visual Studio, если это вообще имеет значение ... и я не уверен, что это так. – Ramrod

ответ

1

Классы не имеют ничего общего с тем (что ваша проблема прямо сейчас). Каждый элемент управления имеет метод Invoke, который будет выполнять правильную синхронизацию потоков для вас. Таким образом, вы можете сделать

MainForm.myInstance.txtInit.Invoke((sender, args) => (sender as TextBox).Text = "text"); 

Для повышения производительности вы можете проверить (который в основном говорит вам, если вы находитесь в том же потоке) свойство Control.IsInvokeRequired.

Другой способ сделать это состоит в использовании SynchronizationContext в потоке пользовательского интерфейса, который вам нужно, чтобы захватить в конструкторе формы из SynchronizationContext.Current, а затем сделать

syncContext.Send((obj) => MainForm.myInstance.txtInit.Text = "Text", null); 
+0

Хорошо, как я могу создать экземпляр моего MainForm? Я знаю код, который я использовал, но я не уверен, что и как его использовать. – Ramrod

+0

ah - поместите статическое поле в свой класс MainForm и сохраните экземпляр там - это называется шаблоном Singleton – Bond

0

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

  1. http://msdn.microsoft.com/en-us/library/ms171728.aspx

  2. Update UI from multiple worker threads (.NET)

  3. Controlling form elements from a different thread in Windows Mobile

1

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

Вот пример:

public partial class Form1 : Form 
    { 
     public delegate void UpdateText(string text); 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     public void SetTextBoxText(string text) 
     { 
      // Check to see if invoke required - (from another thread) 
      if(textBox1.InvokeRequired) 
      { 
       textBox1.Invoke(new UpdateText(this.SetTextBoxText), 

        new object[]{text}); 
      } 
      else 
      { 
       textBox1.Text = text; 
      } 
     } 
    } 
+0

Но я не могу вызывать метод из другого моего потока, если я не могу получить доступ к MainForm, чтобы использовать этот метод ... Думаю, я правильно об этом думаю. В моем классе сервера я не могу сказать: MainForm.updateText («Текст»); – Ramrod

+0

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

+0

Итак, я не запускаю никаких других форм. общественного MainForm() \t \t { \t \t \t InitializeComponent(); \t \t} \t \t \t \t [STAThread] \t \t государственной статической силы основных (String [] арг) \t \t { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault (false); \t \t \t Application.Run (новый MainForm()); \t \t} Я не понимаю, где мне нужно «назвать»? мой MainForm. – Ramrod

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