C#高级:Winform桌面开发中DataGridView的详解

目录

一、前端界面

二、模块代码

1.初始化列表代码

2.点击单元格按钮事件(datagridview双击进入)

3.一键选中(checkbox)双击进入

 4.查看选中(button)双击进入

5.点击按钮获取选中的一行实体

6.点击单元格获取实体

 7.点击单元行头获取实体

三、整体代码

四、测试结果

五、样式

六、小结


一、前端界面

添加的datagridview应该如下设置:

1.只设置启用编辑

2.设置好每列的名称、控件类型、提示中文(页眉文本),选择【可见】等选项(建议TextBox选可见+只读,Checkbox选可见即可,Button选可见即可。选择只读后,不能被编辑或选中。)

3.如果不需要默认列,可以设置:RowHeadersVisibed = False 

二、模块代码

【实体列表】

1.初始化列表代码

【备注】1.建立列表是模拟查数据库。2.“如果学生名为"小苏",则移除查看详情按钮是一个题目要求,实际中不需要该功能可注释掉该代码。3.数据实体绑定于Tag上,Tag能识别哪行被点击或选中。

 /// <summary>
 /// 初始化填充数据
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Form1_Load(object sender, EventArgs e)
 {
     #region 建立列表
     Student student1 = new Student { ID = 1, Name = "小苏", Remarks = "小苏的备注" };
     Student student2 = new Student { ID = 2, Name = "小明", Remarks = "小明的备注" };
     Student student3 = new Student { ID = 3, Name = "小花", Remarks = "小花的备注" };
     var list = new List<Student>();
     list.Add(student1);
     list.Add(student2);
     list.Add(student3);
     #endregion
     // 清空现有数据
     dataGridView1.Rows.Clear();
     //添加数据
     foreach (var item in list)
     {
         int rowIndex = dataGridView1.Rows.Add();
         dataGridView1.Rows[rowIndex].Cells["ID"].Value = item.ID;//字段
         dataGridView1.Rows[rowIndex].Cells["StuName"].Value = item.Name;//字段
         dataGridView1.Rows[rowIndex].Cells["Details"].Value = "查看详情";//按钮名称
         dataGridView1.Rows[rowIndex].Tag = item;
         // 如果学生名为"小苏",则移除查看详情按钮
         if (item.Name == "小苏")
         {
             dataGridView1.Rows[rowIndex].Cells["Details"] = new DataGridViewTextBoxCell();//重新初始化
             dataGridView1.Rows[rowIndex].Cells["Details"].ReadOnly = true;  // 设置为只读
         }
     }
 }

【扩展】也可以直接选择绑定而不写上述代码:(灵活性降低)

2.点击单元格按钮事件(datagridview双击进入)

作用:点击查看详情跳出备注信息

/// <summary>
/// 点击查看详情
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == dataGridView1.Columns["Details"].Index && e.RowIndex >= 0)//若点击了标签为【Details】列的按钮
    {
        // 获取当前行对应的实体对象【注意修改此处Student类】,此处能获取到Remarks字段(虽然没有显示在界面上,但也绑定到Tag了)
        var item = dataGridView1.Rows[e.RowIndex].Tag as Student;
        //将list实体中的Remarks展示出来(item包含的字段:ID,Name,Remarks)
        MessageBox.Show(item.Remarks, "内容详情");
        //【补充一:获取按钮上的文字】
    }
}

【补充一:获取按钮上的文字】

DataGridViewButtonCell buttonCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewButtonCell;//获取点击的按钮
if (buttonCell != null && buttonCell.Value != null)
{
    if (buttonCell.Value.ToString() == "借出")//按钮字样为借出
    {
        ;// 执行借出操作
    }
    else if (buttonCell.Value.ToString() == "归还")//按钮字样为归还
    {
        ;// 执行归还操作
    }
}

3.一键选中(checkbox)双击进入

作用:点击一键选中按钮,选中列表所有的checkbox

