c# datagridview基本操作,包括行拖拽,添加自定义行列。

项目场景:

这段代码定义了一个名为 ucDatagridviewHelper 的用户控件(UserControl),该控件包含了一个 DataGridView 控件和一些其他功能。

这段代码的主要部分:

构造函数:在构造函数中,初始化了用户控件的一些属性,设置了控件的样式以减少闪烁,订阅了 DataGridView 的一些事件(例如 MouseDown、DragOver、DragDrop 等),并且设置了双缓冲以优化性能。

MouseDown 事件处理程序:当鼠标按下时,如果是中键(MouseButtons.Middle),则获取鼠标点击的行和列索引,如果列索引为0,则将该行设置为拖动的行(draggingRow),并且开始拖拽操作。

DragOver 事件处理程序:处理拖放过程中的事件,设置拖放操作的效果为移动。

DragDrop 事件处理程序:处理拖放操作完成后的事件,获取拖放的目标行的索引,并将拖动的行插入到目标行的位置。

ProtocolParas 属性:该属性是一个类(Fox_Inverter_Remote_Protocol.ProtocolPara)的实例,用于管理协议参数。通过该属性的 get 和 set 方法,可以获取和设置 DataGridView 的数据源,并根据协议参数初始化 DataGridView。

cmb_op_SelectedIndexChanged 方法:根据不同的操作类型,显示或隐藏 DataGridView 的某些列。

InitialDatatable 方法:根据传入的故障信息列表,初始化 DataGridView 控件。该方法添加了 DataGridView 的列,并根据不同的类型设置列的可见性。然后,根据故障信息列表添加了 DataGridView 的行,并为每一行设置了单元格的值。

