“BindingSource不能是自己的DataSource”

时间:2015-10-12 08:27:18

标签: c# excel multithreading winforms datagridview

我正在开发一个C#WinForms应用程序,它将数据读入DataGridViews并使用Excel Interop将它们导出到Excel工作表中。

最近,有时出现了一个奇怪的错误(据我所知)。在不同线程中发生的Excel导出期间,抛出错误“BindingSource不能是它自己的DataSource”。不是每次都有,而且有时看似随意。

我稍微研究了这个错误,当你尝试从没有Invokes的外部线程更新DataGridView时,似乎发生了错误。 Export函数接收DataGridView作为参数(我没有完成并且在任何地方都需要做太多工作)然后循环行和列以将数据导入Excel。我没有更新DataGridView中的任何内容,但可能还有其他原因会导致此错误。

我的问题是:有人确切知道哪些类型的访问需要制作一个额外的Invoker函数来从UI而不是在线程中调用网格?例如,我可以在没有调用的情况下询问grid.Rows[i].Cells[j].Value(使用作为参数的网格)。我可以遍历列或使用DataGridViewColumn.Name询问列名吗?列索引?询问是否grid.Columns.Contains("name")

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

编辑: 代码示例:

        //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);

Edit2:我在此函数中与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

我彻底扫描了整个功能。在任何地方都没有对DataGridView相关对象的赋值。只检索上面的东西。单元格值存储在局部变量中并进行操作(object val = grid.Cells[j].Value; val = val.ToString() + "%";

0 个答案:

没有答案