/// <summary>
/// 一键选中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if(checkBox1.Checked)
    {
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            DataGridViewCheckBoxCell checkBox = row.Cells["ManySelect"] as DataGridViewCheckBoxCell;//获取【ManySelect】的checkbox列
            if (checkBox != null)
            {
                checkBox.Value = true;
            }
        }
    }
}

 4.查看选中(button)双击进入

作用:点击查看选中按钮,获得一个选中的列表

/// <summary>
/// 点击查看选中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)//点击触发
{
    //获取【DataGridView1】的checkbox选中的实体
    var selectlist = new List<Student>();//将【Student】类存放入列表
    //遍历获取数据
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        DataGridViewCheckBoxCell checkBox = row.Cells["ManySelect"] as DataGridViewCheckBoxCell;
        if (checkBox != null && checkBox.Value != null  && (bool)checkBox.Value)
        {
            // 获取与选中CheckBox相关联的实体,假设实体类型为Student
            var entity = row.Tag as Student; //【Student】实体
            if (entity != null)
            {
                selectlist.Add(entity);
            }
        }
    }
    //后续可对selectlist操作
}

5.点击按钮获取选中的一行实体

前提条件:需要默认列,可以设置 RowHeadersVisibed = True ,即获取点击单元行头的实体

private void button3_Click(object sender, EventArgs e)
{
    if (dataGridView2.SelectedRows.Count == 1)//当选中了一行时
    {
        // 获取选中的那行,转化为【StuMessage】实体
        var selectedEntity = dataGridView2.Rows[dataGridView2.SelectedRows[0].Index].Tag as StuMessage;
        ;
    }
}

6.点击单元格获取实体

private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    var stumodel = dataGridView2.Rows[e.RowIndex].Tag as StuMessage;
}

 7.点击单元行头获取实体

private void dataGridView2_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    var stumodel = dataGridView2.Rows[e.RowIndex].Tag as StuMessage;
}

三、整体代码

【注意】此代码为Demo代码,并不符合编写规范,旨在帮助开发者找到灵感。

using System.Collections.Generic;

namespace WinFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        class Student
        {
            public int ID { get; set; }
            public string Name { get; set; }

            public string Remarks { get; set; }
        }
        /// <summary>
        /// 初始化填充数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            #region 建立列表
            Student student1 = new Student { ID = 1, Name = "小苏", Remarks = "小苏的备注" };
            Student student2 = new Student { ID = 2, Name = "小明", Remarks = "小明的备注" };
            Student student3 = new Student { ID = 3, Name = "小花", Remarks = "小花的备注" };
            var list = new List<Student>();
            list.Add(student1);
            list.Add(student2);
            list.Add(student3);
            #endregion
            // 清空现有数据
            dataGridView1.Rows.Clear();
            //添加数据
            foreach (var item in list)
            {
                int rowIndex = dataGridView1.Rows.Add();
                dataGridView1.Rows[rowIndex].Cells["ID"].Value = item.ID;//字段
                dataGridView1.Rows[rowIndex].Cells["StuName"].Value = item.Name;//字段
                dataGridView1.Rows[rowIndex].Cells["Details"].Value = "查看详情";//按钮名称
                dataGridView1.Rows[rowIndex].Tag = item;
                // 如果学生名为"小苏",则移除查看详情按钮
                if (item.Name == "小苏")
                {
                    dataGridView1.Rows[rowIndex].Cells["Details"] = new DataGridViewTextBoxCell();//重新初始化
                    dataGridView1.Rows[rowIndex].Cells["Details"].ReadOnly = true;  // 设置为只读
                }
            }
        }
        /// <summary>
        /// 点击查看选中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)//点击触发
        {
            //获取【DataGridView1】的checkbox选中的实体
            var selectlist = new List<Student>();//将【Student】类存放入列表
            //遍历获取数据
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                DataGridViewCheckBoxCell checkBox = row.Cells["ManySelect"] as DataGridViewCheckBoxCell;
                if (checkBox != null && checkBox.Value != null  && (bool)checkBox.Value)
                {
                    // 获取与选中CheckBox相关联的实体,假设实体类型为Student
                    var entity = row.Tag as Student; //【Student】实体
                    if (entity != null)
                    {
                        selectlist.Add(entity);
                    }
                }
            }
            //后续可对selectlist操作
        }
        /// <summary>
        /// 点击查看详情
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == dataGridView1.Columns["Details"].Index && e.RowIndex >= 0)//若点击了标签为【Details】列的按钮
            {
                // 获取当前行对应的实体对象【注意修改此处Student类】,此处能获取到Remarks字段(虽然没有显示在界面上,但也绑定到Tag了)
                var item = dataGridView1.Rows[e.RowIndex].Tag as Student;
                //将list实体中的Remarks展示出来(item包含的对象:ID,Name,Remarks)
                MessageBox.Show(item.Remarks, "内容详情");
            }
        }
        /// <summary>
        /// 一键选中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if(checkBox1.Checked)
            {
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    DataGridViewCheckBoxCell checkBox = row.Cells["ManySelect"] as DataGridViewCheckBoxCell;//获取【ManySelect】多选框列
                    if (checkBox != null)
                    {
                        checkBox.Value = true;
                    }
                }
            }
        }
    }
}

