/// <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后,没有效果.
请问哪里写错了?

解决方案 »

  1.   

    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吧
      

  2.   

    ctr.Invoke => this.Invoke
      

  3.   

    ctr.Invoke(d, ctr.Controls, CtrName, ProName, Type, Value);
    这个地方的ctr.Controls是不是为空了,所以foreach (Control ctr in Ctrs)没有内容直接跳出去了
      

  4.   

    调用的时候InvokeRequired是True吗?
      

  5.   

    ctr.Invoke(d, ctr.Controls, CtrName, ProName, Type, Value);
    这个地方的ctr.Controls是不是为空了,所以foreach (Control ctr in Ctrs)没有内容直接跳出去了
    ==========是啊,请问怎么改一下程序?
      

  6.   

    调用的时候InvokeRequired是True吗?
    ======
    是 True
      

  7.   

    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":
    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);