目录
一、前端界面
添加的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作增删查改,虽然能实现,但是代码复杂难以维护,而且输入条件单一,容易操作失误,不建议这么做。