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);
        }
    }
}

效果图:

2).复制选中单元格的内容到剪贴板

程序代码
Clipboard.SetDataObject(dataGridView1.GetClipboardContent());

3).只显示自定义列

程序代码
dataGridView1.AutoGenerateColumns = false;//必须在代码中设置

4).显示图片

通常,我们将图片路径保存在数据库中,但在dataGridView1中要显示图片,可以进行如下操作:

①.添加一个DataGridViewTextBoxColumn类型的列,Name=Path,DataPropertyName=Pic,Visible=False;
②.添加一个DataGridViewImageColumn类型的列,Name=Pic;
③.dataGridView1控件DataBindingComplete事件处理程序如下:

程序代码
private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    Image image1 = null;
    Image image2 = null;
    string path = string.Empty;

for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        path = @"F:\" + dataGridView1.Rows[i].Cells["Path"].Value;

if (File.Exists(path))
        {
            image1 = Image.FromFile(path);
            image2 = new Bitmap(image1, 120, 120);//重设大小

dataGridView1.Rows[i].Cells["Pic"].Value = image2;
            //((DataGridViewImageCell)dataGridView1.Rows[i].Cells["Pic"]).Value = image2;
        }
    }
}

5).当网格未填充满控件时,画线来填充空白区域

程序代码
/// <summary>
/// 绘制网格填充空白区域
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    DataGridView myDataGridView = (DataGridView)sender;

if (myDataGridView.Rows.Count > 0)
    {
        int i = myDataGridView.ColumnHeadersHeight;//标题行高
        int j = myDataGridView.Rows.GetRowsHeight(DataGridViewElementStates.Visible); //所有可见行总高
        int k = myDataGridView.Height; //控件高度
        int l = myDataGridView.Rows.GetLastRow(DataGridViewElementStates.Visible);//最后一行索引
        int count = myDataGridView.Columns.Count;//列总数
        int width = 0;

//当网格未充满控件时才画线
        if (i + j < k)
        {
            using (Brush gridBrush = new SolidBrush(myDataGridView.GridColor))
            {
                using (Pen gridLinePen = new Pen(gridBrush))
                {
                    //处理标题列
                    if (myDataGridView.RowHeadersVisible)
                    {
                        width = myDataGridView.RowHeadersWidth;
                        e.Graphics.DrawLine(gridLinePen, width, i + j, width, k);
                    }
                    else
                    {
                        width = 1;
                    }

//处理正常列
                    for (int index = 0; index < count; index++)
                    {
                        if (myDataGridView.Columns[index].Visible)
                        {
                            width += myDataGridView.Columns[index].Width;

e.Graphics.DrawLine(gridLinePen, width, i + j, width, k);
                        }
                    }
                }
            }
        }
    }
}

6).自定义列宽

手动添加列,再在编辑列界面中逐个设置宽度。注意AutoSizeColumnsMode的值必须为DataGridViewAutoSizeColumnsMode.None,否则自定义宽度不能生效!

7).单元格内容格式化

程序代码
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    DataGridView myDataGridView = (DataGridView)sender;
    if (myDataGridView.Columns["ID"].Index == e.ColumnIndex)
    {
        if(e.Value != null && !string.IsNullOrEmpty(e.Value.ToString()))
            e.Value = "BH" + string.Format("{0:D8}", int.Parse(e.Value.ToString()));
    }
}

8).打造一个漂亮的DataGridView

程序代码
//样式
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;//列宽不自动调整,手工添加列
dataGridView1.RowHeadersWidth = 12;//行标题宽度固定12
dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;//不能用鼠标调整列标头宽度
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LemonChiffon;//奇数行背景色
dataGridView1.BackgroundColor = Color.White;//控件背景色
dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;//列标题居中显示
dataGridView1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;//单元格内容居中显示

//行为
dataGridView1.AutoGenerateColumns = false;//不自动创建列
dataGridView1.AllowUserToAddRows = false;//不启用添加
dataGridView1.ReadOnly = true;//不启用编辑
dataGridView1.AllowUserToDeleteRows = false;//不启用删除
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//单击单元格选中整行
dataGridView1.MultiSelect = false;//不能多选

9).判断有无滚动条

程序代码
//垂直滚动条
if (dataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.None) > dataGridView1.Height)
    MessageBox.Show("有");
else
    MessageBox.Show("无");

//水平滚动条
if(dataGridView1.Columns.GetColumnsWidth(DataGridViewElementStates.None) > dataGridView1.Width)
    MessageBox.Show("有");
else
    MessageBox.Show("无");

10).为什么列标题总不居中?

已经将列标题默认对齐方式设置为居中:

程序代码
dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;//列标题居中显示

但实际的效果总是偏左了一点,原因是列可以进行排序,排序标志符号在列标题上占了空间。逐列按下边设置可去掉:

程序代码
dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;

