C # вызывать элементы управления.Добавить

#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 генерирует каждый пользовательский элемент управления и добавляет их в список