首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【愚公系列】2023年11月 WPF控件专题 Line控件详解
2
【愚公系列】2023年11月 WPF控件专题 2023秋招WPF高频面试题
3
【愚公系列】2023年11月 Winform控件专题 Label控件详解
4
【愚公系列】2023年11月 Winform控件专题 Button控件详解
5
【愚公系列】2023年11月 Winform控件专题 Form控件详解
6
【愚公系列】2023年11月 Winform控件专题 TextBox控件详解
7
【愚公系列】2023年11月 Winform控件专题 CheckBox控件详解
8
【愚公系列】2023年11月 Winform控件专题 RadioButton控件详解
9
【愚公系列】2023年11月 Winform控件专题 ComboBox控件详解
10
【愚公系列】2023年11月 Winform控件专题 RichTextBox控件详解
11
【愚公系列】2023年11月 Winform控件专题 ListBox控件详解
12
【愚公系列】2023年11月 Winform控件专题 CheckedListBox控件详解
13
【愚公系列】2023年11月 Winform控件专题 numericUpDown控件详解
14
【愚公系列】2023年11月 Winform控件专题 LinkLabel控件详解
15
【愚公系列】2023年11月 Winform控件专题 DateTimePicker控件详解
16
【愚公系列】2023年11月 Winform控件专题 NotifyIcon控件详解
17
【愚公系列】2023年11月 Winform控件专题 ContextMenuStrip控件详解
18
【愚公系列】2023年11月 Winform控件专题 Timer控件详解
19
【愚公系列】2023年11月 Winform控件专题 PictureBox控件详解
20
【愚公系列】2023年11月 Winform控件专题 Chart控件详解
21
【愚公系列】2023年11月 Winform控件专题 DataGridView控件详解
22
【愚公系列】2023年11月 Winform控件专题 TableLayoutPanel控件详解
23
【愚公系列】2023年11月 Winform控件专题 ProgressBar控件详解
24
【愚公系列】2023年11月 Winform控件专题 Panel控件详解
25
【愚公系列】2023年11月 Winform控件专题 FlowLayoutPanel控件详解
26
【愚公系列】2023年11月 Winform控件专题 GroupBox控件详解
27
【愚公系列】2023年11月 Winform控件专题 SplitContainer控件详解
28
【愚公系列】2023年11月 Winform控件专题 TabControl控件详解
29
【愚公系列】2023年11月 Winform控件专题 ToolTip控件详解
30
【愚公系列】2023年11月 Winform控件专题 MaskedTextBox控件详解
31
【愚公系列】2023年11月 Winform控件专题 MonthCalendar控件详解
32
【愚公系列】2023年11月 Winform控件专题 TreeView控件详解
33
【愚公系列】2023年11月 Winform控件专题 MenuStrip控件详解
34
【愚公系列】2023年11月 Winform控件专题 OpenFileDialog控件详解
35
【愚公系列】2023年11月 Winform控件专题 SaveFileDialog控件详解
36
【愚公系列】2023年12月 Winform控件专题 FontDialog控件详解
37
【愚公系列】2023年12月 Winform控件专题 ColorDialog控件详解
38
【愚公系列】2023年12月 Winform控件专题 FolderBrowserDialog控件详解
39
【愚公系列】2023年12月 Winform控件专题 StatusStrip控件详解
40
【愚公系列】2023年12月 Winform控件专题 ToolStrip控件详解
41
【愚公系列】2023年12月 Winform控件专题 HelpProvider控件详解
42
【愚公系列】2023年12月 Winform控件专题 ToolStripContainer控件详解
43
【愚公系列】2023年12月 Winform控件专题 BackgroundWorker控件详解
44
【愚公系列】2023年12月 GDI+绘图专题 图形图像编程基础
45
【愚公系列】2023年12月 GDI+绘图专题 图形图像的重绘
46
【愚公系列】2023年12月 GDI+绘图专题 颜色获取和图形绘制
47
【愚公系列】2023年12月 GDI+绘图专题 Point
48
【愚公系列】2023年12月 GDI+绘图专题 Rectangle
49
【愚公系列】2023年12月 GDI+绘图专题 Matrix
50
【愚公系列】2023年12月 GDI+绘图专题 Pen

【愚公系列】2023年11月 Winform控件专题 DataGridView控件详解

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。

🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。

🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

