C#开发WinForm之DataGridView开发详解

C#开发WinForm之DataGridView开发详解

简介

DataGridView是WinForm中常用的控件之一,可以用于显示和编辑数据。本文将介绍DataGridView的使用方法,包括如何绑定数据、如何自定义样式、如何处理用户操作等。

数据绑定

要在DataGridView中显示数据,需要将数据源与控件绑定。假设我们有一个名为student的表格,包含id、name、age三个字段,并且我们已经将表格中的数据查询出来,并存在了一个名为ds的DataSet中。

我们可以通过以下代码将ds中student表的数据绑定到DataGridView中:

dataGridView.DataSource = ds.Tables["student"];

这样,DataGridView就会显示出student表的数据。如果我们想显示的不是整张表格,而是一个视图(包括部分列或只显示满足某些条件的记录),可以使用DataView来筛选。

下面的示例代码显示如何将student表中年龄大于20的记录显示在DataGridView中:

DataView dv = new DataView(ds.Tables["student"]);
dv.RowFilter = "age > 20";
dataGridView.DataSource = dv;

样式自定义

默认情况下,DataGridView显示的数据样式与平淡无味。我们可以自定义DataGridView单元格的样式和布局,让其看起来更美观。

单元格样式设置

我们可以通过设置DefaultCellStyle属性来设置所有DataGridView单元格的样式。例如,下面的代码将表格的背景色设置为浅灰色,前景色(即文字颜色)设置为黑色。

dataGridView.DefaultCellStyle.BackColor = Color.LightGray;
dataGridView.DefaultCellStyle.ForeColor = Color.Black;

我们还可以为不同的列设置不同的样式,方法是设置每列的DefaultCellStyle属性。例如,下面的代码设置第一列的文字颜色为红色,第二列的文字颜色为蓝色。

dataGridView.Columns[0].DefaultCellStyle.ForeColor = Color.Red;
dataGridView.Columns[1].DefaultCellStyle.ForeColor = Color.Blue;

单元格布局设置

另外,我们还可以设置单元格的布局,包括文字对齐方式、字体等。例如,下面的代码将单元格的内容垂直居中对齐,字体设置为12px的微软雅黑。

dataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView.DefaultCellStyle.Font = new Font("微软雅黑", 12);

用户操作处理

当用户对DataGridView进行编辑、排序、筛选等操作时,我们可以通过事件来响应这些操作并做出相应的处理。

编辑操作处理

当用户在DataGridView中编辑单元格并提交更改后,会触发CellEndEdit事件。我们可以在该事件中获取修改后的单元格的值,并进行相应的处理。例如,下面的代码将修改后的内容存储到数据库中。

private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewRow row = dataGridView.Rows[e.RowIndex];
    int id = Convert.ToInt32(row.Cells[0].Value);
    string name = row.Cells[1].Value.ToString();
    int age = Convert.ToInt32(row.Cells[2].Value);
    // 将修改后的数据存储到数据库中
    // ...
}

排序操作处理

当用户在DataGridView中点击列标题时,会对该列数据进行排序。我们可以在SortCompare事件中进行排序处理。例如,下面的代码实现了按照年龄升序排序的方法。

private void dataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    if (e.Column.Index == 2)  // 判断是否为年龄列
    {
        int v1 = Convert.ToInt32(e.CellValue1);
        int v2 = Convert.ToInt32(e.CellValue2);
        e.SortResult = v1.CompareTo(v2);  // 对年龄列进行升序排序
        e.Handled = true;  // 表示该事件已经处理
    }
}

筛选操作处理

当用户在DataGridView的筛选框中输入筛选条件时,会触发ColumnHeaderMouseClick事件。我们可以在该事件中获取用户输入的筛选条件,并使用DataView筛选数据。例如,下面的代码筛选年龄大于20的记录。

private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (dataGridView.Columns[e.ColumnIndex].HeaderText == "年龄")
    {
        string filter = "age > 20";
        DataView dv = new DataView(ds.Tables["student"]);
        dv.RowFilter = filter;
        dataGridView.DataSource = dv;
    }
}

示例

下面是一个简单的示例,演示了如何使用DataGridView显示数据,并对用户的编辑、排序、筛选操作进行相应的处理。

private DataSet ds;  // 数据集,包含student表格的数据
private DataView dv;  // 数据视图,用于筛选数据

private void Form1_Load(object sender, EventArgs e)
{
    // 加载数据并绑定到DataGridView中
    ds = loadStudentData();  // 加载student表格的数据
    dataGridView.DataSource = ds.Tables["student"];

    // 设置默认的单元格样式和布局
    dataGridView.DefaultCellStyle.BackColor = Color.LightGray;
    dataGridView.DefaultCellStyle.ForeColor = Color.Black;
    dataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
    dataGridView.DefaultCellStyle.Font = new Font("微软雅黑", 12);

    // 注册编辑、排序、筛选操作的事件处理函数
    dataGridView.CellEndEdit += dataGridView_CellEndEdit;
    dataGridView.SortCompare += dataGridView_SortCompare;
    dataGridView.ColumnHeaderMouseClick += dataGridView_ColumnHeaderMouseClick;
}

