C# 学习笔记(14)自己的串口助手----多行发送

在上一篇串口助手的基础上实现多行发送功能。多行发送使用了DataGridView控件实现,打算是可以自由添加行数,但是有一个问题,DataGridView表格编辑的时候需要鼠标点两次(第一次选中单元格,第二次才进入编辑状态),编辑完之后需要点别的地方编辑内容才可以生效,导致列表内的checkBox控件勾选不是很方便,而且在鼠标快速单击发送按键时,不能全部响应(有可能快速点两次,但是只发送了一次),不过总统来说还可以凑合用,如果有更好的实现方式,可以教教博主。

DataTable和DataGridView

DataTable是内存中的一个表数据集,DataGridView可以看成一张表,里面包涵表数据集和表的格式信息。当DataGridView的数据集由DataTable提供时,DataGridView可以看作是一个将DataTable可视化的一个控件。

  1. 绑定列数据

简单来说就是将DataGridView的数据源指定为 DataTable的列名


2. 将DataGridView的数据源指定为 DataTable

private DataTable dataTable = new DataTable("CMD");
if (dataTable.Columns.Count == 0)
{for (int i = 0; i < DataGridViewCmd.Columns.Count; i++){dataTable.Columns.Add("DataTable" + DataGridViewCmd.Columns[i].Name);}dataTable.Rows.Add("0");}
//绑定数据源
DataGridViewCmd.DataSource = dataTable;

经过上面两步, DataTable和DataGridView绑定在一起的列数据就互通了,修改DataTable的列数据,DataGridView的对应列数据也会发送改变,同样修改DataGridView数据,DataTable数据也会跟着改变。

序列化和反序列化

多命令行数据怎么储存?我们肯定不想辛辛苦苦编辑的多命令行参数因为软件关闭就消失了。这些参数个数不确定因此不能像上一篇的配置参数一样存放在setting文件中,这时可以通过序列化将DataTable序列化成xml文件,存放在磁盘中。当然了,其实也可以直接序列化DataGridView,这样连DataTable都可以不要了

/// <summary>
/// 序列化
/// </summary>
public static class MySerializeToXml
{/// <summary>/// 将对象序列化为XML数据/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="obj">对象</param>/// <param name="filePath">xml存放路径</param>public static void SerializeToXml<T>(T obj, string filePath){XmlSerializer xs = new XmlSerializer(obj.GetType());using(Stream fStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)){xs.Serialize(fStream, obj);}}/// <summary>/// 将XML数据反序列化为指定类型对象/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="filePath">xml文件存放路径</param>/// <returns></returns>public static T DeserializeWithXml<T>(string filePath){object obj = new object();XmlSerializer xs = new XmlSerializer(typeof(T));using(Stream fStream = File.OpenRead(filePath)){obj = xs.Deserialize(fStream);}return (T)obj;}
}

DataGridView双缓冲

当DataGridView行数和列数很多时,如果滚动滚动条,肉眼可见的刷新闪烁,用户体验不好,这时可以通过开启双缓冲来解决闪烁问题,其实和嵌入式GUI的emWin的内存设备类似,就是将每修改一个单元格位置就刷新一次屏幕改成每修改一个单元格位置就将修改现存中的数据,当单元格都修改完毕了,再将现存一次性加载到屏幕,这样就不会感觉到闪烁

public static class MyDataGridViewDoubleBuffer
{///   <summary>///   将给定的DataGridView设置双缓冲///   </summary>///   <param name="datagrid"> 给定的DataGridView </param>///   <param name="opened"> 设置为ture即打开双缓冲 </param>public static void SetDoubleBuffered(this DataGridView datagrid, bool opened){var dgvType = datagrid.GetType();var properInfo = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);properInfo.SetValue(datagrid, opened, null);}
}

其他的发送什么的和上一篇基本类似,自行看源码即可
源码 https://github.com/mian2018/CSharp_COM