Winform控件是Windows Forms中的用户界面元素,它们可以用于创建Windows应用程序的各种视觉和交互组件,例如按钮、标签、文本框、下拉列表框、复选框、单选框、进度条等。开发人员可以使用Winform控件来构建用户界面并响应用户的操作行为,从而创建功能强大的桌面应用程序。

🚀一、DataGridView控件详解

DataGridView是Winform中非常常用的控件之一,它可以用来显示和编辑表格数据。以下是一些常用的DataGridView控件的操作方法:

  1. 添加数据:使用DataGridView的Rows属性来添加新行。例如,可以使用以下代码向DataGridView添加新行:
代码语言:c#
复制
DataGridViewRow row = new DataGridViewRow();
row.CreateCells(dataGridView1);
row.Cells[0].Value = "1";
row.Cells[1].Value = "John";
row.Cells[2].Value = "Doe";
dataGridView1.Rows.Add(row);
  1. 删除数据:使用DataGridView的SelectedRows属性来确定要删除的行,然后使用DataGridView的Rows属性来删除它们。例如,可以使用以下代码删除选定的行:
代码语言:c#
复制
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
    dataGridView1.Rows.Remove(row);
}
  1. 编辑数据:使用DataGridView的CellEndEdit事件来捕获数据的更改。例如,可以使用以下代码在单元格编辑后更新数据:
代码语言:c#
复制
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
    DataGridViewCell cell = row.Cells[e.ColumnIndex];
    // 更新数据库中的数据
}
  1. 排序数据:使用DataGridView的Sort方法来对数据进行排序。例如,可以使用以下代码按名称对数据进行排序:
代码语言:c#
复制
dataGridView1.Sort(dataGridView1.Columns["Name"], ListSortDirection.Ascending);
在这里插入图片描述

🔎1.属性介绍

🦋1.1 AllowUserToAddRows、AllowUserToDeleteRows、AllowUserToOrderColumns、AllowUserToResizeColumns、AllowUserToResizeRows

DataGridView控件有一些常用的属性,可以允许用户对表格进行一些基本的操作。下面介绍一下这些属性的使用方法:

  1. AllowUserToAddRows:设置为True时,会在最后一行自动添加一行空行,用于新增数据。例如:
代码语言:c#
复制
dataGridView1.AllowUserToAddRows = true;
  1. AllowUserToDeleteRows:设置为True时,会允许用户删除表格中选中的行。例如:
代码语言:c#
复制
dataGridView1.AllowUserToDeleteRows = true;
  1. AllowUserToOrderColumns:设置为True时,会允许用户通过拖拽表格列标题来重新排序表格列。例如:
代码语言:c#
复制
dataGridView1.AllowUserToOrderColumns = true;
  1. AllowUserToResizeColumns:设置为True时,会允许用户通过拖拽表格列标题来调整表格列宽度。例如:
代码语言:c#
复制
dataGridView1.AllowUserToResizeColumns = true;
  1. AllowUserToResizeRows:设置为True时,会允许用户通过拖拽表格行边框来调整表格行高度。例如:
代码语言:c#
复制
dataGridView1.AllowUserToResizeRows = true;

以上是几个常用的DataGridView属性,主要是表格的手动操作,可以提高用户的操作体验。

🦋1.2 AlternatingRowsDefaultCellStyle

DataGridView控件的AlternatingRowsDefaultCellStyle属性是用来设置DataGridView控件的奇数行和偶数行的样式。

具体使用方法如下:

  1. 打开Winform设计器,选中DataGridView控件,在属性窗口中找到AlternatingRowsDefaultCellStyle属性,双击即可打开CellStyle编辑器。
  2. 在CellStyle编辑器中,可以设置奇数行和偶数行的背景颜色、字体、前景颜色等样式属性。也可以选择使用其他样式。
  3. 设置完毕后,保存CellStyle,关闭编辑器,运行程序即可看到DataGridView控件的奇数行和偶数行已经按照设定的样式显示出来了。

示例代码:

代码语言:c#
复制
this.dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray;
this.dataGridView1.AlternatingRowsDefaultCellStyle.Font = new Font("Tahoma", 8, FontStyle.Bold);
this.dataGridView1.AlternatingRowsDefaultCellStyle.ForeColor = Color.Black;

这段代码将DataGridView控件的奇数行的背景颜色设置为浅灰色,字体设置为Tahoma字体,加粗,前景颜色设置为黑色。

在这里插入图片描述

🦋1.3 AutoSizeColumnsMode、AutoSizeRowsMode

