C# DataGridView (DataSet source) Column SortMode 在更改 DataMember 时重置

C# DataGridView (DataSet source) Column SortMode resets when changing DataMember

TL;DR:当更改绑定到具有 NotSortable 列 SortMode 和 ColumnSelect SelectionMode 的 DataGridView 的 DataSet 中的 DataMember 表时,将抛出 InvalidOperationException,因为 SortMode显示为 "Automatic".

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

但是,当我试图将该 DataSet 绑定到 DataGridView 时,目的是允许用户 "select" 使用 cells/columns/rows 的内容,我在启用 Column 时收到以下 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 显然被重置为自动或获得与初始绑定相同的代码以处理 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;
        }
    }
}

已解决,在我的 SelectionChangeCommitted 事件处理程序中,我只是在更改 DataMember 之前将 DataGridView SelectionMode 改回 RowHeaderSelect,然后我的 DataMemberChanged 事件处理程序再次将其改回 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;
    }

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