当我修改DataGridView时,它给system.invalidoperationexception跨线程操作无效吗?

时间:2018-11-12 10:04:00

标签: c# winforms datagridview

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

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

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

system.invalidoperationexception cross-thread operation not valid

我已经尝试了StackOverflow和整个Internet的所有解决方案,但是所有方式都给了我同样的例外。

我怎么了?我直接调用了此方法,并将其作为线程调用,它给了我同样的异常。当我使用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();
}

1 个答案:

答案 0 :(得分:0)

这是例外的解决方案。

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



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



            dt.Dispose();
        }