【问题标题】:Sorting Datagridview's Column by text and not value按文本而不是值对 Datagridview 的列进行排序
【发布时间】:2010-01-11 20:59:36
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 您能否包含代码以显示您当前如何填充组合框?
  • 它是从数据集中填充的

标签: c# .net winforms


【解决方案1】:

您可以通过覆盖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 上有一个设置,以使其成为默认选项。

【讨论】:

  • 这个事件似乎不适合我!
  • "只有在未设置 DataSource 属性且 VirtualMode 属性值为 false 时才会发生此事件。" - 如果 DataGridView 被绑定,它就没有用了! msdn.microsoft.com/en-us/library/…
【解决方案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;
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 该事件从未发生过,我已经尝试过这种方法,但没有成功。
    • DataGridView 数据绑定时不会发生 SortCompare 事件。来自 MSDN:“此事件仅在未设置 DataSource 属性且 VirtualMode 属性值为 false 时发生。”
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:
      DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
      col.DataSource = items;
      col.SortMode = DataGridViewColumnSortMode.Automatic;
      

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

      【讨论】:

        【解决方案6】:

        显然,这是不可能的。我一直在寻找同样的东西,但我不确定为什么没有人会认为这是一个重要的功能。这是原始问题的链接以及来自 Microsoft 代表的答案。

        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,看来你有 自定义排序。

        有多种自定义选项 一种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 属性

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

        好像只有option2和option3 可用于排序 DataGridViewComboBoxColumn 基于 格式化值。然而,这两个 选项仅适用于条件 DataGridView 不受限制 到数据源。

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

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

        此致 Linda Liu Microsoft Online 社区支持

        【讨论】:

          【解决方案7】:

          其实很简单,这是一个对我有用的示例代码:

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

          第三行是关键。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-12
            • 2012-05-10
            相关资源
            最近更新 更多