多线程中控制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;
}
}
}
}
不知道有没有更好的解决办法!这个方法,已经纳入个人类库
不知道大家遇到过这样的问题没有,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;
}
}
}
}
不知道有没有更好的解决办法!这个方法,已经纳入个人类库
相关文章推荐
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- Winform中进行线程安全的多线程操作(主线程控件,非backgroundWorker)
- C#多线程异步访问winform中控件
- 转:如何在多线程中调用winform窗体控件
- winform 多线程改变UI控件状态
- c#中使用多线程访问winform中控件的若干问题
- winform 利用 多线程 处理窗体假死,利用 Invoke BeginInvoke 处理子线程调用 UI 控件报错的问题
- winform 使用委托 实现多线程访问控件
- WinForm中窗体resize的时候对于控件位置的控制
- c#中使用多线程访问winform中控件
- c#中使用多线程访问winform中控件的若干问题
- Best Practices for Scaling the Windows Forms DataGridView Control(winform中控制DataGridView控件规模的最佳实践)
- [转] c#有关winform的两个代码片段(多线程操作窗体控件与窗体淡入淡出效果)
- 如何在多线程中调用winform窗体控件(转)
- C# 通过委托控制进度条以及多线程更新控件
- C# 多线程控制控件实例(例程简单,注释详细)
- c#中使用多线程访问winform中控件的问题
- C# 多线程控制控件实例
- c#中使用多线程访问winform中控件
- C# 在一个winform中控制另一个winform中的控件