private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewRow row = dataGridView.Rows[e.RowIndex];
    int id = Convert.ToInt32(row.Cells[0].Value);
    string name = row.Cells[1].Value.ToString();
    int age = Convert.ToInt32(row.Cells[2].Value);
    // 将修改后的数据存储到数据库中
    // ...
}

private void dataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    if (e.Column.Index == 2)  // 判断是否为年龄列
    {
        int v1 = Convert.ToInt32(e.CellValue1);
        int v2 = Convert.ToInt32(e.CellValue2);
        e.SortResult = v1.CompareTo(v2);  // 对年龄列进行升序排序
        e.Handled = true;  // 表示该事件已经处理
    }
}

private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (dataGridView.Columns[e.ColumnIndex].HeaderText == "年龄")
    {
        string filter = "age > 20";
        if (dv == null)
        {
            dv = new DataView(ds.Tables["student"]);
        }
        dv.RowFilter = filter;
        dataGridView.DataSource = dv;
    }
}

private DataSet loadStudentData()
{
    // 从数据库或文件中加载student表格
    // ...
}

总结

DataGridView是WinForm中常用的控件之一,可以用于显示和编辑数据。我们可以通过数据绑定和样式自定义来控制其显示效果,通过事件响应来处理用户操作。祝大家使用DataGridView愉快!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#开发WinForm之DataGridView开发详解 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C#中数据类型的转换介绍

    C#中,数据类型的转换是非常常见的操作,涉及到的有隐式转换和显示转换两种操作。接下来,我们就来详细讲解C#中数据类型的转换介绍。 隐式转换 如果可以自动将一种类型的值转换为另一种类型,则称之为隐式类型转换。隐式转换不需要额外的语法。当源类型的值可以无精度损失地分配给目标类型时,或者当源类型的值可以强制转换为目标类型时,就发生隐式转换。 示例1: int i …

    C# 2023年5月15日
    00
  • C#简单连接sql数据库的方法

    关于“C#简单连接SQL数据库的方法”的完整攻略,我将给予如下详细讲解。 1. 引入命名空间 在C#程序中,首先需要引入System.Data.SqlClient这个命名空间。 using System.Data.SqlClient; 2. 创建连接对象 接下来需要创建一个连接对象SqlConnectionStringBuilder,通过它来构建连接字符串。…

    C# 2023年6月1日
    00
  • 浅谈C#中的委托、事件与异步

    浅谈C#中的委托、事件与异步攻略 委托 在 C# 中,委托是一个类,它可以封装一个或多个方法。委托是作为参数传递的。通过将方法指定为委托,可以将方法传递给其他方法。这些方法都以相同的委托类型作为参数和返回类型。 声明一个委托: delegate void MyDelegate(string message); 使用委托: public static void…

    C# 2023年6月6日
    00
  • 详解.Net缓存之MemoryCahe

    MemoryCache 是 .NET 缓存机制中的一种,它提供了一种简单的方式来缓存数据,以提高应用程序的性能。以下是详解 .NET 缓存之 MemoryCache 的完整攻略: 步骤一:添加依赖项 在使用 MemoryCache 之前,需要添加以下依赖项: Microsoft.Extensions.Caching.Memory 可以使用 NuGet 包管理…

    C# 2023年5月17日
    00
  • c#中(int)、int.Parse()、int.TryParse、Convert.ToInt32的区别详解

    标题:C#中(int)、int.Parse()、int.TryParse()、Convert.ToInt32()的区别详解 在C#中,我们通常需要将字符串转换为整数类型,而常用的转换方法有四种,分别是: (int); int.Parse(); int.TryParse(); Convert.ToInt32()。 下面将详细介绍这四种转换方法以及它们之间的区别…

    C# 2023年5月15日
    00
  • C# String.Join()方法: 将一个字符串数组的所有元素连接成一个字符串

    C#中的String类拥有Join()方法,它是用来连接字符串数组中的所有元素,返回一个新的字符串。下面是该函数的定义和使用方法: string.Join(string separator, params object[] values) 其中,参数separator是一个字符串,用于分割数组中的元素;参数values是object类型的数组,表示被连接的字…

    C# 2023年4月19日
    00
  • Directory文件类的实例讲解

    当我们在进行网站或者应用程序的开发时,通常需要对文件进行管理。其中一个重要的文件类是Directory文件类。在这个话题中,我们将详细讲解Directory文件类的实例。 Directory文件类的作用 Directory是一个文件类,用于对文件夹进行操作。通过Directory文件类,我们可以创建、复制、移动、删除、枚举文件夹中的文件或子文件夹等操作。 D…

    C# 2023年6月1日
    00
  • C#中Task.ContinueWith连续任务使用实例

    C#中Task.ContinueWith连续任务使用实例的攻略如下: 什么是Task.ContinueWith Task.ContinueWith方法是Task的一个实例方法,它可以让一个Task实例完成后直接执行一个指定的返回值为Task的委托,并返回最终值为Task的Task实例。 当我们利用Task进行异步编程时,很有可能会遇到需要在完成某个任务之后进…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部