DataGridView控件在Winform中是一个非常常用的控件,其中AutoSizeColumnsMode和AutoSizeRowsMode属性可以帮助我们更好地去设置DataGridView控件的显示效果。

AutoSizeColumnsMode属性是用于设置DataGridView控件的列宽自适应模式,其枚举类型有:

  1. DataGridViewAutoSizeColumnsMode.None:表示不自适应;
  2. DataGridViewAutoSizeColumnsMode.AllCells:自适应所有单元格内容的宽度;
  3. DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader:自适应所有单元格内容的宽度,除了列标题;
  4. DataGridViewAutoSizeColumnsMode.ColumnHeader:适应列标题的宽度;
  5. DataGridViewAutoSizeColumnsMode.DisplayedCells:根据显示的单元格内容自适应单元格宽度;
  6. DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader:根据显示的单元格内容自适应单元格宽度,除了列标题。

AutoSizeRowsMode属性是用于设置DataGridView控件的行高自适应模式,其枚举类型有:

  1. DataGridViewAutoSizeRowsMode.None:表示不自适应;
  2. DataGridViewAutoSizeRowsMode.AllCells:自适应所有单元格内容的高度;
  3. DataGridViewAutoSizeRowsMode.DisplayedCells:根据显示的单元格内容自适应行高度。

🦋1.4 ClipboardCopyMode

DataGridView控件的ClipboardCopyMode属性用于设置复制到剪贴板的内容类型。该属性有以下几种取值:

  1. Disable:禁用复制到剪贴板的操作。
  2. EnableWithoutHeaderText:复制到剪贴板时,不包含列标题。
  3. EnableWithAutoHeaderText:复制到剪贴板时,列标题将作为复制的内容的第一行。
  4. EnableAlwaysIncludeHeaderText:复制到剪贴板时,列标题将作为复制的内容的第一行,即使SelectedRowsOnly属性设置为true。
  5. EnableAlwaysExcludeHeaderText:复制到剪贴板时,不包含列标题,即使SelectedRowsOnly属性设置为false。

下面是一个示例代码,演示如何设置DataGridView控件的ClipboardCopyMode属性:

代码语言:c#
复制
private void button1_Click(object sender, EventArgs e)
{
    dataGridView1.Rows.Clear();
    dataGridView1.Rows.Add();
    dataGridView1.Rows[0].Cells[0].Value = "我是中国人";
    dataGridView1.Rows[0].Cells[1].Value = "程序员";
    dataGridView1.Rows.Add();
    dataGridView1.Rows[1].Cells[0].Value = "这是一个测试程序";
    dataGridView1.Rows[1].Cells[1].Value = "中国人";
    dataGridView1.Rows[0].HeaderCell.Value = "第一行";
    dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.SunkenHorizontal;
}
private void button2_Click(object sender, EventArgs e)
{
    if (this.dataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0)
    {
        try
        {

            Clipboard.SetDataObject(this.dataGridView1.GetClipboardContent());//将鼠标选定内容复制到剪贴板
            this.textBox1.Text = Clipboard.GetText();//将剪贴板内容赋值给textBox1
        }

        catch (System.Runtime.InteropServices.ExternalException)
        {
            this.textBox1.Text =
                "The Clipboard could not be accessed. Please try again.";
        }
    }
}

上述代码中,首先创建了一个DataGridView控件,并为其设置了数据源,然后将其添加到窗体中。在按钮的单击事件中,将选中的行复制到剪贴板中,并设置了复制到剪贴板的内容类型为包含列标题的内容。

在这里插入图片描述

🦋1.5 ColumnHeadersBorderStyle、ColumnHeadersDefaultCellStyle、ColumnHeadersHeightSizeMode、ColumnHeadersVisible、Columns

DataGridView控件是Winform中常用的数据展示控件之一。下面是对其中几个常用属性的介绍:

  1. ColumnHeadersBorderStyle:用于设置列标题边框样式。可以设置为None、Single、Raised、Sunken等值。
  2. ColumnHeadersDefaultCellStyle:用于设置列标题单元格的默认样式。可以设置颜色、字体、对齐方式等属性。
  3. ColumnHeadersHeightSizeMode:用于设置列标题高度的大小模式。可以设置为AutoSize、DisableResizing、EnableResizing等值。
  4. ColumnHeadersVisible:用于控制列标题是否可见。可以设置为True或False。
  5. Columns:用于获取或设置DataGridView控件的列集合。可以通过该属性添加、删除、编辑列。

