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


前言

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

一、DataGridView控件详解

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

  1. 添加数据:使用DataGridView的Rows属性来添加新行。例如,可以使用以下代码向DataGridView添加新行:
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属性来删除它们。例如,可以使用以下代码删除选定的行:
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
    
    
    dataGridView1.Rows.Remove(row);
}
  1. 编辑数据:使用DataGridView的CellEndEdit事件来捕获数据的更改。例如,可以使用以下代码在单元格编辑后更新数据:
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    
    
    DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
    DataGridViewCell cell = row.Cells[e.ColumnIndex];
    // 更新数据库中的数据
}
  1. 排序数据:使用DataGridView的Sort方法来对数据进行排序。例如,可以使用以下代码按名称对数据进行排序:
dataGridView1.Sort(dataGridView1.Columns["Name"], ListSortDirection.Ascending);

在这里插入图片描述

1.属性介绍

1.1 AllowUserToAddRows、AllowUserToDeleteRows、AllowUserToOrderColumns、AllowUserToResizeColumns、AllowUserToResizeRows

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

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

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

1.2 AlternatingRowsDefaultCellStyle

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

具体使用方法如下:

  1. 打开Winform设计器,选中DataGridView控件,在属性窗口中找到AlternatingRowsDefaultCellStyle属性,双击即可打开CellStyle编辑器。

  2. 在CellStyle编辑器中,可以设置奇数行和偶数行的背景颜色、字体、前景颜色等样式属性。也可以选择使用其他样式。

  3. 设置完毕后,保存CellStyle,关闭编辑器,运行程序即可看到DataGridView控件的奇数行和偶数行已经按照设定的样式显示出来了。

示例代码:

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属性:

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等等,例如:

//创建数据源
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属性。例如:

//设置DataMember属性
dataGridView1.DataMember = "Person";

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

  1. 案例
 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属性,例如设置行背景颜色:

dataGridView1.RowTemplate.DefaultCellStyle.BackColor = Color.Red;
  1. 添加行数据:
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:同时显示水平和垂直滚动条。

使用示例:

// 不显示滚动条
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操作的代码。

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的类,用于表示一个顾客。

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的类,用于实现与数据库交互的逻辑。

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文件,编写界面层代码。

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的窗口,用于添加/编辑顾客信息。

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: 运行应用程序

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

猜你喜欢

转载自blog.csdn.net/aa2528877987/article/details/132773059