C# 排序Datagridview';按文本而不是按值排序的列

C# 排序Datagridview';按文本而不是按值排序的列,c#,.net,winforms,C#,.net,Winforms,我的datagridview中有一列是组合框列。我希望它按显示值(即文本)排序,而不是按值排序(在本例中,是数据库中的int列表) 我该怎么做呢?我想看看。在那篇文章中有三种不同的排序方式。一些其他的帖子可能也会有所帮助:而且显然,这是不可能的。我在寻找同样的东西,我不知道为什么没有人会认为这是一个重要的功能。以下是指向原始问题的链接,以及来自Microsoft代表的答案 嗨,马特 谢谢你的发帖 如果你有 数据库中的DataGridViewComboxColumn DataGridView,您

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


我该怎么做呢?

我想看看。在那篇文章中有三种不同的排序方式。一些其他的帖子可能也会有所帮助:而且显然,这是不可能的。我在寻找同样的东西,我不知道为什么没有人会认为这是一个重要的功能。以下是指向原始问题的链接,以及来自Microsoft代表的答案

嗨,马特

谢谢你的发帖

如果你有 数据库中的DataGridViewComboxColumn DataGridView,您必须设置 要删除的DataGridView的数据源 在其中填充数据。就是说,, 必须将DataGridView绑定到 数据源

如果您设置了 DataGridViewComoBoxColumn到 自动,您可以按 点击它。排序是基于 列中的单元格值,而不是 格式化的值。如果你想 根据列表对该列进行排序 FormattedValue,看起来您已经 自定义排序

有几个自定义选项 有点像DataGridView。这些选项 下面列出了这些文件。 1.调用DataGridView.Sort(DataGridViewColumn,ListSortDirection) 方法 2.处理DataGridView的SortCompare事件 3.调用DataGridView.Sort(IComparer)方法

有关详细信息,请参阅以下链接 关于上述三个方面的更多信息 选项:

  • 使用DataView并设置其排序属性
  • 您可以参考下面的链接了解更多信息 有关选项4的更多信息: px

    似乎只有选项2和选项3 可以应用于对 DataGridViewComboxColumn基于 格式化的值。但是这两个 选项仅在条件下适用 DataGridView没有边界 到数据源

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

    如果您有其他问题,请 别犹豫,让我知道

    真诚地,Linda Liu微软在线 社区支持


    要做到这一点并非不可能。我就是这样做的

    创建用绑定值填充的虚拟列所需的内容。您需要按程序执行此操作

    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比较两个单元格值以执行排序操作时发生

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

  • 将事件连接到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;