🦋1.6 DataMember、DataSource

DataGridView控件的DataMember和DataSource属性是用来绑定数据源的。其中,DataMember属性指定了DataGridView控件绑定的数据源的成员名称,而DataSource属性则指定了DataGridView控件绑定的数据源。

使用方法如下:

  1. 设置数据源

首先要设置数据源,可以使用任意类型的对象作为数据源,比如DataTable、List、Array等等,例如:

代码语言:c#
复制
//创建数据源
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Age", typeof(int));
dt.Rows.Add("Tom", 20);
dt.Rows.Add("Jerry", 18);
dt.Rows.Add("Mike", 25);

//将数据源绑定到DataGridView控件
dataGridView1.DataSource = dt;
  1. 设置DataMember属性

如果数据源是DataTable类型,则需要指定DataTable的成员名称,即DataMember属性。例如:

代码语言:c#
复制
//设置DataMember属性
dataGridView1.DataMember = "Person";

上述代码中,数据源是一个名为"Person"的DataTable对象。

  1. 案例
代码语言:c#
复制
 DataTable dt1 = new DataTable();
dt1.TableName = "表1";
dt1.Columns.Add("id");
dt1.Rows.Add();
dt1.Rows[0][0] = "3";

DataTable dt2= new DataTable();
dt2.TableName = "表2";
dt2.Columns.Add("姓名");
dt2.Rows.Add();
dt2.Rows[0][0] = "张三";

DataSet dataSet = new DataSet();
dataSet.Tables.Add(dt1 );
dataSet.Tables.Add(dt2);

dataGridView1.DataSource = dataSet;
dataGridView1.DataMember = "表1";
在这里插入图片描述

通过设置DataMember和DataSource属性,我们可以将数据源和DataGridView控件进行绑定,从而实现数据的显示和编辑。

🦋1.7 RowTemplate

DataGridView控件的RowTemplate属性是一个DataGridViewRow类型的属性,用于设置控件中默认的行样式。可以在设计时或运行时设置该属性。

使用RowTemplate属性可以在DataGridView控件中自定义行样式。可以在DataGridView中添加多个行,每行都可以有不同的样式。例如,对于某些行,可以设置不同的背景颜色或字体颜色等。

具体步骤如下:

  1. 打开Winform项目,拖拉一个DataGridView控件到窗体中;
  2. 添加要显示的列,设置列的属性;
  3. 设置RowTemplate属性,例如设置行背景颜色:
代码语言:c#
复制
dataGridView1.RowTemplate.DefaultCellStyle.BackColor = Color.Red;
  1. 添加行数据:
代码语言:c#
复制
dataGridView1.Rows.Add(new object[] { "1", "Tom", "Male" });
dataGridView1.Rows.Add(new object[] { "2", "Lucy", "Female" });

此时,第一行和第二行的背景颜色都将显示为红色。

可以根据需要设置行的各种属性,例如字体颜色、字体大小、边框样式等。

需要注意的是,只有在添加行之前设置RowTemplate属性才会生效。如果在添加行之后设置RowTemplate属性,则不会影响已添加的行样式。

🦋1.8 ScrollBars

DataGridView控件有两个滚动条:水平滚动条和垂直滚动条,滚动条的出现和隐藏受ScrollBars属性的影响。

ScrollBars属性控制DataGridView控件的滚动条的显示方式,可以设置为None、Horizontal、Vertical、Both四种选择。

  • ScrollBars.None:不显示滚动条。
  • ScrollBars.Horizontal:只显示水平滚动条。
  • ScrollBars.Vertical:只显示垂直滚动条。
  • ScrollBars.Both:同时显示水平和垂直滚动条。

使用示例:

代码语言:c#
复制
// 不显示滚动条
dataGridView1.ScrollBars = ScrollBars.None;

// 只显示水平滚动条
dataGridView1.ScrollBars = ScrollBars.Horizontal;

// 只显示垂直滚动条
dataGridView1.ScrollBars = ScrollBars.Vertical;

// 同时显示水平和垂直滚动条
dataGridView1.ScrollBars = ScrollBars.Both;

需要注意的是,如果设置DataGridView的AutoSizeColumnsMode属性为Fill或者Column.Fill,则滚动条将不会出现,因为表格中的所有列都已经被自动调整大小,不需要滚动条来滚动表格了。