C# 学习笔记(14)自己的串口助手----多行发送相关推荐

  1. STM32学习笔记(5) 串口通讯-接收与发送

    一 通信的基本概念 串口并行与串行 数电课讲过,并行速度快但占用的门电路多,耗费空间 串行速度慢但节约空间 数据通信方向 全双工:TX,RX同时收发数据 半双工:不能同时收发数据,可分时收发数据 单工 ...

  2. OpenHarmony学习笔记——Hi3861+ASR-01的语音识别助手

    文章目录 前言 Hi3861的UART与PWM简介 UART简介 PWM ASR-01离线语音识别 天问官方介绍 硬件连接 软件部分 ASR-01代码 Hi3861端代码 初始化资源 串口指令识别 效 ...

  3. node.js学习笔记14—微型社交网站

    node.js学习笔记14-微型社交网站 1.功能分析 微博是以用户为中心,因此需要有注册和登录功能. 微博最核心的功能是信息的发表,这个功能包括许多方面,包括:数据库访问,前端显示等. 一个完整的微 ...

  4. Linux学习笔记14

    Linux学习笔记14 Linux学习笔记14 DNS服务搭建 基本介绍 使用bind搭建dns服务 增加一个域名zone 配置DNS转发 配置主从 测试主从同步 后续课程 DNS服务搭建 基本介绍 ...

  5. 【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计

    [转] C#学习笔记14--Trace.Debug和TraceSource的使用以及日志设计 Trace.Debug和TraceSource的使用以及日志设计   .NET Framework 命名空 ...

  6. 台大李宏毅Machine Learning 2017Fall学习笔记 (14)Unsupervised Learning:Linear Dimension Reduction

    台大李宏毅Machine Learning 2017Fall学习笔记 (14)Unsupervised Learning:Linear Dimension Reduction 本博客整理自: http ...

  7. 华为HCIA-datacom 学习笔记14——WLAN概述

    华为HCIA-datacom 学习笔记14--WLAN概述 1.WLAN(无线局域网) 通过无线技术构造的无线局域网络.WLAN广义上是指以无线电波.激光.红外线等无线信号代替有线局域网中的部分或全部 ...

  8. 【白帽子学习笔记14】SQL注入常用语句

    [白帽子学习笔记14]SQL注入常用语句 目前网站中使用的最多的数据库要算是 ACCESS.SQL Server(MSSQL).MySQL 这三个了,所以这里的手工注入,我就以他们三个数据库来分成三 ...

  9. Android-Framework学习笔记(九)—— Broadcast的注册、发送和接收过程

    系列文章 Android-Framework学习笔记(一)-- Android系统架构 Android-Framework学习笔记(二)-- Zygote进程启动过程 Android-Framewor ...

最新文章

  1. HTML meta标签总结
  2. spring中是如何解析@Profile注解的
  3. WebDev.WebServer 学习
  4. 怎么避免options请求_和上级沟通的正确打开方式:3种技巧,轻松让领导答应你的请求...
  5. C++执行shell命令
  6. vue微信扫码登录过程
  7. 计算机基础之二进制详解(二)
  8. [ICPC Asia Nanjing 2019] Holy Grail (spfa最短路)
  9. 如何轻量化深度学习模型
  10. sqlserver Sum求和float类型 数据不准问题
  11. 0x32 数学知识-约数
  12. 开源!用于3D激光雷达SLAM回环检测的实时词袋模型BoW3D
  13. 为什么我们看到镜子中的自己是左右颠倒的
  14. 管理类联考笔试还是计算机考,管理类联考笔试究竟难在哪儿?
  15. sofa server端处理client端请求流程
  16. CASE WHEN 和CASE ** WHEN
  17. 3GPP TR 38.885 Study on NR Vehicle-to-Everything (V2X) (Release 16)
  18. 解读 | CSA 软件定义边界(SDP)标准规范 2.0 VS 1.0
  19. 百度 Google 全国 地图 火星坐标 产生原因(记录)
  20. [MIT]微积分重点 第十一课 对数函数和反三角函数的导数 学习笔记

热门文章

  1. HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法
  2. CAD—定义委托异步添加实体
  3. 正则表达式 boost regexp的安装
  4. 【Vegas原创】GridView设定DataFormatString属性失效的解决方法
  5. 高通、猎户机型Android典型bootloader分析
  6. WINCE的内存配置-config.bib文件的解析
  7. TS2003基于触摸屏的应用
  8. jdbc mysql 自动重连_JDBC实现Mysql自动重连机制的方法详解
  9. sql datetime字段 取年月日_如何去写一手好的SQL ?
  10. Linux环境搭建 | 手把手教你配置Linux虚拟机