Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Как временное решение проблемы, ЧТО НЕ ПРАВИЛЬНО с точки зрения безопасности программ, можешь написать перед изменением
Код: Выделить весь код
Control.CheckForIllegalCrossThreadCalls = false;
В таком случае исключение вызываться не будет при попытке доступа к контролам через другой поток.
Если же все делать правильно, то только через Invoke.

Пример, как я это реализовывал:

Код: Выделить весь код
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);
					}
				}
			}
		}
Это функция, которую я вызываю при изменении из другого потока данных. Вызов довольно прост:

Код: Выделить весь код
SetControlPropertyValue(GroupResultPanel, "Visible", true);
Параметры:
1. Имя контрола
2. Имя свойства
3. Значение.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:54, 09-02-2012 | #8