使用后台工作者填充 DataGridView - 跨线程操作无效从线程访问的控件

问题描述 投票:0回答:1

在 c# winforms 应用程序中,我有带有两个日期开始日期和结束日期的 datagridview。我需要在日期范围内填充datagridview。填充数据网格视图需要花费大量时间,并且 Windows 窗体 exe 变得无响应。我现在正在使用后台工作者。当我在选择日期后单击搜索按钮时,它会填充 datagridview。我单击清除按钮清空 datagridview。当我再次选择日期并单击搜索按钮时,出现错误。

跨线程操作无效控制从创建它的线程以外的线程访问。

  private clsStkBAL obj = new clsStkBAL();

       
        public frmSalesStk()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;

        }
       
        private void FillGrid()
        {
            try
            {

                this.obj.SP_STATUS = nameof(FillGrid);//SP_SalesInvoice
                this.obj.Sih_StartDate = new DateTime?(this.dtpFromdt.Value.Date);//set_Sih_StartDate
                this.obj.Sih_EndDate = new DateTime?(this.dtpToDate.Value.Date);
                clsCommon.BindeDataGridView(this.dgvStock, (object)this.obj.GetDataTable((clsSalesStock)this.obj, (SqlTransaction)null, false), false);
                // ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            }

            catch (Exception ex)
            {
                clsCommon.ShowErrorMessage(ex.Message);
            }
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
           if(backgroundWorker1.IsBusy)
            {
                clear();
            }       
                backgroundWorker1.RunWorkerAsync(2000);
           
            
        }


      
        
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {

            if (btnSearch.InvokeRequired)
            {

                dgvStock.Invoke(new Action(FillGrid));

            }
            FillGrid();
          
          
        }
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (backgroundWorker1.IsBusy)
            {
                Thread.Sleep(20000);
             
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
          
            MessageBox.Show("Loaded");
            backgroundWorker1.Dispose();
            dtpFromdt.Enabled = true;
            dtpToDate.Enabled = true;
        }

        private void frmSalesStock_Load(object sender, EventArgs e)
        {
            dtpFromdt.Value = new DateTime(2021, 02, 01);
            dtpToDate.Value = new DateTime(2021, 02, 01);

            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        }
        public void clear()
        {

            dgvStock.DataSource = null;
            backgroundWorker1.CancelAsync();
        }
        private void btnClear1_Click(object sender, EventArgs e)
        {
            clear();
        }
    }
how to fix this error.pls

如何解决这个错误。

c# multithreading winforms datagridview backgroundworker
1个回答
0
投票

这条线对我来说看起来很狡猾:

dgvStock.Invoke(new Action(FillGrid));

错误是因为你应该在主线程上处理 UI 的事情:

跨线程操作无效控制从创建它的线程以外的线程访问。

看来你在后台工作人员中调用一个动作并且有问题 - 在主线程之外执行它 - 这是我写的一个例子,你可以使用 CodeConverter 将它从 VB.Net 移植回 C#:

https://stackoverflow.com/a/13486676/495455

© www.soinside.com 2019 - 2024. All rights reserved.