winform的窗体控件可以用线程直接调用吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform的窗体控件可以用线程直接调用吗相关的知识,希望对你有一定的参考价值。

默认地,不允许其他线程直接存取(调用)Winform中的控件。

要从其他线程中存取Winform控件,可采用以下两种方法之一:

方法1)不进行线程安全的检查

或者

方法2)通过委托的方式


代码如下所示

public partial class Form1 : Form
    
        public 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()方法呢?好像要用到委托和事件,我之前没搞过,有点弄不出来,哪位大神帮忙解决下,非常感谢!

参考技术A 这个并不难,跳转需要的只是指定页面的数据获取,你记录跳转按钮前的分页号,然后重新在后台请求一次数据,然后把这份数据再次绑定到dataGridView1,然后dataGridView1.DataBind()一次,这个操作就是把你刚刚绑定的数据重新刷新到你页面渲染出来。
获取数据的方法我看你的GetData里面已经有用到,我就不说了,但是你得记住一个问题,你需要验证分页号是否超出你当前数据所有页面,如果超出你需要处理一下。本回答被提问者和网友采纳

以上是关于winform的窗体控件可以用线程直接调用吗的主要内容,如果未能解决你的问题,请参考以下文章

WinForm窗体怎么实现富文本控件就像ASP那样的富文本控件

wpf中 我新开一个线程添加控件到主窗体

.NET Winform 自定义分页控件如何在父窗体中调用?

如何在没有窗体或控件的情况下在 Winform 应用程序中调用 UI 线程?

c#如何跨线程调用窗体控件

wpf中 我新开一个线程添加控件到主窗体