我有一个自定义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);
}
}
答案 0 :(得分:0)
我能够通过从BindingSource
中删除排序来解决问题 bsTBAstats.RemoveSort();
bsTBAstats.SuspendBinding();
teamstats.UpdateColumn(teamstats.Columns[columnClicked].ColumnName);
bsTBAstats.ResumeBinding();
我仍然不确定我理解DataGridView排序的哪个方面会影响我添加记录的能力,但我能够解决它。