Как временное решение проблемы, ЧТО НЕ ПРАВИЛЬНО с точки зрения безопасности программ, можешь написать перед изменением
Код:
![Выделить весь код](images/misc/selectcode.png)
Control.CheckForIllegalCrossThreadCalls = false;
В таком случае исключение вызываться не будет при попытке доступа к контролам через другой поток.
Если же все делать правильно, то только через Invoke.
Пример, как я это реализовывал:
Код:
![Выделить весь код](images/misc/selectcode.png)
delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
private void SetControlPropertyValue(Control oControl, string propName, object propValue)
{
if(oControl.InvokeRequired)
{
SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
oControl.Invoke(d, new object[] { oControl, propName, propValue });
}
else
{
Type t = oControl.GetType();
PropertyInfo[] props = t.GetProperties();
foreach(PropertyInfo p in props)
{
if(p.Name.ToUpper() == propName.ToUpper())
{
p.SetValue(oControl, propValue, null);
}
}
}
}
Это функция, которую я вызываю при изменении из другого потока данных. Вызов довольно прост:
Код:
![Выделить весь код](images/misc/selectcode.png)
SetControlPropertyValue(GroupResultPanel, "Visible", true);
Параметры:
1. Имя контрола
2. Имя свойства
3. Значение.