【WinForm】DataGridView使用小结
一、填充数据
https://blog.csdn.net/whuarui2010/article/details/9141349
//以下采用两种方法: //第一种采用DataSource的方式赋值,显示到dataGridView1 //第二种方式采用foreach循环遍历逐行赋值,显示到dataGridView2上 //优缺点: //第一种,显示速度快,只能显示数据源中的数据,不够灵活 //第二种,显示的数据灵活,数据量大时,填充数据慢 //1.获取数据 DataTable dt = new DataTable(); dt = GetTargetDatas(); //2.赋值,第一种方法 FillDataGridViewWithDataSource(dataGridView1, dt); //2.赋值,第二种方法 FillDataGridViewWithForeach(dataGridView2, dt);
private void FillDataGridViewWithDataSource(DataGridView dataGridView,DataTable dTable) { //1.清空旧数据 dataGridView.Rows.Clear(); //2.填充新数据 if (dTable != null && dTable.Rows.Count > 0) { //设置DataGridView列数据 dataGridView.Columns["ITEM_NO"].DataPropertyName = "ITEM_NO"; dataGridView.Columns["ITEM_NAME"].DataPropertyName = "ITEM_NAME"; dataGridView.Columns["INPUT_CODE"].DataPropertyName = "INPUT_CODE"; //设置数据源,部分显示数据 dataGridView.DataSource = dTable; dataGridView.AutoGenerateColumns = false; } } private void FillDataGridViewWithForeach(DataGridView dataGridView, DataTable dTable) { //1.清空旧数据 dataGridView.Rows.Clear(); //2.赋值新数据 foreach (DataRow row in dTable.Rows) { int index = dataGridView.Rows.Add(); dataGridView.Rows[index].Cells["ITEM_NO2"].Value = row["ITEM_NO"]; dataGridView.Rows[index].Cells["ITEM_NAME2"].Value = row["ITEM_NAME"]; dataGridView.Rows[index].Cells["INPUT_CODE2"].Value = row["INPUT_CODE"]; } }
二、DataGridView限制单元格输入数字、限制输入长度
https://blog.csdn.net/haoduo123456789001/article/details/54944757
//编写DataGridView的EditingControlShowing事件: TextBox control; //定义输入框控件对象 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { //只对TextBox类型的单元格进行验证 if (e.Control.GetType().BaseType.Name == "TextBox") { control = new TextBox(); control = (TextBox)e.Control; if (control.Text == "0") //需要限制输入数字的单元格 { control.KeyPress += new KeyPressEventHandler(control_KeyPress); } else { //非数字类型单元格 control.Leave += new EventHandler(control_Leave); } } } void control_KeyPress(object sender, KeyPressEventArgs e) { //限制只能输入-9的数字,退格键,小数点和回车 if (((int)e.KeyChar >= 48 && (int)e.KeyChar <= 57) || e.KeyChar == 13 || e.KeyChar == 8 || e.KeyChar == 46) { e.Handled = false; } else { e.Handled = true; MessageBox.Show("只能输入数字!"); } } void control_Leave(object sender, EventArgs e) { //如果需要限制字符串输入长度 if (control.Text.Length != 11) { MessageBox.Show("只能为位!"); control.Focus(); } }
三、CheckBox列使用
1、判断DataGridView中的CheckBox列是否被选中
for (int i = 0; i < dataGridView1.Rows.Count; i++) { if ((bool)dataGridView1.Rows[i].Cells[0].EditedFormattedValue==true) { //TODO } }
2、取消全选功能时,焦点行的勾选状态不改变
在设置单元格Value=false前,需要dgv.EndEdit()结束编辑状态。
四、DataGridView嵌入ComboBox以及DataGridViewComboBoxColumn数据绑定
(1)DataGridView加入ComboBox下拉框的实现
https://blog.csdn.net/hws1058648831a/article/details/8970188
(2)嵌入ComboBox以及DataGridViewComboBoxColumn数据绑定
https://blog.csdn.net/u013992365/article/details/54292338
五、提取选中DataGridView中某单元格的值为空时出错的问题
不要用 dataGridView1.Rows[e.RowIndex].Cells[ ].Value.ToString();
使用Convert.ToString(dataGridView1.Rows[e.RowIndex].Cells[ ].Value进行转换
六、添加右键菜单
(1)添加一个快捷菜单contextMenuStrip1;
(2)给dataGridView1的CellMouseDown事件添加处理程序
private void DataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { if (e.Button==MouseButtons.Right) { if (e.RowIndex >= 0) { //若行已是选中状态就不再进行设置 if (dataGridView1.Rows[e.RowIndex].Selected== false) { dataGridView1.ClearSelection(); dataGridView1.Rows[e.RowIndex].Selected = true; } //只选中一行时设置活动单元格 if (dataGridView1.SelectedRows.Count == 1) { dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; } //弹出操作菜单 contextMenuStrip1.Show(MousePosition.X, MousePosition.Y); } } }
七、单元格的ToolTip的设置
DataGridView.ShowCellToolTips = True 的情况下,单元格的 ToolTip 可以表示出来。对于单元格窄小,无法完全显示的单元格,ToolTip 可以显示必要的信息。
1、设定单元格的ToolTip内容
// 设定单元格的ToolTip内容
DataGridView1[0, 0].ToolTipText = "该单元格的内容不能修改";
// 设定列头的单元格的ToolTip内容
DataGridView1.Columns[0].ToolTipText = "该列只能输入数字";
// 设定行头的单元格的ToolTip内容
DataGridView1.Rows[0].HeaderCell.ToolTipText = "该行单元格内容不能修改";
2、批量的单元格的 ToolTip 设定
在批量的单元格的 ToolTip 设定的时候,一个一个指定那么设定的效率比较低, 这时候可以利用 CellToolTipTextNeeded 事件。当单元格的ToolTipText 变化的时候也会引发该事件。但是,当DataGridView的DataSource被指定且VirualMode=True的时候,该事件不会被引发。
// CellToolTipTextNeeded事件处理方法 private void DataGridView1_CellToolTipTextNeeded(object sender, DataGridViewCellToolTipTextNeededEventArgs e) { e.ToolTipText = e.ColumnIndex.ToString() + ", " + e.RowIndex.ToString(); }
八、外观属性汇总
1、设置表头颜色
必须先设置EnableHeadersVisualStyles为false
再设置ColumnHeadersDefaultCellStyle的BackColor
dataGridView1.EnableHeadersVisualStyles = false;
dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Red;
2、列宽和行高自动调整的设定
(1)让列填充满DGV控件
AutoSizeColumnsMode设为Fill
(2)设定行高和列宽自动调整
// 设定包括Header和所有单元格的列宽自动调整
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
// 设定包括Header和所有单元格的行高自动调整
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
(3)指定列或行自动调整
// 第一列自动调整
DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
(4)设定列头的高度和行头的宽度自动调整
// 设定列头的宽度可以自由调整
DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
// 设定行头的宽度可以自由调整
DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
属性介绍:
3、删除多余的空白行
将AllowUserToAddRows属性设置为False
4、DataGridView 设定单元格只读
(1) 使用 ReadOnly 属性
如果希望,DataGridView 内所有单元格都不可编辑, 那么只要:
//设置 DataGridView1 为只读
DataGridView1.ReadOnly = true;此时,用户的新增行操作和删除行操作也被屏蔽了。
如果希望,DataGridView 内某个单元格不可编辑, 那么只要:
//设置 DataGridView1 的第2列整列单元格为只读
DataGridView1.Columns[1].ReadOnly = true;
//设置 DataGridView1 的第3行整行单元格为只读
DataGridView1.Rows[2].ReadOnly = true;
//设置 DataGridView1 的[0,0]单元格为只读
DataGridView1[0, 0].ReadOnly = true;
(2) 使用 EditMode 属性
DataGridView.EditMode 属性被设置为 DataGridViewEditMode.EditProgrammatically 时,用户就不能手动编辑单元格的内容了。但是可以通过程序,调用 DataGridView.BeginEdit 方法,使单元格进入编辑模式进行编辑。
(3)根据条件设定单元格的不可编辑状态
当一个一个的通过单元格坐标设定单元格 ReadOnly 属性的方法太麻烦的时候,你可以通过 CellBeginEdit 事件来取消单元格的编辑。
private void DataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { DataGridView dgv = (DataGridView)sender; //是否可以进行编辑的条件检查 if (dgv.Columns[e.ColumnIndex].Name == "Column1" && !(bool)dgv["Column2", e.RowIndex].Value) { // 取消编辑 e.Cancel = true; } }
5、DataGridView 行、列的隐藏
(1)行、列的隐藏
// DataGridView1的第一列隐藏
DataGridView1.Columns[0].Visible = false;
// DataGridView1的第一行隐藏
DataGridView1.Rows[0].Visible = false;
(2)行头、列头的隐藏
// 列头隐藏
DataGridView1.ColumnHeadersVisible = false;
// 行头隐藏
DataGridView1.RowHeadersVisible = false;
6、DataGridView 禁止列或者行的Resize
(1)禁止所有的列或者行的Resize
// 禁止用户改变DataGridView1所有列的列宽
DataGridView1.AllowUserToResizeColumns = false;
//禁止用户改变DataGridView1所有行的行高
DataGridView1.AllowUserToResizeRows = false;
但是可以通过 DataGridViewColumn.Width 或者 DataGridViewRow.Height 属性设定列宽和行高。
(2)禁止指定行或者列的Resize
// 禁止用户改变DataGridView1的第一列的列宽
DataGridView1.Columns[0].Resizable = DataGridViewTriState.False;
// 禁止用户改变DataGridView1的第一列的行宽
DataGridView1.Rows[0].Resizable = DataGridViewTriState.False;
关于 NoSet :
当 Resizable 属性设为 DataGridViewTriState.NotSet 时, 实际上会默认以 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的属性值进行设定。
比如: DataGridView.AllowUserToResizeColumns = False 且 Resizable 是 NoSet 设定时,Resizable = False 。
判断 Resizable 是否是继承设定了 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的属性值,可以根据 State 属性判断。如果 State 属性含有 ResizableSet,那么说明没有继承设定。
(3)禁止用户改变行头的宽度以及列头的高度
// 禁止用户改变列头的高度
DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
// 设置用户改变行头的宽度
DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing;
7、DataGridView 冻结列或行
(1)列冻结
DataGridViewColumn.Frozen 属性为 True 时, 该列左侧的所有列被固定, 横向滚动时固定列不随滚动条滚动而左右移动。这对于重要列固定显示很有用。
// DataGridView1的左侧2列固定
DataGridView1.Columns[1].Frozen = true;
但是,DataGridView.AllowUserToOrderColumns = True 时,固定列不能移动到非固定列, 反之亦然。
(2)行冻结
DataGridViewRow.Frozen 属性为 True 时, 该行上面的所有行被固定, 纵向滚动时固定行不随滚动条滚动而上下移动。
// DataGridView1 的上3行固定
DataGridView1.Rows[2].Frozen = true;
8、允许调整列的顺序
设定 DataGridView 的 AllowUserToOrderColumns 为 True。
当用户改变列的顺序的时候,其本身的 Index 不会改变,但是 DisplayIndex 改变了。你也可以通过程序改变 DisplayIndex 来改变列的顺序。 列顺序发生改变时会引发ColumnDisplayIndexChanged 事件。
9、表头不能居中
已经设置了ColumnHeadersDefaultCellStyle.Alignment为MiddleCenter,看起来还是偏左。
要额外设定这个属性: