首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于跨线程访问窗体控件解决方法

2012-01-01 
关于跨线程访问窗体控件///summary///跨线程设置或获取控件属性////summary///paramname Ctrs

关于跨线程访问窗体控件
///   <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吗?

热点排行