2017-04-19 67 views
0

我有一个自定义的DataTable绑定到绑定到DataGridView的BindingDataSource。DataGridView中的列排序导致加载新数据时失败

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在执行更新之前禁用了挂起绑定,但这并没有解决问题。它失败this.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

我能够通过删除排序从BindingSource的

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

我仍然不知道我理解方面具有DataGridView的排序影响了我的能力,以记录添加到解决问题,但我能够解决它。

+0

我一直在优化我的应用程序。而不是重建整个表格,我只是更改摘要类型已更改的列。在这样做的时候,我已经确认应用程序仅在当前排序的列被删除时抛出异常。 – Prdufresne

相关问题