热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DataGridView多列排序实现方法

本文介绍如何在WindowsForms应用程序中使用C#实现DataGridView的多列排序功能,包括升序和降序排序。
为了在Windows Forms应用程序中实现DataGridView的多列排序,我们可以利用C#中的自定义比较器来处理排序逻辑。以下是具体的实现步骤和代码示例。

```csharp
using System;
using System.Collections;
using System.Windows.Forms;

public class Form1 : Form
{
private DataGridView dataGridView1 = new DataGridView();
private FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();
private Button button1 = new Button();
private RadioButton radioButtOnAsc= new RadioButton();
private RadioButton radioButtOnDesc= new RadioButton();

[STAThread]
public static void Main()
{
Application.Run(new Form1());
}

public Form1()
{
AutoSize = true;
Text = "DataGridView 多列排序示例";

flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
flowLayoutPanel1.Location = new System.Drawing.Point(300, 0);
flowLayoutPanel1.AutoSize = true;

flowLayoutPanel1.Controls.Add(radioButtonAsc);
flowLayoutPanel1.Controls.Add(radioButtonDesc);
flowLayoutPanel1.Controls.Add(button1);

button1.Text = "排序";
radioButtonAsc.Text = "升序";
radioButtonDesc.Text = "降序";
radioButtonAsc.Checked = true;

Controls.Add(flowLayoutPanel1);
Controls.Add(dataGridView1);
}

protected override void OnLoad(EventArgs e)
{
PopulateDataGridView();
button1.Click += new EventHandler(Button1_Click);
base.OnLoad(e);
}

private void PopulateDataGridView()
{
dataGridView1.Size = new Size(300, 300);
dataGridView1.ColumnCount = 2;

dataGridView1.Columns[0].Name = "FirstName";
dataGridView1.Columns[1].Name = "LastName";
dataGridView1.Columns["FirstName"].HeaderText = "名";
dataGridView1.Columns["LastName"].HeaderText = "姓";
dataGridView1.Columns["FirstName"].SortMode = DataGridViewColumnSortMode.Programmatic;
dataGridView1.Columns["LastName"].SortMode = DataGridViewColumnSortMode.Programmatic;

dataGridView1.Rows.Add(new string[] { "Peter", "Parker" });
dataGridView1.Rows.Add(new string[] { "James", "Jameson" });
dataGridView1.Rows.Add(new string[] { "May", "Parker" });
dataGridView1.Rows.Add(new string[] { "Mary", "Watson" });
dataGridView1.Rows.Add(new string[] { "Eddie", "Brock" });
}

private void Button1_Click(object sender, EventArgs e)
{
if (radioButtonAsc.Checked)
{
dataGridView1.Sort(new RowComparer(SortOrder.Ascending));
}
else if (radioButtonDesc.Checked)
{
dataGridView1.Sort(new RowComparer(SortOrder.Descending));
}
}

private class RowComparer : IComparer
{
private int sortOrderModifier = 1;

public RowComparer(SortOrder sortOrder)
{
if (sortOrder == SortOrder.Descending)
{
sortOrderModifier = -1;
}
else if (sortOrder == SortOrder.Ascending)
{
sortOrderModifier = 1;
}
}

public int Compare(object x, object y)
{
DataGridViewRow row1 = (DataGridViewRow)x;
DataGridViewRow row2 = (DataGridViewRow)y;

int compareResult = String.Compare(
row1.Cells[1].Value.ToString(),
row2.Cells[1].Value.ToString());

if (compareResult == 0)
{
compareResult = String.Compare(
row1.Cells[0].Value.ToString(),
row2.Cells[0].Value.ToString());
}

return compareResult * sortOrderModifier;
}
}
}
```

### 参考资料
- [MSDN: DataGridView.Sort 方法](http://msdn.microsoft.com/en-us/library/ms171607(VS.80).aspx)
- [MSDN: 如何:对 Windows 窗体 DataGridView 控件中的数据进行排序](http://msdn.microsoft.com/zh-cn/library/ms171608(VS.80).aspx)
- [MSDN: DataGridViewColumnSortMode 枚举](http://msdn.microsoft.com/en-us/library/95scxcdy.aspx)
- [CodeProject: DataGridView 的多列排序](http://www.codeproject.com/KB/grid/multicolumn_sort.aspx)
- [MSDN 博客: DataGridView 排序技巧](http://blogs.msdn.com/jfoscoding/articles/494012.aspx)
推荐阅读
  • 前端常用的布局类型——前端布局
    1.Static静态布局固定宽高:2.Liquid流式布局宽高用百分比,按屏幕分辨率调整,布局不发生变化3.Adaptive自适应 ... [详细]
  • 本文介绍了在Android项目中实现时间轴效果的方法,通过自定义ListView的Item布局和适配器逻辑,实现了动态显示和隐藏时间标签的功能。文中详细描述了布局文件、适配器代码以及时间格式化工具类的具体实现。 ... [详细]
  • Go语言开发中的常见陷阱与解决方案
    本文探讨了在使用Go语言开发过程中遇到的一些典型问题,包括Map遍历的不确定性、切片操作的潜在风险以及并发处理时的常见错误。通过具体案例分析,提供有效的解决策略。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • Android商城应用开发指南(第二部分):创建启动欢迎页
    大多数商城应用程序在启动时会显示一个欢迎页面,以提升用户体验。本文将指导您如何实现一个基本的欢迎页,该页面会在用户打开应用后短暂展示,随后自动跳转至主界面。 ... [详细]
  • Eclipse 下 JavaFX 程序开发指南
    本文介绍了 JavaFX,这是一个用于创建富客户端应用程序的 Java 图形和媒体工具包,并详细说明了如何在 Eclipse 环境中配置和开发 JavaFX 应用。 ... [详细]
  • Gradle复合构建详解
    自Gradle 3.3起,复合构建功能得以实现,这是一种能够整合其他独立构建的高级构建模式。本文将详细介绍复合构建与多项目构建的区别,以及如何在实际项目中应用复合构建。 ... [详细]
  • Android开发技巧:实现带描边的圆角图片
    本文介绍了一种在Android应用中实现带描边的圆角图片的方法。通过使用BitmapShader类,开发者可以轻松地为图片添加圆角和描边效果,提升应用的视觉体验。 ... [详细]
  • Android 自定义指南针视图实现
    本文介绍了如何在Android应用中自定义绘制指南针视图,包括方位角的计算、不同方向的颜色区分以及视图随手势移动的功能实现。 ... [详细]
  • 本文主要探讨了在实现Socket通信时,服务器端可能出现的端口冲突问题及其解决方案。通过具体示例和步骤指导,帮助读者理解和解决此类常见问题。 ... [详细]
  • Log4net是一款由Apache软件基金会开发的强大且灵活的日志记录工具,与Log4j同属一个系列。它支持多种日志记录方式,并能显著提升软件开发的效率。本文将详细介绍如何在ASP.NET Web Forms项目中集成Log4net。 ... [详细]
  • XWiki 数据模型开发指南
    本文档不仅介绍XWiki作为一个增强版的wiki引擎,还深入探讨了其数据模型,该模型可在用户界面层面被充分利用。借助其强大的脚本能力,XWiki的数据模型支持从简单的应用到复杂的系统构建,几乎无需直接接触XWiki的核心组件。 ... [详细]
  • 本文详细介绍了如何在Android应用中使用GridView组件以网格形式展示数据(如文本和图像)。通过行列布局,实现类似矩阵的数据展示效果。 ... [详细]
author-avatar
手机用户2502853373
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有