198366809 发表于 2021-8-3 19:43:52

C#实例:datagridview单元格合并

来源:zls365 CSharp编程大全原文:https://mp.weixin.qq.com/s/2pkeZ6ew-7PhlRAUBeqKZw这是替C#微信交流群群友做的一个小实例,目的就是在datagridview选择对应行以后,点击button后获取对应行的ip,并执行相应的操作,其实我觉得这样的话button没必要非放置到datagridview里面的!但是为了满足群友的需求,还是这么做了。先看一下运行效果:https://p9.toutiaoimg.com/img/pgc-image/ff6f45e6fd534adfb415cff48b183b48~tplv-tt-shrink:640:0.image

1. DataGridView 添加一列checkbox

DataGridViewCheckBoxColumn newColumn = new DataGridViewCheckBoxColumn();newColumn.HeaderText = "选择";dataGridView1.Columns.Add(newColumn);


这样添加的列是放在最后一列,也许你希望它在其它列,例如第二列,那么可以:
dataGridView1.Columns.Insert(1, newColumn);
2. DataGridView 添加一个button
btn1.Name = "btnRun";btn1.Text = "Run";btn1.Visible = true;btn1.Location = new Point(550, 80);btn1.Size = new Size(80, 50);btn1.Parent = this;btn1.Click += new EventHandler(btn1_Click);//this.Controls.Add(btn1);dataGridView1.Controls.Add(btn1);
3. datagridview合并单元格,详见完整代码.
完整代码:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;



namespace WindowsFormsApp28{    public partial class Form1 : Form    {      public Form1()      {            InitializeComponent();      }      Button btn1 = new Button();      private void Form1_Load(object sender, EventArgs e)      {            DataTable dt = new DataTable();            dt.Columns.Add("IP");            dt.Columns.Add("Option");            dt.Columns.Add("button");            dt.Rows.Add("192.168.1.10", null, null);            dt.Rows.Add("192.168.1.11", null, null);            dt.Rows.Add("192.168.1.12", null, null);            dt.Rows.Add("192.168.1.13", null, null);            dt.Rows.Add("192.168.1.14", null, null);            dt.Rows.Add("192.168.1.15", null, null);            dt.Rows.Add("192.168.1.16", null, null);            dt.Rows.Add("192.168.1.17", null, null);            dt.Rows.Add("192.168.1.18", null, null);            dt.Rows.Add("192.168.1.19", null, null);            dataGridView1.DataSource = dt;

            //var list = new List<Object>();            //list.Add(new { IP = "192.168.1.10", Option = "null", button = "null" });            //list.Add(new { IP = "192.168.1.11", Option = "null", button = "null" });            //list.Add(new { IP = "192.168.1.12", Option = "null", button = "null" });            //list.Add(new { IP = "192.168.1.13", Option = "null", button = "null" });            //list.Add(new { IP = "192.168.1.14", Option = "null", button = "null" });            //list.Add(new { IP = "192.168.1.15", Option = "null", button = "null" });            //dataGridView1.DataSource = list;

            DataGridViewCheckBoxColumn newColumn1 = new DataGridViewCheckBoxColumn();            newColumn1.HeaderText = "选择";            //dataGridView1.Columns.Add(newColumn);            dataGridView1.Columns.Insert(3, newColumn1);            DataGridViewButtonColumn newColumn2 = new DataGridViewButtonColumn();            newColumn2.HeaderText = "控件";            //dataGridView1.Columns.Add(newColumn);            dataGridView1.Columns.Insert(4, newColumn2);

            dt.Columns.Add("action");            dataGridView1.Rows.Cells.Value = true;            //dataGridView1.Rows.Cells.Value = true;

                     btn1.Name = "btnRun";            btn1.Text = "Run";            btn1.Visible = true;            btn1.Location = new Point(550, 80);            btn1.Size = new Size(80, 50);            btn1.Parent = this;            btn1.Click += new EventHandler(btn1_Click);            //this.Controls.Add(btn1);            dataGridView1.Controls.Add(btn1);

      }      private void btn1_Click(object sender, EventArgs e)      {

            // MessageBox.Show("123");            for (int i = 0; i < dataGridView1.Rows.Count; i++)            {                string otherValue = dataGridView1.Rows.Cells.EditedFormattedValue.ToString();                if (otherValue == "True")                  MessageBox.Show(dataGridView1.Rows.Cells.Value.ToString());

            }      }



