winform的窗体控件可以用线程直接调用吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform的窗体控件可以用线程直接调用吗相关的知识,希望对你有一定的参考价值。
默认地,不允许其他线程直接存取(调用)Winform中的控件。
要从其他线程中存取Winform控件,可采用以下两种方法之一:
方法1)不进行线程安全的检查
或者
方法2)通过委托的方式
代码如下所示
public partial class Form1 : Formpublic Form1()
InitializeComponent();
//方法1:不进行跨线程安全检查
//System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
private void button1_Click(object sender, EventArgs e)
Thread th1 = new Thread(new ThreadStart(CalNum));
th1.Start();
private void CalNum()
//button1.Enabled = false;
int result = 0;
for (int i = 1; i < 100000000; i++)
result += i;
SetCalResult(result);
//button1.Enabled = true;
//方法2:检查是否跨线程,然后将方法加入委托,调用委托
public delegate void SetTextHandler(int result);
private void SetCalResult(int result)
if (label2.InvokeRequired == true)
SetTextHandler set = new SetTextHandler(SetCalResult);//委托的方法参数应和SetCalResult一致
label2.Invoke(set, new object[] result ); //此方法第二参数用于传入方法,代替形参result
else
label2.Text = result.ToString();
参考技术A 可以,在窗体的创建或者load方法中加入
Control.CheckForIllegalCrossThreadCalls =false;
就可以跨线程调用了。一般小程序自己玩玩可以这样做。
.NET Winform 自定义分页控件如何在父窗体中调用?
我现在遇到一个问题,我自己写了一个分页用户控件testControl(有首页,上一页,下一页,跳转(多少页)按钮 gotoBtn),这个用户控件里面有一个获取数据源的方法GetData(),
父窗体有两个控件:1是数据显示控件dataGridView1,2是我刚刚定义的用户控件testControl;
父窗体在加载的时候可以 用
DataTable dt = testControl.GetData();
dataGridView1.DataSource = dt;
这样就可以绑定第一次的数据了,可是问题是当我在父窗体点击跳转的时候如何获取testControl里面的GetData()方法呢?好像要用到委托和事件,我之前没搞过,有点弄不出来,哪位大神帮忙解决下,非常感谢!
获取数据的方法我看你的GetData里面已经有用到,我就不说了,但是你得记住一个问题,你需要验证分页号是否超出你当前数据所有页面,如果超出你需要处理一下。本回答被提问者和网友采纳
以上是关于winform的窗体控件可以用线程直接调用吗的主要内容,如果未能解决你的问题,请参考以下文章
WinForm窗体怎么实现富文本控件就像ASP那样的富文本控件
.NET Winform 自定义分页控件如何在父窗体中调用?