在DataGridView中对列进行排序会导致加载新数据时出现故障

时间:2017-04-19 21:48:41

标签: sorting datagridview datatable bindingsource

我有一个自定义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";

    }

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

为了更新表,我必须删除列(因为我可能必须更改列的DataType),在某些情况下,我可能正在添加或删除列。我认为这可能与绑定有关,所以我在执行更新之前使用了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);

        }

    }

1 个答案:

答案 0 :(得分:0)

我能够通过从BindingSource

中删除排序来解决问题
        bsTBAstats.RemoveSort();
        bsTBAstats.SuspendBinding();
        teamstats.UpdateColumn(teamstats.Columns[columnClicked].ColumnName);
        bsTBAstats.ResumeBinding();

我仍然不确定我理解DataGridView排序的哪个方面会影响我添加记录的能力,但我能够解决它。