【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,看起来还是偏左。

要额外设定这个属性:

 

 

出处

posted @ 2021-06-23 15:38  不溯流光  阅读(1126)  评论(0编辑  收藏  举报