关于跨线程访问窗体控件
/// <summary>
/// 跨线程设置或获取控件属性
/// </summary>
/// <param name= "Ctrs "> 控件集合 </param>
/// <param name= "CtrName "> 控件名称 </param>
/// <param name= "ProName "> 控件属性 </param>
/// <param name= "Type "> 操作类型:get.获取 set.设置 </param>
/// <param name= "Value "> 值 </param>
private void Thread_Access(System.Windows.Forms.Control.ControlCollection Ctrs, string CtrName, string ProName, string Type, ref string Value)
{
foreach (Control ctr in Ctrs)
{
if (ctr.Controls.Count > 0)
{
Thread_Access(ctr.Controls, CtrName, ProName, Type, ref Value);
}
if ((ctr.Name == CtrName) && (Type == "set "))
{
switch (ProName)
{
case "Text ":
if (ctr.InvokeRequired)
{
SetCallback d = new SetCallback(Thread_Access);
ctr.Invoke(d, ctr.Controls, CtrName, ProName, Type, Value);
}
else
ctr.Text = Convert.ToString(Value);
break;
case "Enabled ":
ctr.Enabled = Convert.ToBoolean(Value);
break;
}
}
}
}
delegate void SetCallback(System.Windows.Forms.Control.ControlCollection Ctrs, string CtrName, string ProName, string Type, ref string Value);
这样写程序,调用ctr.Invoke后,没有效果.
请问哪里写错了?
[解决办法]
SetCallback d = new SetCallback(Thread_Access);
ctr.Invoke(d, ctr.Controls, CtrName, ProName, Type, Value);
SetCallback d = new SetCallback(Thread_Access);
ctr.BeginInvoke(d, ctr.Controls, CtrName, ProName, Type, Value);
看行不行
另外,跨程取控件的性并不需要Invoke吧
[解决办法]
ctr.Invoke => this.Invoke
[解决办法]
ctr.Invoke(d, ctr.Controls, CtrName, ProName, Type, Value);
这个地方的ctr.Controls是不是为空了,所以foreach (Control ctr in Ctrs)。。。没有内容直接跳出去了
[解决办法]
调用的时候InvokeRequired是True吗?