dataGridView1_CellMouseDoubleClick 事件处理程序:处理 DataGridView 单元格的双击事件。如果双击的是第5列(Address 列),则自动生成连续地址,并调用委托 UpdateAddress 更新地址。如果双击的是第7列(Value 列),则弹出一个富文本编辑器窗口,编辑单元格的值。

    public class ProtocolPara{/// <summary>/// 0 片读片写  1  片读单写   3  单读单写/// </summary>public int OperateMethod { get; set; }public string  BlockName { get; set; }public List<string[]> Description { get; set; } = new List<string[]>();public UInt16 Address { get; set; }public UInt16 Length { get; set; }}public partial class ucDatagridviewHelper : UserControl{public ucDatagridviewHelper(){InitializeComponent();SetStyle(ControlStyles.Selectable, true);SetStyle(ControlStyles.AllPaintingInWmPaint, true);//忽略窗口消息,减少闪烁SetStyle(ControlStyles.OptimizedDoubleBuffer, true);//绘制到缓冲区,减少闪烁SetStyle(ControlStyles.UserPaint, true);//控件由其自身而不是操作系统绘制SetStyle(ControlStyles.ResizeRedraw, true);//控件调整其大小时重绘dataGridView1.RowPostPaint += dataGridView1_RowPostPaint_1;dataGridView1.MouseDown += DataGridView1_MouseDown;dataGridView1.DragOver += DataGridView1_DragOver;dataGridView1.DragDrop += DataGridView1_DragDrop;Type dgvType = dataGridView1.GetType();PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);pi.SetValue(dataGridView1, true, null);dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;}public event Action<int> UpdateAddress;void EnableDgv(DataGridView dgv,bool flag){dgv.AllowUserToAddRows = flag;dgv.AllowUserToResizeRows = flag;dgv.AllowUserToDeleteRows = flag;dgv.AllowUserToOrderColumns = flag;dgv.AllowUserToResizeColumns = flag;}private DataGridViewRow draggingRow;private void DataGridView1_MouseDown(object sender, MouseEventArgs e){dataGridView1.AllowDrop = true;if (e.Button == MouseButtons.Middle){int rowIndex = dataGridView1.HitTest(e.X, e.Y).RowIndex;int colIndex = dataGridView1.HitTest(e.X, e.Y).ColumnIndex;if (rowIndex >= 0&&colIndex==0){draggingRow = dataGridView1.Rows[rowIndex];dataGridView1.DoDragDrop(draggingRow, DragDropEffects.Move);}}}private void DataGridView1_DragOver(object sender, DragEventArgs e){e.Effect = DragDropEffects.Move;}private void DataGridView1_DragDrop(object sender, DragEventArgs e){int rowIndex = dataGridView1.HitTest(dataGridView1.PointToClient(new System.Drawing.Point(e.X, e.Y)).X, dataGridView1.PointToClient(new System.Drawing.Point(e.X, e.Y)).Y).RowIndex;if (rowIndex >= 0){dataGridView1.Rows.Remove(draggingRow);dataGridView1.Rows.Insert(rowIndex, draggingRow);}dataGridView1.AllowDrop = false;}Fox_Inverter_Remote_Protocol.ProtocolPara _ProtocolParas;public Fox_Inverter_Remote_Protocol.ProtocolPara ProtocolParas{get{List<string[]> lst = new List<string[]>();for (int i = 0; i < dataGridView1.Rows.Count; i++){string[] des = new string[dataGridView1.Columns.Count];for (int j = 0; j < dataGridView1.Columns.Count; j++){des[j] = dataGridView1.Rows[i].Cells[j].Value.ToString();}lst.Add(des);}if(dataGridView1.Rows.Count>0)_ProtocolParas.Description = lst;return _ProtocolParas;}set{_ProtocolParas = value;if (_ProtocolParas != null && _ProtocolParas.Description != null){this.dataGridView1.Columns.Clear();this.dataGridView1.Rows.Clear();// 0 片读片写  1  片读单写   3  单读单写if (_ProtocolParas.OperateMethod == 0){InitialDatatable(this.dataGridView1, _ProtocolParas.Description, 0);}else if (ProtocolParas.OperateMethod == 1){InitialDatatable(this.dataGridView1, _ProtocolParas.Description, 1);}else if (ProtocolParas.OperateMethod == 2){InitialDatatable(this.dataGridView1, _ProtocolParas.Description, 2);}else if (ProtocolParas.OperateMethod == 3){InitialDatatable(this.dataGridView1, _ProtocolParas.Description, 3);}}}}public void cmb_op_SelectedIndexChanged(int type){if (dataGridView1.Columns.Count > 7){if (type == 0){dataGridView1.Columns[8].Visible = false;dataGridView1.Columns[9].Visible = false;}else if (type == 1){dataGridView1.Columns[8].Visible = true;dataGridView1.Columns[9].Visible = false;}else if (type == 2){dataGridView1.Columns[8].Visible = true;dataGridView1.Columns[9].Visible = true;}}}#region Initial      void InitialDatatable(DataGridView dgv, List<string[]> FaultMessage, int type){dgv.Columns.Add(column_addTextBox("Desc"));dgv.Columns.Add(column_addTextBox("RW"));dgv.Columns.Add(column_addTextBox("Type"));dgv.Columns.Add(column_addTextBox("Unit"));dgv.Columns.Add(column_addTextBox("gain"));dgv.Columns.Add(column_addTextBox("Address"));dgv.Columns.Add(column_addTextBox("Registeres"));dgv.Columns.Add(column_addTextBox("Value"));dgv.Columns.Add(column_addbutton("Write"));dgv.Columns.Add(column_addbutton("Read"));int i = 0;dgv.Columns[i++].FillWeight = 20;dgv.Columns[i++].FillWeight = 10;dgv.Columns[i++].FillWeight = 8;dgv.Columns[i++].FillWeight = 10;dgv.Columns[i++].FillWeight = 10;dgv.Columns[i++].FillWeight = 10;dgv.Columns[i++].FillWeight = 10;dgv.Columns[i++].FillWeight = 10;dgv.Columns[i++].FillWeight = 6;dgv.Columns[i++].FillWeight = 6;if (type == 0){dgv.Columns[8].Visible = false;dgv.Columns[9].Visible = false;}else if (type == 1){dgv.Columns[8].Visible = true;dgv.Columns[9].Visible = false;}else if (type == 2){dgv.Columns[8].Visible = true;dgv.Columns[9].Visible = true;}else{//btn_write.Visible = true;//btn_read.Visible = true;//dataGridView1.Columns[8].Visible = true;//dataGridView1.Columns[8].Visible = true;}for (int h = 0; h < dgv.Columns.Count; h++){dgv.Columns[h].SortMode = DataGridViewColumnSortMode.NotSortable;}for (int j = 0; j < FaultMessage.Count; j++){string[] msg = FaultMessage[j];dgv.Rows.Add();int index = 0;dgv.Rows[j].Cells[index].Value = msg[index];index++;dgv.Rows[j].Cells[index].Value = msg[index];index++;dgv.Rows[j].Cells[index].Value = msg[index];index++;dgv.Rows[j].Cells[index].Value = msg[index];index++;dgv.Rows[j].Cells[index].Value = msg[index];index++;dgv.Rows[j].Cells[index].Value = msg[index];index++;dgv.Rows[j].Cells[index].Value = msg[index];index++;int tempindex = index >= msg.Length ? (msg.Length - 1) : index;string[] jgStr = msg[tempindex].Split('/');if (jgStr.Length > 1){//DataGridViewComboBoxCell cbCell = new DataGridViewComboBoxCell();//cbCell.DataSource = jgStr;//cbCell.Value = jgStr[0];//cbCell.Style.BackColor = Color.LightBlue;//cbCell.Style.ForeColor = Color.LightBlue;dgv.Rows[j].Cells[index].Value = msg[index];}else{//dgv.Rows[j].Cells[index].Style.BackColor = Color.LightGray;dgv.Rows[j].Cells[index].Value = "0";}dgv.Rows[j].DefaultCellStyle.BackColor = Color.LightGray;dgv.Rows[j].Cells[8].Value = "Write";dgv.Rows[j].Cells[9].Value = "Read";}EnableDgv(dgv, false);//dgv.RowTemplate.Height = 10;//dgv.RowHeadersVisible = false;dgv.RowHeadersWidth = 30;//dgv.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellContentClick);}private void dataGridView1_RowPostPaint_1(object sender, DataGridViewRowPostPaintEventArgs e){Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, this.dataGridView1.RowHeadersWidth - 4, e.RowBounds.Height);TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), this.dataGridView1.RowHeadersDefaultCellStyle.Font,rectangle, this.dataGridView1.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right);}int column_key = 0;private DataGridViewTextBoxColumn column_addTextBox(string name){DataGridViewTextBoxColumn txtClum = new DataGridViewTextBoxColumn();txtClum.DataPropertyName = "txt" + column_key++.ToString();txtClum.Name = "txt" + column_key++.ToString();txtClum.HeaderText = name;return txtClum;}private DataGridViewButtonColumn column_addbutton(string name){DataGridViewButtonColumn txtClum = new DataGridViewButtonColumn();txtClum.DataPropertyName = "txt" + column_key++.ToString();txtClum.Name = "txt" + column_key++.ToString();txtClum.HeaderText = name;//txtClum.DisplayIndex = 5;return txtClum;}private DataGridViewCheckBoxColumn column_addCheckBox(string name){DataGridViewCheckBoxColumn txtClum = new DataGridViewCheckBoxColumn();txtClum.DataPropertyName = "txt" + column_key++.ToString();txtClum.Name = "txt" + column_key++.ToString();txtClum.HeaderText = name;return txtClum;}private DataGridViewComboBoxColumn column_addComboBox(string name, string[] strname){DataGridViewComboBoxColumn txtClum = new DataGridViewComboBoxColumn();txtClum.DataPropertyName = "txt" + column_key++.ToString();txtClum.Name = "txt" + column_key++.ToString();txtClum.HeaderText = name;txtClum.Items.AddRange(strname);//txtClum.DisplayIndex = 1;return txtClum;}#endregionprivate void addToolStripMenuItem_Click(object sender, EventArgs e){int i = dataGridView1.SelectedCells[0].RowIndex;DataGridViewRow dr = new DataGridViewRow();dr.CreateCells(this.dataGridView1);for (int j = 0; j < dataGridView1.Rows[i].Cells.Count; j++){dr.Cells[j].Value = dataGridView1.Rows[i].Cells[j].Value;}this.dataGridView1.Rows.Insert(i, dr);}private void deleteToolStripMenuItem_Click(object sender, EventArgs e){int i = dataGridView1.SelectedCells[0].RowIndex;dataGridView1.Rows.RemoveAt(i);}private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e){dataGridView1.ClearSelection();if (e.ColumnIndex == 5){for (int i = 0; i < dataGridView1.Rows.Count; i++){dataGridView1.Rows[i].Cells[e.ColumnIndex].Value = Convert.ToUInt16(dataGridView1.Rows[0].Cells[e.ColumnIndex].Value) + i;}UpdateAddress?.Invoke(Convert.ToUInt16(dataGridView1.Rows[0].Cells[e.ColumnIndex].Value));}else if (e.ColumnIndex == 7){if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString().Length > 15){FrmRichBoxEditor childForm = new FrmRichBoxEditor(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());int parentFormX = this.Location.X;int parentFormY = this.Location.Y;int parentFormWidth = this.Width;int parentFormHeight = this.Height;int childFormWidth = childForm.Width;int childFormHeight = childForm.Height;int childFormX = parentFormX + (parentFormWidth - childFormWidth) / 2;int childFormY = parentFormY + (parentFormHeight - childFormHeight) / 2;// 设置子窗体的位置childForm.StartPosition = FormStartPosition.Manual;childForm.Location = new System.Drawing.Point(childFormX, childFormY);childForm.ShowDialog();dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = childForm.ReValue;}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> grayCode(int n) {vector<int> ret(1 << n);for (int i 0; i < ret.size(); i) {ret[i] (i >> 1) ^ i;}return ret;} };

数据结构--红黑树(RBTree)

一、红黑树概念 1.1 什么是红黑树 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长…

openEuler-22.03-LTS安装opengauss5.0.1(包含cm集群管理)主备

环境说明 openEuler-22.0.3-LTS opengauss5.0.1 安装数据库 安装系统依赖包 yum -y install lksctp* yum -y install psmisc yum -y install bzip2 yum -y install unzip yum -y install gcc yum -y install gcc-c yum -y install perl yum -y install libxml2-devel yum …

前端(包含cocosCreator)开发环节调取后端接口时跨域,解决办法之反向代理

/** eslint-disable */ var http require(http),httpProxy require(http-proxy),HttpProxyRules require(http-proxy-rules);// Set up proxy rules instance var port 9090 var proxyRules new HttpProxyRules({rules: {/api/(.*): https://baidu.com/$1, // 测试环境游戏…

自学VBA 设置单元格文字格式 笔记

一.设定对应单元格对应需要显示的格式 Cells(1, 1).Font.Size 18 字体大小 Cells(1, 2).Font.Color RGB(255, 0, 0) 字体颜色 Cells(1, 3).Font.Name "黑体" 字体类型 Cells(1, 4).Font.Italic True 字体斜体 Cells(1, 5).Font.FontStyle "BOLD"…

ubuntu下gcc编译器的安装

.gcc编译器的安装 一般linux下是覆盖含有的&#xff0c;如果没有执行更新命令 sudo apt update gcc安装成功&#xff0c;可以检查一下版本 可以看出我的gcc是9.4.0版本的

验证torch.nn.Conv2d

import os import cv2 import torch import numpy as np import random import cv2 as cv from matplotlib import pyplot as pltdef f_VerifyConv2D():"""验证torch.nn.Conv2d&#xff0c; 并将输入数据及权重保存到txt文件中"""x torch.randn…

SpringBoot环境隔离Profiles

前言 通常我们开发不可能只有一个生产环境&#xff0c;还会有其它的开发&#xff0c;测试&#xff0c;预发布环境等等。为了更好的管理每个环境的配置项&#xff0c;springboot也提供了对应的环境隔离的方法。 直接上干货 知识点 激活环境方法 1&#xff0c;在application…

专用设备制造业供应商收发文件,有什么专业而轻便的方式吗?

专用设备制造业的特点包括&#xff1a;门类广、跨度大、科技含量高。它主要生产的是国民经济各部门&#xff08;包括采掘、化工、冶炼、能源、医疗卫生、环保等&#xff09;所急需的重大成套设备&#xff0c;例如矿产资源井采及露天开采设备、大型火电、水电、核电成套设备、石…

教育行业文本短信VS视频短信VS语音短信哪个好?

在教育行业中&#xff0c;文本短信、视频短信和语音短信各有其优势&#xff0c;选择哪种方式更好取决于具体的应用场景和目标。 文本短信的优势在于&#xff1a; 1.简洁明了&#xff1a;能够快速、直接地传递信息&#xff0c;对于需要快速通知或提醒的场景非常适用。 …

通过内网穿透免费部署我们的springboot+vue项目 实现跟服务器一样的效果

前文讲到通过内网穿透能够实现远程访问个人电脑的静态资源。本文将讲解通过内网穿透实现远程访问本地的项目&#xff0c;实现跟部署到服务器一样的效果&#xff1a;前文链接&#xff1a;通过内网穿透实现远程访问个人电脑资源详细过程&#xff08;免费&#xff09;&#xff08;…

深度学习之卷积神经网络理论基础

深度学习之卷积神经网络理论基础 卷积层的操作&#xff08;Convolutional layer&#xff09; 在提出卷积层的概念之前首先引入图像识别的特点 图像识别的特点 特征具有局部性&#xff1a;老虎重要特征“王字”仅出现在头部区域特征可能出现在任何位置下采样图像&#xff0c…

Python 小抄

Python 备忘单 目录 1.语法和空格 2.注释 3.数字和运算 4.字符串处理 5.列表、元组和字典 6.JSON 7.循环 8.文件处理 9.函数 10.处理日期时间 11.NumPy 12.Pandas 要运行单元格&#xff0c;请按 ShiftEnter 或单击页面顶部的 Run&#xff08;运行&#xff09;。 1.语法和空格…

三种方法进行跨服务器文件传输

今天需要在一个centOS服务器上编译一个工具, 我的本地主机是ubuntu, 但是由于服务器是合规环境, 没有文件传输的接口, 也不能访问github等外网, 所以很多依赖只能下载到ubuntu然后在想办法搞到服务器上. 这种场景有三种简单有用的办法, 整理一下. 方法一: 把主机配置成http ser…

6---Linux下版本控制器Git的知识点

一、Linux之父与Git的故事&#xff1a; Linux之父叫做“Linus Torvalds”&#xff0c;我们简称为雷纳斯。Linux是开源项目&#xff0c;所以在Linux的早期开发中&#xff0c;许多世界各地的能力各异的程序员都参与到Linux的项目开发中。那时&#xff0c;雷纳斯每天都会收到许许…

用ntpdate同步时间出现问题

1. 使用ntpdate同步 [rootnode ~]# ntpdate ntp.aliyun.com4 Aug 00:07:17 ntpdate[20924]: adjust time server 203.107.6.88 offset -0.001543 sec2. 查看时间 [rootnode ~]# date Thu Aug 4 00:07:46 CST 20223. 如果时间对不上 报错信息 cna02:~ # ntpdate ntp1.aliyu…

mysql社区版最多支持多个连接并发

MySQL社区版对于并发连接数的支持并没有一个固定的上限&#xff0c;它实际上取决于多个因素&#xff0c;包括服务器的硬件配置、MySQL的配置参数以及应用程序的设计等。 硬件配置&#xff1a;服务器的CPU、内存和磁盘I/O等硬件资源会直接影响MySQL可以处理的并发连接数。例如&a…

VMware Fusion 13.5.2 for Mac 发布,产品订阅模式首个重大变更

VMware Fusion 13.5.2 for Mac 发布&#xff0c;产品订阅模式首个重大变更 适用于基于 Intel 处理器和搭载 Apple 芯片的 Mac 的桌面虚拟化软件 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-fusion-13/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留…

vue props接收组件数据(类型配置)

"props"接收的常见传参类型有以下几种&#xff1a;String&#xff1a;字符串类型&#xff0c;Number&#xff1a;数字类型&#xff0c;Boolean&#xff1a;布尔类型&#xff0c;Array&#xff1a;数组类型&#xff0c;Object&#xff1a;对象类型&#xff0c;Date&am…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《集装箱海港级联物流-能源耦合系统协同优化方法 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…