C# 排序Datagridview';按文本而不是按值排序的列
我的datagridview中有一列是组合框列。我希望它按显示值(即文本)排序,而不是按值排序(在本例中,是数据库中的int列表)C# 排序Datagridview';按文本而不是按值排序的列,c#,.net,winforms,C#,.net,Winforms,我的datagridview中有一列是组合框列。我希望它按显示值(即文本)排序,而不是按值排序(在本例中,是数据库中的int列表) 我该怎么做呢?我想看看。在那篇文章中有三种不同的排序方式。一些其他的帖子可能也会有所帮助:而且显然,这是不可能的。我在寻找同样的东西,我不知道为什么没有人会认为这是一个重要的功能。以下是指向原始问题的链接,以及来自Microsoft代表的答案 嗨,马特 谢谢你的发帖 如果你有 数据库中的DataGridViewComboxColumn DataGridView,您
我该怎么做呢?我想看看。在那篇文章中有三种不同的排序方式。一些其他的帖子可能也会有所帮助:而且显然,这是不可能的。我在寻找同样的东西,我不知道为什么没有人会认为这是一个重要的功能。以下是指向原始问题的链接,以及来自Microsoft代表的答案 嗨,马特 谢谢你的发帖 如果你有 数据库中的DataGridViewComboxColumn DataGridView,您必须设置 要删除的DataGridView的数据源 在其中填充数据。就是说,, 必须将DataGridView绑定到 数据源 如果您设置了 DataGridViewComoBoxColumn到 自动,您可以按 点击它。排序是基于 列中的单元格值,而不是 格式化的值。如果你想 根据列表对该列进行排序 FormattedValue,看起来您已经 自定义排序 有几个自定义选项 有点像DataGridView。这些选项 下面列出了这些文件。 1.调用DataGridView.Sort(DataGridViewColumn,ListSortDirection) 方法 2.处理DataGridView的SortCompare事件 3.调用DataGridView.Sort(IComparer)方法 有关详细信息,请参阅以下链接 关于上述三个方面的更多信息 选项:
要做到这一点并非不可能。我就是这样做的 创建用绑定值填充的虚拟列所需的内容。您需要按程序执行此操作
private void OrderByComboBoxColumn()
{
// Add the temp Column if it doesnt exist
if (!dataset.TABLE.Columns.Contains("TempColumn"))
dataset.TABLE.Columns.Add("TempColumn", typeof(string));
foreach (DataSetRow row in dataset.TABLE)
row["TempColumn"] = GetBoundValue(row.COMBOBOX_ID);
dataview.Sort = "TempColumn ASC";
}
private string GetBoundValue(int id)
{
// get the string however your id matches the bound value
return string;
}
事实上非常简单,这是一个适用于我的示例代码:
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
第三行是关键。您可以通过覆盖
DataGridView
上的SortCompare
事件来实现这一点,该事件:
在DataGridView比较两个单元格值以执行排序操作时发生
并使其始终按显示值而不是默认值排序
this.dataGridView1.SortCompare+=新的DataGridViewSortCompareEventHandler(dataGridView1\u SortCompare);
void dataGridView1\u SortCompare(对象发送方、DataGridViews sortCompareEventArgs e)
{
var dgv=(DataGridView)发送方
字符串值1=dgv.Rows[e.RowIndex1]。单元格[e.Column.Index]。FormattedValue.ToString();
字符串值2=dgv.Rows[e.RowIndex2]。单元格[e.Column.Index]。FormattedValue.ToString();
e、 SortResult=System.String.Compare(value1,value2);
e、 已处理=正确;
}
这对我很有用,希望能帮助其他人。我只希望在DataGridView
上有一个设置,使其成为默认选项。如前所述,如果我们有组合框
列,并且用户希望能够添加行,则上述代码将无法工作
如果用户希望能够添加新行,则应使用以下代码:
此代码只允许按ID排序,而不允许按组合框的文本排序。是否可以包含显示当前如何填充组合框的代码?它是从数据集填充的。此事件从未发生过,我已经尝试过这种方法,但不起作用。DataGridView数据绑定时不会发生SortCompare事件。来自MSDN:“仅当未设置DataSource属性且VirtualMode属性值为false时,才会发生此事件。”我似乎不会触发此事件!“仅当未设置DataSource属性且VirtualMode属性值为false时,才会发生此事件。”-如果绑定了D ataGridView,则证明此事件无效!
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;