C# “BindingSource不能是它自己的数据源”

C# “BindingSource不能是它自己的数据源”,c#,excel,multithreading,winforms,datagridview,C#,Excel,Multithreading,Winforms,Datagridview,我正在开发一个C WinForms应用程序,它将数据读入DataGridView,并使用Excel互操作将数据导出到Excel工作表中 最近,有时会发生一个我所不知道的奇怪错误。在不同线程中发生的Excel导出过程中,会抛出BindingSource不能是其自己的数据源的错误。不是每次都是,只是有时而且看起来是随机的 我稍微研究了一下这个错误,当您试图从外部线程更新DataGridView而不调用时,似乎会发生错误。Export函数接收DataGridView,因为参数不是我自己做的,需要做很多

我正在开发一个C WinForms应用程序,它将数据读入DataGridView,并使用Excel互操作将数据导出到Excel工作表中

最近,有时会发生一个我所不知道的奇怪错误。在不同线程中发生的Excel导出过程中,会抛出BindingSource不能是其自己的数据源的错误。不是每次都是,只是有时而且看起来是随机的

我稍微研究了一下这个错误,当您试图从外部线程更新DataGridView而不调用时,似乎会发生错误。Export函数接收DataGridView,因为参数不是我自己做的,需要做很多工作才能在任何地方进行更改,然后循环行和列以将数据输入Excel。我不更新DataGridView中的任何内容,但可能还有其他原因导致此错误

我的问题是:有人确切地知道哪些类型的访问需要额外的调用器函数来从UI而不是在线程中调用网格吗?例如,我可以使用作为参数的网格在不调用的情况下询问grid.Rows[I].Cells[j].Value。我是否可以循环浏览列或使用DataGridViewColumn.name询问列名?列索引?询问grid.Columns.Containsname是否包含

我需要知道我需要什么使线程安全,以防止发生此错误。如果有人知道我在这里没有提到的这个错误,如果你能在这方面帮助我,我将不胜感激。谢谢你的帮助

编辑: 代码示例:

        //param is an object[] that contains all the parameters, 
        //including "grid", the DataGridView
        private void ExportToExcel(object param)
        {
        //declare variables, start excel, nothing relevant before this
        ...
            for (int k = 0; k < grid.Rows.Count; k++) // Zeilen durchgehen
            {
                DataGridViewRow row = grid.Rows[k];
                if (!row.Visible)
                    continue;

                for (int j = 0; j < grid.Columns.Count; j++)
                {
                   string colName = grid.Columns[i].Name;
                   if(colName == "FirstColumn")
                   {
                       //format excel cell for firstcolumn
                       ...
                       worksheet.Cells[i, j + 1] = row.Cells[j].Value.ToString();
                   }
                   ...
                }
             ...
             }
          ...
      }

      //call of excel function
      object[] params = new object[]{this.dgvGrid, other, parameters}
      Thread excelThread = new Thread(new ParameterizedThreadStart(ExportToExcel));
      excelThread.Start(params);

我彻底浏览了整个功能。任何地方都不存在对DataGridView相关对象的赋值。在这里,我们只检索上面的东西。单元值存储在局部变量中,并操纵对象val=grid.Cells[j].Value;val=val.ToString+%

请您通过编写代码的相关部分来简化理解/帮助过程,而不是依赖于令人困惑的抽象语句,这些抽象语句来自于假设您在描述过程中做了所有事情而没有犯任何错误,甚至可能不是这样。我想这个问题至少可以是两个问题。我什么时候需要调用?什么是BindingSource不能是它自己的数据源?为什么我会收到它?最好提供一些简单的代码来重现问题,或者发布代码的一些相关部分:@varocabas I添加了代码示例。@RezaAghaei是的,可能是两个问题。但主要的问题是:如何防止这种情况发生?您的代码似乎很好。仅从DataGridView或任何其他控件检索值/属性不是问题。问题和错误似乎表明正在编辑该控件。代码的某些部分正在编辑DataGridView,但您尚未将其包含在上面的示例中。
//Retrieve:
grid.Rows[i]
row.Visible
row.Cells[column.Name].Value
grid.Columns.Count
grid.Columns.Contains(name)
column.DataPropertyName
cell.ValueType
column.HeaderText