C#DataGridView(DataSet源)列SortMode在更改DataMember

时间:2016-07-08 12:10:40

标签: c# winforms datagridview dataset

TL; DR :使用NotSortable列SortMode和ColumnSelect SelectionMode更改绑定到DataGridView的DataSet中的DataMember表时,会抛出InvalidOperationException,因为SortMode显示为"自动"。

我已在我的应用程序中实现了Excel输入功能,并且我使用NuGet的ExcelDataReader包来执行此操作。这是读取我的Excel文件并按预期将它们转换为DataSet。

但是,当我尝试将DataSet绑定到DataGridView时,意图允许用户选择"选择"要使用哪些单元格/列/行,启用列选择模式时收到以下InvalidOperationException错误:

 Column's SortMode cannot be set to Automatic while the DataGridView control's SelectionMode is set to ColumnHeaderSelect.

这是在另一个问题上使用this answer解决的,该问题在初始绑定时按预期工作。

但是,Excel电子表格可能有多个工作表,所以我使用ComboSelectBox显示它们 - 而在SelectionChangeCommitted上,我将DataGridView的DataMember更改为所选的索引工作表。

在这个改变上,我仍然得到上面的InvalidOperationException,即使我正在重复与初始绑定完全相同的代码 - 这是正常工作。

所以问题是,我怎样才能阻止SortMode显然被重置为自动,或者获得与初始Bind一起工作的相同代码,以便对DataMember进行更改。

谢谢:)

ExcelForm.cs

// This works fine on initial Bind, no errors
private void PrepareUI()
{
  // DataGridView dataGridContents
  dataGridContents.DataSource = _contents;
  dataGridContents.DataMember = _contents.Tables[0].TableName;
  dataGridContents.SetColumnSortMode(DataGridViewColumnSortMode.NotSortable);
  dataGridContents.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;

  DataTable worksheets = GetWorksheetValues(_contents);

  comboWorksheet.DataSource = worksheets;
  comboWorksheet.ValueMember = "index";
  comboWorksheet.DisplayMember = "name";
}

// On SelectionChangeCommitted, same code -- but throws an InvalidOperationException
private void comboWorksheet_SelectionChanged(object sender, EventArgs e)
{
  dataGridContents.DataMember = _contents.Tables[int.Parse(((ComboBox)sender).SelectedValue.ToString())].TableName;
  dataGridContents.SetColumnSortMode(DataGridViewColumnSortMode.NotSortable);
  dataGridContents.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
}

DataGridViewExtensions.cs

static class DataGridViewExtensions
{
    public static void SetColumnSortMode(this DataGridView dataGridView, DataGridViewColumnSortMode sortMode = DataGridViewColumnSortMode.NotSortable)
    {
        foreach (DataGridViewColumn c in dataGridView.Columns)
        {
            c.SortMode = sortMode;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

解决了,在我的SelectionChangeCommitted eventHandler中,我只是在更改DataMember之前将DataGridView SelectionMode更改回RowHeaderSelect,然后我的DataMemberChanged eventHandler再次将其更改回ColumnHeaderSelect。

    private void comboWorksheet_SelectionChanged(object sender, EventArgs e)
    {
        dataGridContents.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
        dataGridContents.DataMember = _contents.Tables[int.Parse(((ComboBox)sender).SelectedValue.ToString())].TableName;
    }

    private void dataGridContents_DataMemberChanged(object sender, EventArgs e)
    {
        dataGridContents.SetColumnSortMode(DataGridViewColumnSortMode.NotSortable);
        dataGridContents.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
    }

我觉得这很麻烦,但它确实有效。