首页 > 解决方案 > 当我修改DataGridView时,它给system.invalidoperationexception跨线程操作无效?

问题描述

我有一个 SQLite 数据库,我有一个 Windows 窗体应用程序。该表格中有一个DataGridView有 4 列的表格。我使用计时器来更新我的DataGridView内容。

但是每次我清除DataGridView然后我都会填写它,因为我必须按日期对它们进行排序。如果我不使用它.Rows.Clear().Refresh它会一遍又一遍地添加相同的内容。所以我使用它们。

我使用不同的方式,如注释行,但问题是

system.invalidoperationexception cross-thread operation not valid

我已经尝试了 StackOverflow 和整个互联网的所有解决方案,但一直给我同样的例外。

我的问题是什么。我直接调用了这个方法,我把它作为一个线程调用,它给了我同样的异常。当我使用DataGridView. 例如,在这个代码块中,它给出了dgwIslemGemisi.DataSource=dt;

private void guncellemeIslemGecmisiGoster()
{
    dt = db.TumGuncellemeIslemGecmisiGetir();


    dgwIslemGecmisi.DataSource = dt;
    dgwIslemGecmisi.Update();

    dgwIslemGecmisi.Rows.Clear();
    dgwIslemGecmisi.Refresh();

    ////Set AutoGenerateColumns False
    //dgwIslemGecmisi.AutoGenerateColumns = false;

    ////Set Columns Count
    //dgwIslemGecmisi.ColumnCount = 4;

    ////Add Columns
    //dgwIslemGecmisi.Columns[0].Name = "islemAdi";
    //dgwIslemGecmisi.Columns[0].HeaderText = "İşlem Adı";
    //dgwIslemGecmisi.Columns[0].DataPropertyName = "islemAdi";

    //dgwIslemGecmisi.Columns[1].HeaderText = "İşleme Başlangıç Tarihi";
    //dgwIslemGecmisi.Columns[1].Name = "islemBaslangicTarihi";
    //dgwIslemGecmisi.Columns[1].DataPropertyName = "islemBaslangicTarihi";

    //dgwIslemGecmisi.Columns[2].Name = "islemBitisTarihi";
    //dgwIslemGecmisi.Columns[2].HeaderText = "İşlemin Tamamlanma Tarihi";
    //dgwIslemGecmisi.Columns[2].DataPropertyName = "isleminBitisTarihi";

    //dgwIslemGecmisi.Columns[3].Name = "islemDurumu";
    //dgwIslemGecmisi.Columns[3].HeaderText = "İşlem Durumu";
    //dgwIslemGecmisi.Columns[3].DataPropertyName = "islemDurumu";
    //dgwIslemGecmisi.DataSource = dt;


    //for (int i = 0; i < dt.Rows.Count; i++)
    //{

    //    string durum = "Başarısız";
    //    if (dt.Rows[i]["islemDurumu"].ToString() == "1")
    //    {
    //        durum = "Başarılı";
    //    }

    //    dgwIslemGecmisi.Rows.Add(new object[] {
    //        dt.Rows[i]["islemAdi"].ToString(),
    //        dt.Rows[i]["islemBaslangicTarihi"].ToString(),
    //        dt.Rows[i]["islemBitisTarihi"].ToString(),
    //        durum

    //    });


    //}
    dt.Dispose();
}

标签: c#winformsdatagridview

解决方案


这是异常的解决方案。

private void guncellemeIslemGecmisiGoster()
        {
            dt = db.TumGuncellemeIslemGecmisiGetir();



            dgwIslemGecmisi.Invoke(new Action(() => dgwIslemGecmisi.DataSource = dt));
            dgwIslemGecmisi.Invoke(new Action(() => dgwIslemGecmisi.Update()));



            dt.Dispose();
        }

推荐阅读