Выполнение операции над блоком Richtext из другого потока другого класса - PullRequest
1 голос
/ 23 августа 2011

m возникли проблемы при работе с richtextbox из другого класса

m использует класс backgroundworker для отделения потока GUI от потока вычислений

это функция, которую мне нужно вызвать из другого класса

public void UpdateRTB(String strText, Color colVar)
    {
        if (InputBox.InvokeRequired)
        {
            InputBox.Invoke(new UpdateRTBCallback(this.UpdateRTB), new object[] { strText, colVar });
        }
        else
        {
            InputBox.Select(InputBox.Text.IndexOf(strText), strText.Length);
            InputBox.SelectionColor = colVar;
            InputBox.Update();
        }
    }

переменная objForm1 - это переменная, объявленная после инициализации формы как

objForm1 = this;

функция, которая возвращает форму:

public static Form1 GetThisForm()
    {
        return objForm1;
    }

это мой делегат, который объявлен глобально

public delegate void UpdateRTBCallback(String strText, Color strColor);

это код, который я пишу в другом классе, чтобы вызвать его

Form1 form1 = Form1.GetThisForm();
form1.UpdateRTB(item, Color.Yellow);

в objForm1, когда я отлаживаюсь, я вижу, что в полях отображается System.InvalidOperationException. Пожалуйста, помогите !!!

Ответы [ 2 ]

1 голос
/ 23 августа 2011

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

if (this.InvokeRequired) { 
  // called from non-gui thread, use invoke to delegate the action to the gui thread
    MyCallBack callback = new MyCallBack(myCallBack); 
    this.Invoke(callback, params); 
} else { 
   // called from gui thread, do your thing as normal
} 
0 голосов
/ 21 сентября 2011

ОК, я предполагаю, что есть второй возможный сценарий. Ссылка на вашу форму устанавливается после инициализации формы, поэтому я предполагаю, что это в вашем конструкторе формы (и я надеюсь, что это после InitializeComponent () в соответствии с рекомендациями WinForms ..). Функция, которая возвращает ссылку, является статической, что означает, что ссылка также должна быть статической, что означает, что вы можете смотреть на нее до вызова конструктора формы и до установки ссылки. Здесь я должен добавить, что вы не показали нам , где вы обращаетесь к ссылке из (из (статической) функции, которая выполнялась до того, как форма была построена?).

В любом случае, вот некоторые альтернативы, которые, я надеюсь, будут для вас полезным ответом / опцией -> вместо того, чтобы писать свой собственный, вы можете захотеть взглянуть на эти полезные вспомогательные свойства, которые, кажется, уже делают то, что вам нужно Form.ActiveForm или Application.OpenForms .

PS: System.InvalidOperation может отображаться для полей вашей формы, поскольку они также оцениваются из другого потока (отладки), чем поток пользовательского интерфейса.

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