      private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)      {            if (e.ColumnIndex == dataGridView1.Columns.Index)                MessageBox.Show(dataGridView1.Rows.Cells.Value.ToString());

      }      /// <summary>      /// 将当前单元格中的更改提交到数据缓存,但不结束编辑模式,及时获得其状态是选中还是未选中          /// </summary>      /// <param name="sender"></param>      /// <param name="e"></param>      private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)      {            if (dataGridView1.IsCurrentCellDirty)            {                dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);            }

      }

      private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)      {

            try            {                if (dataGridView1.Rows.Count > 0)                {                  int rowIndex = dataGridView1.CurrentCell.RowIndex;                  int colIndex = dataGridView1.CurrentCell.ColumnIndex;                  if (colIndex == 0) //第一列                  {                        string _selectValue = dataGridView1.CurrentCell.EditedFormattedValue.ToString();                        if (_selectValue == "True")                        {                            for (int i = 0; i < dataGridView1.Rows.Count; i++)                            {                              if (i != rowIndex)                              {                                    string otherValue = dataGridView1.Rows.Cells.EditedFormattedValue.ToString();                                    if (otherValue == "True")                                    {                                        ((DataGridViewCheckBoxCell)dataGridView1.Rows.Cells).Value = false;                                    }                                                                }                            }                        }                  }

                }

            }            catch (Exception ex)            { }      }

      private void button1_Click(object sender, EventArgs e)      {

      }

      private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)      {            // 对第5列相同单元格进行合并             if (e.ColumnIndex == 5 && e.RowIndex != -1)            {                using                (                Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),                backColorBrush = new SolidBrush(e.CellStyle.BackColor)                )                {                  using (Pen gridLinePen = new Pen(gridBrush))                  {                        // 清除单元格                         e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

                        // 画 Grid 边线(仅画单元格的底边线和右边线)                         // 如果下一行和当前行的数据不同,则在当前的单元格画一条底边线                         if (e.RowIndex < dataGridView1.Rows.Count - 1 &&                        dataGridView1.Rows.Cells.Value.ToString() !=                        e.Value.ToString())                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left + 2,                            e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,                            e.CellBounds.Bottom - 1);                        //画最后一条记录的底线                         if (e.RowIndex == dataGridView1.Rows.Count - 1)                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left + 2,                            e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,                            e.CellBounds.Bottom - 1);                        // 画右边线                         e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,                        e.CellBounds.Top, e.CellBounds.Right - 1,                        e.CellBounds.Bottom);

                        // 画左边线                         e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left ,                        e.CellBounds.Top, e.CellBounds.Left ,                        e.CellBounds.Bottom);

                        // 画(填写)单元格内容,相同的内容的单元格只填写第一个                         if (e.Value != null)                        {                            if (e.RowIndex > 0 &&                            dataGridView1.Rows.Cells.Value.ToString() ==                            e.Value.ToString())                            {

                            }                            else                            {                              //e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,                              //Brushes.Black, e.CellBounds.X + 2,                              //e.CellBounds.Y + 5, StringFormat.GenericDefault);                            }                        }                        e.Handled = true;                  }                }               

            }      }

      

国栋 发表于 2021-8-3 19:43:53

加油,加油,不要沉下去,我是最热贴

Cityhunter飞 发表于 2021-8-5 17:22:50

楼主加油,我们都看好你哦。

liminfu 发表于 2025-11-13 02:20:31

理性围观,感觉大家说的都有道理~

wangzhaolost 发表于 2025-11-15 08:07:03

谁懂啊!这内容我能循环看十遍

380992141 发表于 2025-11-15 08:48:05

这逻辑绝了,分析得太到位了吧

liweifan_713 发表于 2025-11-15 12:16:06

水贴也要有仪式感,我先来打卡~

一杯清茶 发表于 2025-11-15 12:20:20

笑不活了,评论区比正文还精彩!

wangyipibb 发表于 2025-11-15 12:22:27

学到了学到了,这波分享太实用啦!

gojava 发表于 2025-11-15 12:27:00

哈哈哈哈笑不活,楼主这脑洞绝了!
页: [1] 2
查看完整版本: C#实例:datagridview单元格合并