🔎2.常用场景

  1. 数据展示:DataGridView控件可以用来展示各种类型的数据,包括文本、数字、日期等等。可以通过设置列的属性来控制数据的呈现形式。
  2. 数据编辑:DataGridView控件可以允许用户对数据进行编辑。可以通过设置列的属性来控制哪些列可以编辑、编辑的类型和格式等。
  3. 数据排序:DataGridView控件可以允许用户对数据进行排序。可以通过设置列的属性来控制哪些列可以排序,以及排序方式等。
  4. 数据过滤:DataGridView控件可以允许用户对数据进行过滤,只显示符合特定条件的数据。可以通过设置列的属性来控制哪些列可以过滤,以及过滤条件。
  5. 数据选择:DataGridView控件可以允许用户选择一行或多行数据。可以通过设置控件的属性来控制选择模式,如单选、多选等。
  6. 数据导出:DataGridView控件可以允许用户将数据导出到Excel、CSV等格式。可以通过设置控件的属性来控制导出的格式和内容。
  7. 数据统计:DataGridView控件可以允许用户对数据进行统计,如求和、平均值、最大值、最小值等。可以通过编写代码来实现统计功能。🔎3.具体案例下面是一个Winform中使用DataGridView控件实现CURD的完整案例:

Step 1: 创建一个Winform应用程序

创建一个新的Winform应用程序,命名为DataGridViewCurdDemo。

Step 2: 添加DataGridView控件

在设计器中添加一个DataGridView控件,并在其上添加四个按钮:添加、编辑、删除和保存。

Step 3: 添加数据源

在解决方案资源管理器中添加一个DataSet文件,命名为CustomerDataSet.xsd。在该文件中添加一个数据表,命名为Customer。为该数据表添加四个字段:ID、Name、Gender和Age。

Step 4: 编写数据访问层代码

在项目中添加一个名为CustomerDAL的类,用于访问数据库。在该类中编写CRUD操作的代码。

代码语言:c#
复制
public class CustomerDAL
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString);

    public DataTable GetAllCustomers()
    {
        DataTable dt = new DataTable();
        string query = "SELECT * FROM Customer";
        SqlCommand cmd = new SqlCommand(query, conn);
        SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        adapter.Fill(dt);
        return dt;
    }

    public bool AddCustomer(Customer customer)
    {
        string query = "INSERT INTO Customer (Name, Gender, Age) VALUES (@Name, @Gender, @Age)";
        SqlCommand cmd = new SqlCommand(query, conn);
        cmd.Parameters.AddWithValue("@Name", customer.Name);
        cmd.Parameters.AddWithValue("@Gender", customer.Gender);
        cmd.Parameters.AddWithValue("@Age", customer.Age);
        conn.Open();
        int result = cmd.ExecuteNonQuery();
        conn.Close();
        return result == 1;
    }

    public bool UpdateCustomer(Customer customer)
    {
        string query = "UPDATE Customer SET Name = @Name, Gender = @Gender, Age = @Age WHERE ID = @ID";
        SqlCommand cmd = new SqlCommand(query, conn);
        cmd.Parameters.AddWithValue("@Name", customer.Name);
        cmd.Parameters.AddWithValue("@Gender", customer.Gender);
        cmd.Parameters.AddWithValue("@Age", customer.Age);
        cmd.Parameters.AddWithValue("@ID", customer.ID);
        conn.Open();
        int result = cmd.ExecuteNonQuery();
        conn.Close();
        return result == 1;
    }

    public bool DeleteCustomer(int id)
    {
        string query = "DELETE FROM Customer WHERE ID = @ID";
        SqlCommand cmd = new SqlCommand(query, conn);
        cmd.Parameters.AddWithValue("@ID", id);
        conn.Open();
        int result = cmd.ExecuteNonQuery();
        conn.Close();
        return result == 1;
    }
}

Step 5: 编写实体类

在项目中添加一个名为Customer的类,用于表示一个顾客。

代码语言:c#
复制
public class Customer
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Gender { get; set; }
    public int Age { get; set; }
}

Step 6: 编写业务逻辑层代码

在项目中添加一个名为CustomerBLL的类,用于实现与数据库交互的逻辑。

代码语言:c#
复制
public class CustomerBLL
{
    CustomerDAL dal = new CustomerDAL();

    public DataTable GetAllCustomers()
    {
        return dal.GetAllCustomers();
    }