四、测试结果

1.通过debug发现选中有效(测试通过)

2.发现小苏对应按钮被删除(测试通过)

3.发现一键多选奏效(测试通过,图略) 

4.发现查看详情有效(测试通过)

五、样式

修改某行的字体颜色:

if (item.Name == "小明")
{
    dataGridView1.Rows[rowIndex].DefaultCellStyle.ForeColor = Color.Red;//文字颜色
    dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.Yellow;//背景颜色
}

 

六、小结

1.增:  建议用textbox、combobox等工具增,而不是直接datagridview新增,一来代码编写麻烦,二来输入工具不能多样化(比如说时间控件、多选框控件)。

2.删:建议每条数据加一个删除按钮,方便操作

3.改:建议选中某条数据然后将数据信息转移到textbox上,label显示“您已选中xxx数据”,然后点击button去修改相应信息(选中数据和点击按钮都能获取到对应实体)

4.查:同第2条

5.如果单纯用datagridview作增删查改,虽然能实现,但是代码复杂难以维护,而且输入条件单一,容易操作失误,不建议这么做。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinFormDataGridView是一个非常常用的控件,用于显示和编辑数据。要使用DataGridView控件,你需要遵循以下几个步骤: 1. 在窗体上添加一个DataGridView控件。 2. 通过编程的方式或者通过设计器,设置DataGridView的属性和样式,如列的数量和类型、行的数量、单元格的样式等。 3. 将数据绑定到DataGridView控件上。可以通过设置DataGridView的DataSource属性,将数据源对象绑定到控件上,并通过调用DataGridView的DataBind方法更新数据。 4. 处理DataGridView的事件,以实现你所需要的功能。例如,你可以使用DataGridView的CellClick事件来处理单元格的点击事件,使用CellValueChanged事件来处理单元格值的变化事件等。 引用的代码 `dataGridView1.Columns.Insert(0, new DataGridViewCheckBoxColumn());` 用于在DataGridView的第一列之前插入一个复选框列。 引用提到的DataGridViewCell、DataGridViewRow、DataGridViewColumn和它们的派生类是用于访问和操作DataGridView控件的单元格、行和列的相关属性和方法的类。 引用的代码 `if (dataGridView1[e.ColumnIndex, e.RowIndex].ErrorText != String.Empty)` 则是在处理DataGridView的某个特定事件时,判断某个单元格是否有错误信息。 综上所述,要在WinForm使用DataGridView控件,你需要添加控件、设置属性和样式、绑定数据、处理事件,并可以使用相关类来访问和操作单元格、行和列的属性和方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [DataGridView控件使用大全](https://blog.csdn.net/weixin_34272308/article/details/85482365)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值