【问题标题】:Fill dataGridView thank's to backGroundWorker填写dataGridView 感谢backGroundWorker
【发布时间】:2011-03-08 20:33:02
【问题描述】:

我有这个代码sn-p:

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        remplirDataGrid();
    }

private void frmChercherActesLoad(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();

        }



 private void remplirDataGrid()
        {
            dataGridView1.DataSource = ActeServices.getAllActes(0, 40);
            dataGridView1.Columns[0].Visible = false;
            dataGridView1.Columns[1].HeaderText = "Code acte";
            dataGridView1.Columns[2].HeaderText = "Désignation";
            dataGridView1.Columns[3].HeaderText = "Pris en charge";
            dataGridView1.Columns[4].HeaderText = "Id article";
            dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
        }

这里是getAllActe的方法:

public static IEnumerable<Acte> getAllActes(int skipCount, int takeCount)
        {
            var myTableAdapter = new SmartDocDALServices.SmartDocDataSetTableAdapters.actesTableAdapter();
            myTableAdapter.Fill(myDataSet.actes);
            var myResult = from q in myDataSet.actes.AsEnumerable()
                            select new Acte
                            {
                                code = q.code,
                                designation = q.designation,
                                priseEnCharge = q.prise_en_charge,
                                idArticle = q.id_article,
                            };

            if (skipCount != -1)
                myResult.Skip(skipCount);
            if (takeCount != -1)
                myResult.Take(takeCount);
            IEnumerable<Acte> myResultRet = myResult.ToList();
            return myResultRet;

我喜欢做的是在运行应用程序后使用后台工作程序填充我的datagridview,但出现此错误:

线程间操作无效:Control 'dataGridView1 已成为来自与其创建的线程不同的线程的访问对象。


我试试这个

 private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
      IEnumerable<Acte> result = ActeServices.getAllActes(0, 40);
       backgroundWorker1.ReportProgress(0, result);

    }

    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

      dataGridView1.DataSource = (IEnumerable<Acte>)e.UserState;
      dataGridView1.Columns[0].Visible = false;
      dataGridView1.Columns[1].HeaderText = "Code acte";
     ***

但是没有及时获得?我希望在 BGW 加载数据时更新数据网格,将数据加载到 DGV 中

【问题讨论】:

    标签: c# winforms data-binding datagridview backgroundworker


    【解决方案1】:

    您无法从 BackgroundWorker 线程更新 UI。

    您需要向 UI 发送一个事件,然后有类似的东西:

    private void EventHandler(object sender, YourEventArgs e)
    {
        if (this.dataGridView1.InvokeRequired)
        {
            this.dataGridView1.Invoke((MethodInvoker)delegate { this.AddToGrid(e.YourData); });
        }
        else
        {
            this.AddToGrid(e.YourData);
        }
    }
    

    【讨论】:

      【解决方案2】:

      DataGridView 不是线程安全的。 但是,如果数据已经可用,则设置 DataSource 应该足够快。

      我会推荐:

      1. 仅使用您的 BackgroundWorker 在另一个线程中加载数据

      2. 在RunWorkerCompleted事件中设置DataSource和datagridview的其他修改(可以通过设置将DoWork方法的结果传递给Completed事件

        e.Result = ActeServices.getAllActes(0, 40);

      3. 可选:将 dataGridView1.AutoGenerateColumns 设置为 false,并在 Windows 窗体设计器或代码中手动添加列以避免闪烁。

      【讨论】:

      • +1 - 我正在输入一个类似的回复时弹出这个回复。
      【解决方案3】:

      这是因为不能从 GUI 线程以外的其他线程修改 GUI 内容。要解决此问题,您需要使用 Dispatcher 在 GUI 线程上调用更改。

      应事先设置 DataGrid,因此您在异步操作中所做的只是填充数据。

      var data = ActeServices.getAllActes(0, 40);
      
      Dispatcher.BeginInvoke( new Action( () => { dataGridView1.DataSource = data; }))
      

      【讨论】:

        【解决方案4】:

        BackgroundWorker 类旨在在后台线程上运行长期存在的操作。由于您只能从创建它们的线程访问 UI 组件,因此您可以在 DoWork 处理程序完成后使用 BackgroundWorker 类的 RunWorkerCompleted 事件来更新您的 UI。此外,您可以使用 BackgroundWorker 类的 ProgressChanged 事件安全地更新进度 UI。

        【讨论】:

          猜你喜欢
          • 2019-11-02
          • 2014-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多