您的位置:首页 > 其它

多线程中控制winform的控件!

2008-09-23 17:44 162 查看
http://profile.csdn.net/admin/EditUserTage.aspx

不知道大家遇到过这样的问题没有,winform中,有主线程创建了控件,然后创建子线程去处理一些事情,往往

会在子线程中去控制控件,如textbox的值!

在这里,事情就发生了!例如,我们给textbox复制的时候,会有意向不到的结果,给tabpage聚焦的时候,也会有一些事情发生!

究其原因,是在不同的线程中操作的原因!
下面是一个解决方法,仅供参考:

using System;
using System.Text;
using System.Windows.Forms;

namespace MyTest{
/// <summary>
/// 解决子线程调用父线程的问题
/// </summary>
public class ChangeControlInThread
{
public ChangeControlInThread()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

//在新的线程里面修改主线程里的控件的数值

/// <summary>
/// 修改textbox的值
/// </summary>
/// <param name="tb">yourTextBox</param>
/// <param name="_Value">修改成的值</param>
public void Change_TextBox_Value(TextBox tb,string _Value)
{
ChangeTB_Err_Value(tb,_Value);

}

delegate void CHANGETB_ERR_VALUE(object sender, string text);

private void ChangeTB_Err_Value(object sender, string text)
{
TextBox tb = sender as TextBox;
if (tb == null) return;
//如果是在控件线程外的创建,则调用委托
if (tb.InvokeRequired)
{
CHANGETB_ERR_VALUE anc = new CHANGETB_ERR_VALUE(ChangeTB_Err_Value);
tb.Invoke(anc, new object[] {sender, text });
}
else
{
tb.Text = text;
}

}

/// <summary>
/// 设置TabControl中的TabPage的当前选项卡
/// </summary>
/// <param name="tc">yourTabControl</param>
/// <param name="tp">yourTabPage</param>
public void Select_TabPage(TabControl tc,TabPage tp)
{
ShowTabPage(tc,tp);

}

delegate void SHOWTABPAGE(TabControl tc,TabPage tp);

private void ShowTabPage(TabControl tc,TabPage tp)
{
if (tc==null||tp==null)
{
return;
}

if (tc.InvokeRequired)
{
SHOWTABPAGE anc=new SHOWTABPAGE(ShowTabPage);
tc.Invoke(anc,new Object[]{tc,tp});
}
else
{
tc.SelectedTab=tp;
}
}
}
}

不知道有没有更好的解决办法!这个方法,已经纳入个人类库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: