按文本而不是值对Datagridview的列进行排序

我的datagridview中有一个列是一个combobox列。 我想按它的显示值(即文本)而不是它的值(在这种情况下,来自数据库的int列表)进行排序。

我怎样才能做到这一点?

您可以通过覆盖DataGridView上的SortCompare事件来执行此操作:

在DataGridView比较两个单元格值以执行排序操作时发生

并始终按显示值而不是默认值排序。

  1. SortCompare事件连接到DataGridView,如下所示:
 this.dataGridView1.SortCompare += new DataGridViewSortCompareEventHandler(dataGridView1_SortCompare); 
  1. 然后添加事件处理程序,按每个CellFormattedValue属性而不是Value属性(这是默认值)对所有列进行排序。
 void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) { var dgv = (DataGridView) sender string value1 = dgv.Rows[e.RowIndex1].Cells[e.Column.Index].FormattedValue.ToString(); string value2 = dgv.Rows[e.RowIndex2].Cells[e.Column.Index].FormattedValue.ToString(); e.SortResult = System.String.Compare(value1, value2); e.Handled = true; } 

适合我,希望能帮助其他人。 我只是希望DataGridView上有一个设置使其成为默认选项。

根本不可能做到这一点。 这就是我做到的。

创建填充了绑定值的虚拟列所需的内容。 您需要以编程方式执行此操作。

 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; } 

我将在Windows窗体DataGridView控件中查看如何:自定义排序 。 在该文章中有三种不同的排序方式。 其他一些post也可能有所帮助: 如何对数据绑定datagridview和自定义 数据格式进行排序

正如mnield所指出的,如果我们有ComboBox列并且用户希望能够添加行,则上述代码将不起作用。

如果用户希望能够添加新行,那么我们应该使用以下代码:

 DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1]; col.DataSource = items; col.SortMode = DataGridViewColumnSortMode.Automatic; 

显然,这是不可能的。 我一直在寻找同样的东西,我不确定为什么没有人会认为这是一个重要的特征。 这是原始问题的链接和Microsoft Rep的答案。

http://www.webnewsgroups.net/vbnet/t25706-vb2005-sort-datagridview-text-formattedvalue-combobox-column-instead-underlying-value.aspx

嗨马特,

感谢您的发表。

如果DataGridView中有DataGridViewComboBoxColumn,则必须设置DataGridView的DataSource以填充其中的数据。 也就是说,您必须将DataGridView绑定到数据源。

如果将DataGridViewComoboBoxColumn的SortMode设置为Automatic,则可以通过单击对该列进行排序。 排序基于列中的单元格值,而不是FormattedValue。 如果要根据FormattedValue对此列进行排序,则似乎必须自定义排序。

自定义排序DataGridView有几个选项。 这些选项如下所列。 1.调用DataGridView.Sort(DataGridViewColumn,ListSortDirection)方法2.使用DataGridView的SortCompare事件处理3.调用DataGridView.Sort(IComparer)方法

有关以上三个选项的更多信息,请参阅以下链接: http : //msdn2.microsoft.com/en-us/library/ms171608(d = ide).aspx

  1. 使用DataView并设置其Sort属性

有关option4的更多信息,请参阅下面的链接: http : //msdn2.microsoft.com/en-us/library/system.data.dataview.sort( d=ide) .aspx

似乎只能应用option2和option3来根据FormattedValue对DataGridViewComboBoxColumn进行排序。 但是,这两个选项仅适用于DataGridView未绑定到DataSource的情况。

所以在我看来,不可能根据FormattedValue对DataGridViewComboBoxColumn进行排序。

如果您有其他疑虑,请随时告诉我。

此致,Linda Liu微软在线社区支持

事实上很简单,这是一个适合我的示例代码:

 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; 

此代码仅允许按ID排序,而不是按ComboBox的文本排序。