#c# #invoke
#c# #вызвать
Вопрос:
Я получил экземпляр элемента управления My_Control. В зависимости от текущего шага в этом элементе управления должны отображаться разные вспомогательные элементы управления.
public partial class Teach_All : User_Control
{
/// <summary>
/// this event gets called on an index change
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Current_index_index_changed(object sender, CIndex_Updater.Index_Changed_Eventargs e)
{
//remove old Controll
int old_index = e.new_index - 1;
if (old_index >= 0)
{
if (InvokeRequired)
{
this.BeginInvoke((MethodInvoker)(() => Controls.Remove(teach_steps[old_index])));
}
else
{
this.Controls.Remove(teach_steps[old_index]);
}
}
//do some stuff....
//Display next control
if (InvokeRequired)
{
this.BeginInvoke((MethodInvoker)(() => Controls.Add(teach_steps[e.new_index])));
}
else
{
this.Controls.Add(teach_steps[e.new_index]);
}
}
}
Однако добавление элемента управления вызывает недопустимое исключение доступа к потоку. Таким образом, вызов работает не так, как ожидалось. Это событие может быть запущено из любого потока, поэтому я считаю, что мне нужен Invoke.
Не могли бы вы дать мне несколько советов о том, как заставить этот вызов работать?
Комментарии:
1. Добавляемый элемент управления также должен быть создан в основном потоке пользовательского интерфейса. Так ли это?
2. список teach_steps создается в конструкторе teach_all. Этот конструктор вызывается из конструктора пользовательского интерфейса. Итак, я бы сказал, что этот элемент управления был создан в конструкторе
teach_steps = Generate_User_Contol_List();
. Generate User_Controll генерирует каждый пользовательский элемент управления и добавляет их в список