/// <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后,没有效果.
请问哪里写错了?
/// 跨线程设置或获取控件属性
/// </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后,没有效果.
请问哪里写错了?
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.Controls是不是为空了,所以foreach (Control ctr in Ctrs)没有内容直接跳出去了
这个地方的ctr.Controls是不是为空了,所以foreach (Control ctr in Ctrs)没有内容直接跳出去了
==========是啊,请问怎么改一下程序?
======
是 True
{
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":
SetCallback d = new SetCallback(NewThread_Access);
ctr.Invoke(d, ctr,Value);
break;
case "Enabled":
ctr.Enabled = Convert.ToBoolean(Value);
break;
}
}}}private void NewThread_Access(System.Windows.Forms.Control Ctr, string Value)
{
ctr.Text = Convert.ToString(Value);
}
delegate void SetCallback(System.Windows.Forms.Control Ctr, string Value);