转载于:https://www.cnblogs.com/lgx5/p/7041289.html

DataGridView添加右键菜单等技巧相关推荐

  1. C# winforms datagridview 设置右键菜单【完整版】

    在程序开发当中有时候需要在DataGridView的数据行上添加右键菜单,总结了一下网上的例子,记录如下 步骤一:编辑右键菜单 1.创建窗体文件,拖入DataGridView,拖入一个contextM ...

  2. 在(CListView)列表视图中添加右键菜单的方法

    使用弹出式菜单(PopMenu) 弹 出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单.通常情况下,弹出式菜单在鼠标右键单击时弹出,当 然,也可以根据需要 ...

  3. java 右键菜单_界面操作--添加右键菜单

    [java]代码库package 添加右键菜单; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; impor ...

  4. ListCtrl添加右键菜单(ListCtrl类里编辑,给ListCtrl 发送NM_RCLICK消息)

    在开发中会用到右键菜单,我们来一起学习一下. 假如,我们现在已经准备好了列表,就差右键处理了. 1.在资源视图中的添加一个MENU,如图 2.给要添加右键菜单的ListCtrl子类,添加消息 按 ct ...

  5. merlin.acs的使用方法 merlin.acs添加右键菜单

    阅读全文:http://www.cckan.net/forum.php?mod=viewthread&tid=39 看看这个怎么样吧 直接看代码吧我就不多说了 1.先下载一下这个控件 吧 网上 ...

  6. openlayer右键菜单_OpenLayers添加右键菜单

    1.       首先修改 OpenLayers Events.js 定位到下面代码段,添加右键菜单事件: View Code OpenLayers.Events = OpenLayers.Class ...

  7. tkinter向文本框里加内容_给tkinter文本框添加右键菜单

    给tkinter文本框添加右键菜单 需求:直接右键点击使用tkinter创建的文本框是不会弹出菜单的.我们需要实现右键点击tkinter框架下的Entry对象.Text对象后弹出右键菜单可复制.粘贴和 ...

  8. 非管理员用户添加右键菜单(管理员也适用)

    目录 背景 解决办法 总结:把其他教程中的HKEY_CLASSES_ROOT替换为HKEY_CURRENT_USER\SOFTWARE\Classes即可 背景 网上大多数教程添加右键菜单的方法都需要 ...

  9. chrome添加右键菜单收藏CSDN文章到我的博客

    需求: 看到好的文章时,想收藏,但是chrome的收藏夹不支持搜索(虽然有其他插件可以用),收藏的多了以后不好找,而且万一某一天浏览器或系统重装,而没有登录同步数据或者没有导出由的话这些收藏就会丢失. ...

  10. Windows10 为指定类型文件添加右键菜单项并传递文件名,点击后调用python脚本进行处理

    Windows10 为指定类型文件添加右键菜单项并传递文件名,点击后调用python脚本进行处理 需求举例: 在.torrent文件上点击右键时,右键菜单上显示 [更新文件名称],点击此项调用相应的p ...

最新文章

  1. Snackbar-Android M新控件
  2. vue安装与配置、脚手架
  3. BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)
  4. mysql定义shell变量_shell 变量的定义,赋值,运算
  5. 华为和荣耀蓝牙耳机为什么那么贵?
  6. Python+OpenCV:高动态范围(High Dynamic Range, HDR)
  7. SVN下载安装及入门使用教程,详细到不能再详细了
  8. 一文读懂什么是MRO采购
  9. 调出软键盘 挤掉标题栏咋办
  10. python搬家具_Python面向对象实现案例———摆放家具
  11. GMA Round 1 YGGDRASIL
  12. 【下载】Step7 V5.4 中文版【绝对能安装使用】
  13. kettle carte子服务器的使用
  14. ffmpeg js转换音频_webRTC使用ffmpeg.js将webm转换为mp4
  15. 卷积神经网络使用到的公式
  16. 人生效率手册---读书笔记
  17. 怎样禁止macOS 在Safari下载的ZIP文件自动解压?
  18. python怎么编写对称图案_python – 无论matplotlib中的箭头角度如何,都使箭头形状对称...
  19. 联邦学习在金融领域的发展和应用
  20. MOS管驱动电路及注意事项-KIA MOS管

热门文章

  1. 时机论:早起的鸟儿也要选对“用户”季节
  2. 对搜狐、网易和TOM三大门户网站的SQL注入漏洞检测
  3. 63相似、合同、相抵
  4. 深入浅出带你了解Python2与Python3的异同
  5. HTML - 字符实体
  6. caffe 利用Python API 做数据输入层
  7. idea改类名快捷键_IDEA使用之快捷键(default设置)
  8. vue Mutation 必须是同步函数 为什么_为什么vue组件中data必须用函数表达?
  9. Vuex actions 异步操作基础
  10. Vuex mutations的详细解读