Sorting 在加载新数据时,对DataGridView中的列进行排序会导致失败

Sorting 在加载新数据时,对DataGridView中的列进行排序会导致失败,sorting,datagridview,datatable,bindingsource,Sorting,Datagridview,Datatable,Bindingsource,我有一个自定义DataTable绑定到绑定到DataGridView的BindingDataSource private dynamic matches; private BindingSource bsTBAstats = new BindingSource(); private PivotTable teamstats = new PivotTable(); public frmTBAstatistics() { Initialize

我有一个自定义DataTable绑定到绑定到DataGridView的BindingDataSource

    private dynamic matches;
    private BindingSource bsTBAstats = new BindingSource();
    private PivotTable teamstats = new PivotTable();

    public frmTBAstatistics()
    {
        InitializeComponent();

        bsTBAstats.DataSource = teamstats;
        dgvTBAstats.DataSource = bsTBAstats;

        teamstats.Key = "key";

    }
自定义数据表旨在提供类似数据透视表的功能,对每列使用不同的方法汇总源表中的数据。代码运行得非常好,您可以在运行时使用上下文菜单按列更改摘要类型。但是,如果您对表进行排序,然后尝试更改其中一种摘要类型,则当我尝试重新添加行时,应用程序将失败

为了更新表,我必须删除列(因为我可能必须更改列的数据类型),在某些情况下,我可能要添加或删除列。我认为这可能与绑定有关,所以在执行更新之前,我使用BindingDataSource禁用了挂起绑定,但这并没有解决问题。它在此.Rows.Add(newrow)处失败

是否有其他引发我应该禁用的可能导致问题的事件?它和分类有某种联系,但我不知道怎么做

    // Refresh the contents of the Summary Table
    public void Update()
    {
        // If there are no source columns, do nothing.
        if (source.Columns.Count == 0)
            return;

        // Remove any data currently in the tab
        this.Clear();
        this.Columns.Clear();

        // Add a column in the pivot table for each column in the source and match the type.
        foreach (DataColumn c in source.Columns)
        {
            // If the summary type is "Count Values" add a column for each unique value in that column.
            int summarytype = summarytypes.FirstOrDefault(x => x.Key == c.ColumnName).Value;
            if (summarytype == SummaryType.CountValues)
            {
                foreach (string value in uniquevalues(c.ColumnName))
                {
                    string columnname = c.ColumnName + "_" + value;
                    SubColumn newcolumn = new SubColumn();
                    newcolumn.ParentColumn = c.ColumnName;
                    newcolumn.ColumnName = columnname;
                    newcolumn.DataType = typeof(int);
                    this.Columns.Add(newcolumn);
                }
            }
            else
            {
                string keyname = c.ColumnName;
                DataColumn newcolumn = new DataColumn();
                newcolumn.ColumnName = keyname;
                if (summarytype == 0)
                {
                    if (c.DataType == typeof(int))
                        summarytype = SummaryType.Total;
                    else if (c.DataType == typeof(bool))
                        summarytype = SummaryType.Boolean;
                    else
                        summarytype = SummaryType.First;

                }

                if (summarytype < SummaryType.Average)
                    newcolumn.DataType = typeof(int);
                else if (summarytype == SummaryType.Average)
                    newcolumn.DataType = typeof(float);
                else
                    newcolumn.DataType = c.DataType;

                this.Columns.Add(newcolumn);
                SetSummaryType(keyname, summarytype);
            }
        }

        var uniquekeys = UniqueKeys;

        // Summarize each unique key
        foreach (string uniquekey in uniquekeys)
        {
            // Create a new container for the new row data
            DataRow newrow = this.NewRow();

            // Select all records matching the current key
            DataRow[] keyrecords = source.Select(key + "='" + uniquekey + "'");

            // For each column, add the values.
            foreach (DataColumn datacolumn in source.Columns)
            {
                string keyname = datacolumn.ColumnName;
                int summarytype = summarytypes[keyname];
                if (summarytype == SummaryType.CountValues)
                {
                    foreach (string uniquevalue in uniquevalues(keyname))
                    {
                        int count = keyrecords.Count(x => (string)x[keyname] == uniquevalue);
                        newrow[keyname + "_" + uniquevalue] = count;
                    }
                }
                else
                {
                    newrow[keyname] = Summarize(keyrecords, datacolumn);
                }
            }
            this.Rows.Add(newrow);

        }

    }
//刷新汇总表的内容
公共无效更新()
{
//如果没有源列,则不执行任何操作。
if(source.Columns.Count==0)
返回;
//删除选项卡中当前的所有数据
这个.Clear();
this.Columns.Clear();
//在数据透视表中为源中的每一列添加一列,并与类型匹配。
foreach(source.Columns中的DataColumn c)
{
//如果摘要类型为“Count Values”,请为该列中的每个唯一值添加一列。
int summarytype=summarytypes.FirstOrDefault(x=>x.Key==c.ColumnName).Value;
if(summarytype==summarytype.CountValues)
{
foreach(uniquevalues中的字符串值(c.ColumnName))
{
字符串columnname=c.columnname+“”+值;
SubColumn newcolumn=新的SubColumn();
newcolumn.ParentColumn=c.ColumnName;
newcolumn.ColumnName=ColumnName;
newcolumn.DataType=typeof(int);
this.Columns.Add(newcolumn);
}
}
其他的
{
字符串keyname=c.ColumnName;
DataColumn newcolumn=新DataColumn();
newcolumn.ColumnName=关键字名称;
如果(summarytype==0)
{
if(c.DataType==typeof(int))
summarytype=summarytype.Total;
else if(c.DataType==typeof(bool))
summarytype=summarytype.Boolean;
其他的
summarytype=summarytype.First;
}
if(summarytype(字符串)x[keyname]==uniquevalue);
newrow[keyname+“”+uniquevalue]=计数;
}
}
其他的
{
newrow[keyname]=汇总(keyrecords,datacolumn);
}
}
this.Rows.Add(newrow);
}
}

我可以通过从BindingSource中删除排序来解决这个问题

        bsTBAstats.RemoveSort();
        bsTBAstats.SuspendBinding();
        teamstats.UpdateColumn(teamstats.Columns[columnClicked].ColumnName);
        bsTBAstats.ResumeBinding();

我仍然不确定数据网格视图排序的哪些方面影响了我添加记录的能力,但我能够解决它。

我一直在优化我的应用程序。我没有重建整个表,只是更改了汇总类型已更改的列。在这样做的过程中,我确认应用程序仅在删除当前排序的列时才会抛出异常。