日期:2014-05-20  浏览次数:20669 次

▲:线程类代码中更新Form控件问题
实现功能:客户端,服务端
1.客户端建立一个空窗体
2.从服务端传给客户端要生成的TextBox数量
3.客户端接收,并在窗体上生成TextBox数组
4.客户端在输入完最后一个TextBox内容后,将所有TextBox内容返回服务端

当前问题:

VS2005下;以上操作可以正常接收刷新当前窗体,并激活当前窗体,但是无论如何获取到的第一个TextBox无法获取输入焦点,通过在窗体上点击鼠标才可以!

在网上搜索结果说是委托不能对新窗体操作,不知道到怎么回事,请高手赐教!


//从服务端接收到待生成的TextBox个数
string   recvString= " ";  

//Form_Load()
{

                        Thread   thread   =   new   Thread(new   ThreadStart(targett));
                        thread.Start();

}


public   delegate   void   MyInvoke(string   str);         //str   即为接收到的字符串


private   void   targett()
{
                        while   (bb)             //bb=true;
                        {
                                Byte[]   bbb   =   new   Byte[1024];
                                string   aa   =   " ";
                                int   bytes;
                                bytes   =   sock.Receive(bbb,   bbb.Length,   0);
                                aa   +=   System.Text.Encoding.Default.GetString(bbb,   0,   bytes);

                                recvString   +=   aa;

                                //使用委托传值给新建窗体
                                MyInvoke   myIn   =   new   MyInvoke(CreateNewForm);
                                this.BeginInvoke(myIn,   new   object[]   {   recvString   });
                        }
}

//刷新当前窗体,根据传入的字符串生成新窗体

public   CreateNewForm(String   str)
{
this.Controls.Clear();

int   Num=Convert.ToInt32(str);   //转化为数字

                  TextBox   []tb=new   TextBox[Num];
                for(int   i=0;i <Num;i++)
{
tb[i].Name= "TextBox "+i.ToString();
tb[i].Location   =   new   Point(100,10*i+10);
tb[i].TabIndex   =   i;

this.Controls.Add(tb[i]);

}


this.Activate();   //激活当前窗体为主窗体
tb[0].Focus();   //第一个TextBox获取焦点
}



------解决方案--------------------
我剛試過了,可以的,但是你的程序好像有點地方不對,
for(int i=0;i <Num;i++)