【问题标题】:C# DataGridView (DataSet source) Column SortMode resets when changing DataMemberC# DataGridView (DataSet source) Column SortMode 在更改 DataMember 时重置
【发布时间】:2016-07-08 20:35:49
【问题描述】:

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 明显被重置为 Automatic 或获取用于初始 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;
        }
    }
}

【问题讨论】:

  • 更新:我尝试将 .SetColumnSortMode 和 .SelectionMode 函数添加到 DataMemberChanged 事件处理程序中,但这也不起作用。

标签: c# winforms datagridview dataset


【解决方案1】:

已解决,在我的 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;
    }

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

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2010-12-10
    • 1970-01-01
    • 2013-01-08
    • 2012-02-06
    相关资源
    最近更新 更多