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

时间:2010-01-11 20:59:36

标签: c# .net winforms

我的datagridview中有一个列是一个组合框列。我希望它按显示值(即文本)排序,而不是它的值(在这种情况下,是数据库中的int列表)。

我该怎么做?

7 个答案:

答案 0 :(得分:5)

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

  

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

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

  1. SortCompare事件连接到DataGridView,如下所示:
  2. this.dataGridView1.SortCompare += new DataGridViewSortCompareEventHandler(dataGridView1_SortCompare);
    
    1. 然后添加事件处理程序,按每个CellFormattedValue属性而不是Value属性(默认值)对所有列进行排序。
    2. 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上有一个设置,使其成为默认选项。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

我会看看How to: Customize Sorting in the Windows Forms DataGridView Control。在该文章中有三种不同的排序方式。其他一些帖子也可能会有所帮助:How to sort databound datagridviewCustom sort of datagridview

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

的答案

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

  

马特,

     

感谢您发帖。

     

如果你有   您的DataGridViewComboBoxColumn   DataGridView,你必须设置   DataGridView的DataSource   填充数据。那就是说,   您必须将DataGridView绑定到   数据源。

     

如果设置了SortMode   DataGridViewComoboBoxColumn到   自动,您可以按此排序此列   点击它。排序基于   列中的单元格值,而不是   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属性
  2.         

    你可以参考下面的链接   有关option4的更多信息:   http://msdn2.microsoft.com/en-us/library/system.data.dataview.sort(d=ide).as   PX

         

    似乎只有option2和option3   可以应用于排序   DataGridViewComboBoxColumn基于   FormattedValue。但是,这两个   选项仅适用于该条件   DataGridView没有限制   到数据源。

         

    所以在我看来,这是不可能的   对DataGridViewComboBoxColumn进行排序   基于FormattedValue。

         

    如果您有其他疑虑,请   不要犹豫,让我知道。

         

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

答案 5 :(得分:0)

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

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

第三行是关键。

答案 6 :(得分:0)

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

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