Запустите код 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; // или любой другой цвет.