前段时间我有一个朋友面试公司的时候遇到这个面试题,他也给了份原题给我瞧瞧,并没有什么特别的要点,关于这一类问题,如何在网格上的单元格嵌入多个控件(如按钮、超链接等)问题,我在网上搜索了下这类问题,发现很多解答但是都杂乱,本篇文章帮助大家了解如何应对这类问题。

微软提供的DataGirdView网格控件可通过GetCellDisplayRectangle()方法将需要的控件嵌入单元格中,如:

this.Load += Form1_Load;

void Form1_Load(object sender, EventArgs e)
{
  MulAutoBtnEdit();
}

private void MulAutoBtnEdit()
{
  this.dataGridView1.Columns.Add("ColBtnEdit", "嵌入操作按钮");
  this.dataGridView1.Columns["ColBtnEdit"].Width = 150;
  int index = this.dataGridView1.Columns["ColBtnEdit"].Index;
  this.dataGridView1.Columns["ColBtnEdit"].Resizable = DataGridViewTriState.False;
  Button btnAdd = GetBtnByType("BtnAdd","新增");
  Button btnEdit = GetBtnByType("BtnEdit", "修改");
  Button btnDel = GetBtnByType("BtnDel", "删除");
  this.dataGridView1.Controls.Add(btnAdd);
  this.dataGridView1.Controls.Add(btnEdit);
  this.dataGridView1.Controls.Add(btnDel);
  Rectangle rectangle = this.dataGridView1.GetCellDisplayRectangle(index, 0, true);//获取当前单元格上的矩形区域
  btnAdd.Size = btnEdit.Size = btnDel.Size = new Size(rectangle.Width / 3 + 1, rectangle.Height);
  btnAdd.Location = new Point(rectangle.Left, rectangle.Top);
  btnEdit.Location = new Point(rectangle.Left + btnAdd.Width, rectangle.Top);
  btnDel.Location = new Point(rectangle.Left + btnAdd.Width + btnDel.Width, rectangle.Top);
}

private Button GetBtnByType(string strBtnName,string strBtnText)
{
  Button btn = new Button();
  btn.Name = strBtnName;
  btn.Text = strBtnText;
  btn.Click += btn_Click;
  return btn;
}

private void btn_Click(object sender, EventArgs e)
{
  if(sender is Button)
  {
    Button btn = (Button)sender;
    MessageBox.Show(string.Format("点击按钮:{0}",btn.Text));
  }
}

效果图:

通过以上的操作即可将多个按钮嵌入到单元格中,不考虑维护性、效率问题,只在于给予大家思路,对于“超链接”控件等都可用类似的方法处理,类似网址如下:

https://bbs.csdn.net/topics/340208660

在网上发行另一种方式,思路差不多,地址我也贴出来:

https://blog.csdn.net/linzi1015910507/article/details/52595863

关于第三方DevExpress组件上的网格如GridView等,本人并没有找到好的解决上面问题的方法,有不足之处,知情人事可在留言板上赐教。

A young idler ~ an old beggar !

DataGridView的单元格如何嵌入多个按钮控件的更多相关文章

  1. WinForm中DataGridView验证单元格输入的是数字

    转载:http://www.cnblogs.com/ganqiyin/archive/2013/02/18/2915491.html 事件:DataGridView验证单元格输入的是数字,DataGr ...

  2. 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件

    “/”应用程序中的服务器错误. 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“c552ea94-6fbb-11d5-a9c1-00104bb6fc1c”. 说明: 执行当前 Web ...

  3. DataGridView 的单元格的边框、 网格线样式的设定【转】

    1) DataGridView 的边框线样式的设定DataGridView 的边框线的样式是通过 DataGridView.BorderStyle 属性来设定的. BorderStyle 属性设定值是 ...

  4. DataGridView合并单元格

    昨天一个同事问我DataGridView单元格合并的问题,一开始按照我的设想是算出两个单元格的Rectangle,然后直接使用e.Graphics.FillRectangle(backColorBru ...

  5. DataGridView的单元格控制只能输入数字

    主要是应用DataGridView的EditingControlShowing事件.当单元格进入编辑模式时,可以处理执行该编辑控件的自定义初始化的此事件. public DataGridViewTex ...

  6. 如何通过DataGridView 实现单元格合并和二维表头

    先看下实现出来的效果(这里随便写了几组数据,用来测试) 先初始一个DataGridView 设置哪几列 DataGridView 里男女这两列的 AutoSizeMode 可以设置Fill. publ ...

  7. DataGridView合并单元格(多行多列合并)

    一.点击在拖入的显示控件(TreeList)右上方的箭头,在Treelist任务中选择数据源,添加项目数据源,依次选择数据库.数据集,新建连接,浏览选择数据库(*.mdb),依次点击 下一步,选择“表 ...

  8. DataGridView合并单元格(一列或一行)

    #region"合并单元格的测试(一列或一行)" // int?是搜索一种类型(可空类型),普通的int不能为null,而用int?,其值可以为null //private int ...

  9. DataGridView 的单元格的边框、 网格线样式的设定

    1) DataGridView 的边框线样式的设定DataGridView 的边框线的样式是通过 DataGridView.BorderStyle 属性来设定的. BorderStyle 属性设定值是 ...

随机推荐

  1. springBoot(3)---目录结构,文件上传

    目录结构,文件上传 一.目录结构 1.目录讲解 src/main/java:存放代码      src/main/resources                   static: 存放静态文件, ...

  2. 小问题填坑,关于obj.x和obj["x"]

    之前在看对象的api中for in函数时,有一个地方让我略有疑惑: var obj={ x:100, y:200, z:300 }; for(var key in obj){ if(obj.hasOw ...

  3. 2015 CALLED THE INTERFACE OF 2014

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. ”Hi , Happy New Year.Wr ...

  4. Python快速学习10: 循环的对象及设计 (生活的规律)

    前言 系列文章:[传送门] 生活逐渐规律,按时睡觉.今天写博客,明天补时间看会书.慢慢的时间很珍惜 我很喜欢! 时钟就像个循环体,我们将它融入生活. 正文 循环对象的并不是随着Python的诞生就存在 ...

  5. leetcode — add-binary

    /** * Source : https://oj.leetcode.com/problems/add-binary/ * * * Given two binary strings, return t ...

  6. 基于redis的分布式锁实现

    1.分布式锁介绍 在计算机系统中,锁作为一种控制并发的机制无处不在. 单机环境下,操作系统能够在进程或线程之间通过本地的锁来控制并发程序的行为.而在如今的大型复杂系统中,通常采用的是分布式架构提供服务 ...

  7. PHP中的加强型接口Traits

    接口是对多重继承的一种变相实现, Traits可以被视为一种加强型的接口.   先来看如下代码 trait Hello { private $name = 'chenqionghe'; public ...

  8. 在vue中配置flow类型检查

    flow中文文档:https://zhenyong.github.io/flowtype/docs/objects.html#_ 1.安装flow npm install --save-dev flo ...

  9. C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等)

    获取随机数 举例:0-9 Random random = new Random(); int j = random.Next(0, 9); 0.1两个值被取值的概率相等 int a = Math.Ab ...

  10. 【转载】IIS报错不是有效的Win32应用程序

    今天在IIS中部署ASP.NET网站后,访问网站报错,提示信息为:未能加载文件或程序集XXX.dll或它的某一个依赖项,不是有效的Win32应用程序(异常来至HRESULT:0x800700C1).通 ...