    public bool AddCustomer(Customer customer)
    {
        return dal.AddCustomer(customer);
    }

    public bool UpdateCustomer(Customer customer)
    {
        return dal.UpdateCustomer(customer);
    }

    public bool DeleteCustomer(int id)
    {
        return dal.DeleteCustomer(id);
    }
}

Step 7: 编写界面层代码

在项目中打开Form1.cs文件,编写界面层代码。

代码语言:c#
复制
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        BindDataGridView();
    }

    private void BindDataGridView()
    {
        CustomerBLL bll = new CustomerBLL();
        DataTable dt = bll.GetAllCustomers();
        dataGridView1.DataSource = dt;
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        CustomerForm form = new CustomerForm();
        if (form.ShowDialog() == DialogResult.OK)
        {
            CustomerBLL bll = new CustomerBLL();
            if (bll.AddCustomer(form.Customer))
            {
                BindDataGridView();
            }
        }
    }

    private void btnEdit_Click(object sender, EventArgs e)
    {
        if (dataGridView1.SelectedRows.Count > 0)
        {
            int id = int.Parse(dataGridView1.SelectedRows[0].Cells["ID"].Value.ToString());
            CustomerForm form = new CustomerForm(id);
            if (form.ShowDialog() == DialogResult.OK)
            {
                CustomerBLL bll = new CustomerBLL();
                if (bll.UpdateCustomer(form.Customer))
                {
                    BindDataGridView();
                }
            }
        }
        else
        {
            MessageBox.Show("请选择要编辑的行");
        }
    }

    private void btnDelete_Click(object sender, EventArgs e)
    {
        if (dataGridView1.SelectedRows.Count > 0)
        {
            int id = int.Parse(dataGridView1.SelectedRows[0].Cells["ID"].Value.ToString());
            CustomerBLL bll = new CustomerBLL();
            if (bll.DeleteCustomer(id))
            {
                BindDataGridView();
            }
        }
        else
        {
            MessageBox.Show("请选择要删除的行");
        }
    }

    private void btnSave_Click(object sender, EventArgs e)
    {
        CustomerBLL bll = new CustomerBLL();
        DataTable dt = dataGridView1.DataSource as DataTable;
        foreach (DataRow row in dt.Rows)
        {
            Customer customer = new Customer();
            customer.ID = int.Parse(row["ID"].ToString());
            customer.Name = row["Name"].ToString();
            customer.Gender = row["Gender"].ToString();
            customer.Age = int.Parse(row["Age"].ToString());
            bll.UpdateCustomer(customer);
        }
        MessageBox.Show("保存成功");
    }
}

Step 8: 编写添加/编辑顾客窗口

在项目中添加一个名为CustomerForm的窗口,用于添加/编辑顾客信息。

代码语言:c#
复制
public partial class CustomerForm : Form
{
    public Customer Customer { get; set; }

    public CustomerForm()
    {
        InitializeComponent();
    }

    public CustomerForm(int id)
    {
        InitializeComponent();
        CustomerBLL bll = new CustomerBLL();
        Customer = bll.GetAllCustomers().AsEnumerable().Where(x => x.Field<int>("ID") == id).Select(x => new Customer { ID = x.Field<int>("ID"), Name = x.Field<string>("Name"), Gender = x.Field<string>("Gender"), Age = x.Field<int>("Age") }).FirstOrDefault();
        txtName.Text = Customer.Name;
        if (Customer.Gender == "男")
        {
            rbtnMale.Checked = true;
        }
        else if (Customer.Gender == "女")
        {
            rbtnFemale.Checked = true;
        }
        numAge.Value = Customer.Age;
    }

    private void btnOK_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrWhiteSpace(txtName.Text))
        {
            MessageBox.Show("姓名不能为空");
            return;
        }
        if (!rbtnMale.Checked && !rbtnFemale.Checked)
        {
            MessageBox.Show("请选择性别");
            return;
        }
        Customer = new Customer();
        Customer.Name = txtName.Text;
        Customer.Gender = rbtnMale.Checked ? "男" : "女";
        Customer.Age = (int)numAge.Value;
        this.DialogResult = DialogResult.OK;
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Cancel;
    }
}

Step 9: 运行应用程序

编译并运行应用程序,点击“添加”按钮添加新的顾客,点击“编辑”按钮编辑已有的顾客,点击“删除”按钮删除已有的顾客,点击“保存”按钮保存所有的更改。


我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

下一篇
举报
领券