C# DataGridView (DataSet source) 列排序模式在更改 DataTMember 时重置
本文关键字:DataTMember 模式 排序 DataGridView DataSet source | 更新日期: 2023-09-27 17:56:04
TL;DR :当更改绑定到具有 NotSortable 列 SortMode 和 ColumnSelect SelectionMode 的 DataGridView 的数据集中的数据成员表时,会引发 InvalidOperationException,因为 SortMode 显示为"自动"。
我已经在我的应用程序中实现了 Excel 输入功能,并且我正在使用 NuGet 的 ExcelDataReader 包来执行此操作。这是读取我的 Excel 文件并按预期将它们转换为数据集。
但是,当我尝试将该数据集绑定到 DataGridView 时,目的是允许用户"选择"要使用的单元格/列/行,在启用列选择模式时收到以下错误 InvalidOperationException:
Column's SortMode cannot be set to Automatic while the DataGridView control's SelectionMode is set to ColumnHeaderSelect.
这是在另一个问题上使用此答案解决的,该问题在初始绑定上按预期工作。
但是,Excel 电子表格可能有多个工作表,因此我使用 ComboSelectBox 显示它们 -- 在 SelectionChangeCommit 上,我正在将 DataGridView 的 DataMember 更改为所选工作表的索引。
在此更改中,我仍然得到上面的 InvalidOperationException,即使我重复与初始绑定中完全相同的代码 - 这是正常工作的。
所以问题是,我怎样才能阻止排序模式明显重置为自动,或者获得适用于初始绑定的相同代码来处理 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;
}
}
}
已解决,在我的 SelectionChangeCommit eventHandler 中,我只是在更改 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;
}
我觉得这很混乱,但它有效。