Запустите код UserControl в событии с измененным цветом C#

Я хочу выполнить кусок кода, когда изменяется цвет метки

следующий код

private void lbl_ps_BackColorChanged(object sender, EventArgs e)
    {
        if (lbl_ps.BackColor == Color.Green)
       {
            menu_ctrl.setup_array = str_array;
            indx = 0;
        }
    }

здесь menu_ctrl - это пользовательский контроль, где этот setup_array состоит из следующего кода

public string[] setup_array
    {
        get
        {
            return list_array;
        }

        set
        {
            list_array = value;
            setup_list(value);
        }
    }

private void setup_list(string[] list_item)
    {
        //this.Width = 266;
        this.Height = 181;
        for (int i = 0; i < n; i++)
        {
            this.Controls.Remove(labels[i]);
        }
        label1.Visible = false;
        this.BorderStyle = BorderStyle.None;
        indx_abs = 0; indx_rel = 0;
        n = list_item.Length;

        Array.Resize(ref labels, n);

        for (int i = 0; i < n; i++)
        {
            labels[i] = new CustomText();
            labels[i].Left = 20;
            labels[i].Top = ((30) * i)+1;
            labels[i].IsSelected = false;
            this.Controls.Add(labels[i]);
            labels[i].Text = list_item[i];
        }

        labels[indx_abs].IsSelected = true;
    }

но код не будет выполняться.... он работает нормально, если я вызываю этот код из события нажатия кнопки.. но он не будет выполняться в событии backcolorchange

любая помощь?

РЕДАКТИРОВАТЬ: я пробовал точку останова, и я получил эту ошибку в первом цикле for в функции setup_list

Cross-thread operation not valid: Control 'CustomText' accessed from a thread other than the thread it was created on.

ошибка была обнаружена глубоко внутри ссылочной библиотеки, которую я использовал. Кстати, функция в этой DLL вызывает это событие с измененным цветом

2 ответа

Решение

Благодаря @ Нати Добкин!!

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

this.Invoke(new MethodInvoker(() => 
           { 
                //run your code here
           }));

В основном ваш код правильный, у меня он работал нормально. Что я хотел бы проверить, это 2 вещи

1) Событие действительно прикреплено, найдите свой код для

this.lbl_ps.BackColorChanged + = new System.EventHandler (this.lbl_ps_BackColorChanged);

2) что событие вызывается, где-то в вашем коде вы должны быть

lbl_ps.BackColor = Color.Green; // или любой другой цвет.

Другие вопросы по тегам