C# 自定义组件实现表格的多层表头功能
在 WinForms 中,想要实现多层表头功能时,DataGridView 本身并不支持该功能,而且又不希望使用第三方控件,因此选择通过自定义组件来实现这一需求。
首先,展示一下程序实现的效果:
接下来,创建一个继承自 DataGridView
的自定义组件。代码如下:
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Drawing;namespace CellPaintingDataGridView
{public partial class TreeHeadDataGridView : DataGridView{private TreeView treeView1=new TreeView();public TreeHeadDataGridView(){InitializeComponent();}public TreeHeadDataGridView(IContainer container){container.Add(this);InitializeComponent();}[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]public TreeNodeCollection HeadSource{get { return this.treeView1.Nodes; }}private int _cellHeight = 17;private int _columnDeep = 1;[Description("设置或获得合并表头树的深度")]public int ColumnDeep{get{if (this.Columns.Count == 0)_columnDeep = 1;this.ColumnHeadersHeight = _cellHeight * _columnDeep;return _columnDeep;}set{if (value < 1)_columnDeep = 1;else_columnDeep = value;this.ColumnHeadersHeight = _cellHeight * _columnDeep;}}///<summary>///绘制合并表头///</summary>///<param name="node">合并表头节点</param>///<param name="e">绘图参数集</param>///<param name="level">结点深度</param>///<remarks></remarks>public void PaintUnitHeader(TreeNode node, DataGridViewCellPaintingEventArgs e, int level){//根节点时退出递归调用if (level == 0)return;RectangleF uhRectangle;int uhWidth;SolidBrush gridBrush = new SolidBrush(this.GridColor);Pen gridLinePen = new Pen(gridBrush);StringFormat textFormat = new StringFormat();textFormat.Alignment = StringAlignment.Center;uhWidth = GetUnitHeaderWidth(node);//与原贴算法有所区别在这。if (node.Nodes.Count == 0){uhRectangle = new Rectangle(e.CellBounds.Left,e.CellBounds.Top + node.Level * _cellHeight,uhWidth - 1,_cellHeight * (_columnDeep - node.Level) - 1);}else{uhRectangle = new Rectangle(e.CellBounds.Left,e.CellBounds.Top + node.Level * _cellHeight,uhWidth - 1,_cellHeight - 1);}Color backColor = e.CellStyle.BackColor;if (node.BackColor != Color.Empty){backColor = node.BackColor;}SolidBrush backColorBrush = new SolidBrush(backColor);//画矩形e.Graphics.FillRectangle(backColorBrush, uhRectangle);//划底线e.Graphics.DrawLine(gridLinePen, uhRectangle.Left, uhRectangle.Bottom, uhRectangle.Right, uhRectangle.Bottom);//划右端线e.Graphics.DrawLine(gridLinePen, uhRectangle.Right, uhRectangle.Top, uhRectangle.Right, uhRectangle.Bottom);写字段文本Color foreColor = Color.Black;if (node.ForeColor != Color.Empty){foreColor = node.ForeColor;}e.Graphics.DrawString(node.Text, this.Font, new SolidBrush(foreColor), uhRectangle.Left + uhRectangle.Width / 2 -e.Graphics.MeasureString(node.Text, this.Font).Width / 2 - 1, uhRectangle.Top +uhRectangle.Height / 2 - e.Graphics.MeasureString(node.Text, this.Font).Height / 2);递归调用()if (node.PrevNode == null)if (node.Parent != null)PaintUnitHeader(node.Parent, e, level - 1);}/// <summary>/// 获得合并标题字段的宽度/// </summary>/// <param name="node">字段节点</param>/// <returns>字段宽度</returns>/// <remarks></remarks>private int GetUnitHeaderWidth(TreeNode node){//获得非最底层字段的宽度int uhWidth = 0;//获得最底层字段的宽度if (node.Nodes == null)return this.Columns[GetColumnListNodeIndex(node)].Width;if (node.Nodes.Count == 0)return this.Columns[GetColumnListNodeIndex(node)].Width;for (int i = 0; i <= node.Nodes.Count - 1; i++){uhWidth = uhWidth + GetUnitHeaderWidth(node.Nodes[i]);}return uhWidth;}/// <summary>/// 获得底层字段索引/// </summary>/// <param name="node">底层字段节点</param>/// <returns>索引</returns>/// <remarks></remarks>private int GetColumnListNodeIndex(TreeNode node){for (int i = 0; i <= _columnList.Count - 1; i++){if (((TreeNode)_columnList[i]).Equals(node))return i;}return -1;}private List<TreeNode> _columnList = new List<TreeNode>();[Description("最底層結點集合")]public List<TreeNode> NadirColumnList{get{if (this.treeView1 == null)return null;if (this.treeView1.Nodes == null)return null;if (this.treeView1.Nodes.Count == 0)return null;_columnList.Clear();foreach (TreeNode node in this.treeView1.Nodes){//GetNadirColumnNodes(_columnList, node, false);GetNadirColumnNodes(_columnList, node);}return _columnList;}}private void GetNadirColumnNodes(List<TreeNode> alList, TreeNode node){if (node.FirstNode == null){alList.Add(node);}foreach (TreeNode n in node.Nodes){GetNadirColumnNodes(alList, n);}}/// <summary>/// 获得底层字段集合/// </summary>/// <param name="alList">底层字段集合</param>/// <param name="node">字段节点</param>/// <param name="checked">向上搜索与否</param>/// <remarks></remarks>private void GetNadirColumnNodes(List<TreeNode> alList, TreeNode node, Boolean isChecked){if (isChecked == false){if (node.FirstNode == null){alList.Add(node);if (node.NextNode != null){GetNadirColumnNodes(alList, node.NextNode, false);return;}if (node.Parent != null){GetNadirColumnNodes(alList, node.Parent, true);return;}}else{if (node.FirstNode != null){GetNadirColumnNodes(alList, node.FirstNode, false);return;}}}else{if (node.FirstNode == null){return;}else{if (node.NextNode != null){GetNadirColumnNodes(alList, node.NextNode, false);return;}if (node.Parent != null){GetNadirColumnNodes(alList, node.Parent, true);return;}}}}/// <summary>/// 单元格绘制(重写)/// </summary>/// <param name="e"></param>/// <remarks></remarks>protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e){//行标题不重写if (e.ColumnIndex < 0){base.OnCellPainting(e);return;}if (_columnDeep == 1){base.OnCellPainting(e);return;}//绘制表头if (e.RowIndex == -1){PaintUnitHeader((TreeNode)NadirColumnList[e.ColumnIndex], e, _columnDeep);e.Handled = true;}}}
}
完成组件开发后,可以将该控件从工具箱拖入界面,表头的节点设置通过 Designer.cs 中的 "Windows 窗体设计器生成的代码" 实现。我们使用 System.Windows.Forms.TreeNode
来实现父子节点的绑定。示例代码如下:
namespace CellPaintingDataGridView
{partial class Form1{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){this.components = new System.ComponentModel.Container();System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("节点0");System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("节点1-0-0");System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("节点1-0-1");System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("节点1-0", new System.Windows.Forms.TreeNode[] {treeNode2,treeNode3});System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("节点1-1");System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] {treeNode4,treeNode5});System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("节点2-0");System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("节点2-1");System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("节点2-0");System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("节点2", new System.Windows.Forms.TreeNode[] {treeNode7,treeNode8,treeNode9});System.Windows.Forms.TreeNode treeNode11 = new System.Windows.Forms.TreeNode("节点3-0");System.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode("节点3-1");System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("节点3", new System.Windows.Forms.TreeNode[] {treeNode11,treeNode12});this.treeHeadDataGridView1 = new CellPaintingDataGridView.TreeHeadDataGridView(this.components);this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn();this.Column5 = new System.Windows.Forms.DataGridViewTextBoxColumn();this.Column6 = new System.Windows.Forms.DataGridViewTextBoxColumn();this.Column7 = new System.Windows.Forms.DataGridViewTextBoxColumn();this.Column8 = new System.Windows.Forms.DataGridViewTextBoxColumn();this.Column9 = new System.Windows.Forms.DataGridViewTextBoxColumn();((System.ComponentModel.ISupportInitialize)(this.treeHeadDataGridView1)).BeginInit();this.SuspendLayout();// // treeHeadDataGridView1// this.treeHeadDataGridView1.ColumnDeep = 3;this.treeHeadDataGridView1.ColumnHeadersHeight = 51;this.treeHeadDataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;this.treeHeadDataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {this.Column1,this.Column2,this.Column3,this.Column4,this.Column5,this.Column6,this.Column7,this.Column8,this.Column9});treeNode1.Name = "节点";treeNode1.Text = "节点0";treeNode2.Name = "节点1-0-0";treeNode2.Text = "节点1-0-0";treeNode3.Name = "节点1-0-1";treeNode3.Text = "节点1-0-1";treeNode4.Name = "节点1-0";treeNode4.Text = "节点1-0";treeNode5.Name = "节点1-1";treeNode5.Text = "节点1-1";treeNode6.Name = "节点1";treeNode6.Text = "节点1";treeNode7.Name = "节点2-0";treeNode7.Text = "节点2-0";treeNode8.Name = "节点2-1";treeNode8.Text = "节点2-1";treeNode9.Name = "节点2-0";treeNode9.Text = "节点2-0";treeNode10.Name = "节点2";treeNode10.Text = "节点2";treeNode11.Name = "节点3-0";treeNode11.Text = "节点3-0";treeNode12.Name = "节点3-1";treeNode12.Text = "节点3-1";treeNode13.Name = "节点3";treeNode13.Text = "节点3";this.treeHeadDataGridView1.HeadSource.AddRange(new System.Windows.Forms.TreeNode[] {treeNode1,treeNode6,treeNode10,treeNode13});this.treeHeadDataGridView1.Location = new System.Drawing.Point(12, 12);this.treeHeadDataGridView1.Name = "treeHeadDataGridView1";this.treeHeadDataGridView1.RowTemplate.Height = 23;this.treeHeadDataGridView1.Size = new System.Drawing.Size(1034, 456);this.treeHeadDataGridView1.TabIndex = 0;// // Column1// this.Column1.HeaderText = "Column1";this.Column1.Name = "Column1";this.Column1.Width = 110;// // Column2// this.Column2.FillWeight = 80F;this.Column2.HeaderText = "Column2";this.Column2.Name = "Column2";// // Column3// this.Column3.FillWeight = 60F;this.Column3.HeaderText = "Column3";this.Column3.Name = "Column3";this.Column3.Width = 160;// // Column4// this.Column4.HeaderText = "Column4";this.Column4.Name = "Column4";// // Column5// this.Column5.HeaderText = "Column5";this.Column5.Name = "Column5";// // Column6// this.Column6.HeaderText = "Column6";this.Column6.Name = "Column6";// // Column7// this.Column7.HeaderText = "Column7";this.Column7.Name = "Column7";// // Column8// this.Column8.HeaderText = "Column8";this.Column8.Name = "Column8";// // Column9// this.Column9.HeaderText = "Column9";this.Column9.Name = "Column9";// // Form1// this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(1077, 533);this.Controls.Add(this.treeHeadDataGridView1);this.Name = "Form1";this.Text = "Form1";((System.ComponentModel.ISupportInitialize)(this.treeHeadDataGridView1)).EndInit();this.ResumeLayout(false);}#endregionprivate TreeHeadDataGridView treeHeadDataGridView1;private System.Windows.Forms.DataGridViewTextBoxColumn Column1;private System.Windows.Forms.DataGridViewTextBoxColumn Column2;private System.Windows.Forms.DataGridViewTextBoxColumn Column3;private System.Windows.Forms.DataGridViewTextBoxColumn Column4;private System.Windows.Forms.DataGridViewTextBoxColumn Column5;private System.Windows.Forms.DataGridViewTextBoxColumn Column6;private System.Windows.Forms.DataGridViewTextBoxColumn Column7;private System.Windows.Forms.DataGridViewTextBoxColumn Column8;private System.Windows.Forms.DataGridViewTextBoxColumn Column9;}
}
通过这种方式,我们成功实现了多层表头的功能,完全依赖自定义组件,不需要第三方控件。
源码地址:https://download.csdn.net/download/weixin_44643352/90054291?spm=1001.2014.3001.5503
相关文章:
C# 自定义组件实现表格的多层表头功能
在 WinForms 中,想要实现多层表头功能时,DataGridView 本身并不支持该功能,而且又不希望使用第三方控件,因此选择通过自定义组件来实现这一需求。 首先,展示一下程序实现的效果: 接下来,创建一…...
给Squid代理添加HTTP basic认证
HTTP basic认证是一种简单的认证机制,要求用户在请求资源前提供有效的用户名和密码。 实例: 给Squid代理添加HTTP basic认证 要求: 只允许用户名为peter,密码为123的请求通过认证, 其他请求返回407(Proxy认证失败) 步骤 1 使用htpasswd工具,生成用户…...
使用伪装IP地址和MAC地址进行Nmap扫描
使用伪装IP地址和MAC地址进行Nmap扫描 在某些网络设置中,攻击者可以使用伪装的IP地址甚至伪装的MAC地址进行系统扫描。这种扫描方式只有在可以保证捕获响应的情况下才有意义。如果从某个随机的网络尝试使用伪装的IP地址进行扫描,很可能无法接收到任何响…...
Oceanbase离线集群部署
准备工作 两台服务器 服务器的配置参照官网要求来 服务器名配置服务器IPoceanbase116g8h192.168.10.239oceanbase216g8h192.168.10.239 这里选oceanbase1作为 obd机器 oceanbase安装包 选择社区版本的时候自己系统的安装包 ntp时间同步rpm包 联网机器下载所需的软件包 …...
剑指Offer-1 存在重复元素
记录学习过程 题目连接 题目连接 题目描述 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例一、 输入:nums [1,2,3,1] 输出:true 解释&…...
react跳转传参的方法
传参 首先下载命令行 npm react-router-dom 然后引入此代码 前面跳转的是页面 后面传的是你需要传的参数接参 引入此方法 useLocation():这是 react-router-dom 提供的一个钩子,用于获取当前路由的位置对象location.state:这是从其他页面传…...
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
🎙告诉你:Java是世界上最美好的语言 💎比较擅长的领域:前端开发 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我持续下去的动力! 目录 一. 作者有话说 …...
CSS学习记录04
CSS边框 CSS border 属性指定元素边框的样式、宽度和颜色。border-style 属性指定要显示的边框类型。dotted - 定义点线边框dashed - 定义虚线边框solid - 定义实线边框double - 定义双边框groove - 定义3D坡口边框,效果取决于border-color值ridge - 定义3D脊线边框…...
Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例
1、在pom.xml中加入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId><version>3.1.6</version></dependency> 2、配置application.yml 加入Kafk…...
vue3【实战】图表【组件封装】Chart ( 原生 ECharts ,支持自适配屏幕缩放,动态响应图表配置修改)
效果预览 技术方案 vue3 ( vite | TS | AutoImport ) Element Plus UnoCSS ECharts 技术要点 ECharts 实例的类型 let myChart: echarts.ECharts | null null默认生成随机 id id: {type: String,default: () > Math.random().toString(36).substring(2, 8)},深度监听图…...
Oracle系统性能监控工具oswatcher演示
1、关于 OSW OSWatcher 的使用符合 Oracle 的标准许可条款,并且不需要额外的许可即可使用!!!! OSWatcher (oswbb) 是一种 UNIX shell 脚本的集合,主要用于收集和归档操作系统和网络的度量,以便…...
Unix、GNU、BSD 风格中 ps 参数的区别
注:本文为“不同风格中 ps 命令参数的区别”相关文章合辑。 未去重。 BSD 风格和 UNIX 风格中 ps 参数的区别 作者:Daniel Stori 译者:LCTT Name1e5s | 2017-06-17 10:53 One Last Question ps aux 以及 ps -elf 都是查看进程的方式&…...
Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1
文章目录 Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、安装配置Jenkins2.1 安装JDK…...
百度文心一言全解析
一、技术基础 模型架构 多层神经网络构建:深度神经网络结构,包含多个隐藏层,有效处理复杂语言信息。注意力机制运用:精准聚焦文本关键部分,理解语义关联与重要性分布。多头注意力并行:多维度分析文本&#…...
在python中使用布尔逻辑
布尔是python中常见类型。它的值只能是两项内容之一:true或false. 编写"if"语句 若要在python中表达条件逻辑,可以使用if语句。——编写If语句离不开逻辑运算符:等于、不等于、小于、大于或等于、大于和大于或等于。 在python中…...
【Web】AlpacaHack Round 7 (Web) 题解
Treasure Hunt flag在md5值拼接flagtxt的文件里,如 d/4/1/d/8/c/d/9/8/f/0/0/b/2/0/4/e/9/8/0/0/9/9/8/e/c/f/8/4/2/7/e/f/l/a/g/t/x/t 访问已经存在的目录状态码是301 访问不存在的目录状态码是404 基于此差异可以写爆破脚本 这段waf可以用url编码绕过 做个lab …...
汽车48V电气系统
汽车48V电气系统 汽车48V电气系统汽车48V电气系统设计汽车48V电气系统测试汽车48V系统是48V供电和12V供电共存的么?48V供电系统是如何与12V供电系统共存的?48V电气系统测试的难点有哪些?在汽车48V电气系统通信测试中,如何向12V的控制器和48V的控制器供电?汽车48V电气系统通…...
完美解决Qt Qml窗口全屏软键盘遮挡不显示
1、前提 说明:我使用的是第三方软键盘 QVirtualKeyboard QVirtualKeyboard: Qt5虚拟键盘支持中英文,仿qt官方的virtualkeyboard模块,但使用QWidget实现。 - Gitee.com 由于参考了几篇文章尝试但没有效果,链接如下: 文章一:可能…...
docker逃逸总结
一、 检查是否在docker容器中 通过以下两个地方来判断 # 是否存在此文件 ls -al /.dockerenv# 在其中是否包含docker字符串 cat /proc/1/cgroup除了上面两种外还有其他方式判断,如检测mount、fdisk -l查看硬盘 、判断PID 1的进程名等也可用来辅助判断。 容器逃逸…...
DSA 和 ECDSA 签名算法
DSA 和 ECDSA 签名算法 基本介绍Java实现DSA创建密钥对签名验签 ECDSA创建密钥对签名验签 Go实现ECDSA创建密钥对签名验签 DSA创建密钥对签名验签 基本介绍 DSA 是一种基于离散对数问题的数字签名算法。它使用私钥和公钥对来进行签名和验证操作。 ECDSA 是基于椭圆曲线密码体制…...
Scrapy的简单实现
Scrapy的简单实现 1. Scrapy是什么 Scrapy是一个用于抓取网站(即网页爬取)和从网页中提取结构化数据的开源框架。它为编写网络爬虫来抓取网站内容提供了高效、灵活的方式,并将这些信息以常见的格式保存,如JSON、CSV或XML。Scrap…...
Python之爬虫入门--示例(2)
一、Requests库安装 可以使用命令提示符指令直接安装requests库使用 pip install requests 二、爬取JSON数据 (1)、点击网络 (2)、刷新网页 (3)、这里有一些数据类型,选择全部 (…...
JS的for in和for of
for...in 语句 工作原理 遍历属性:for...in 遍历对象的所有可枚举属性,这些属性不仅限于对象本身的属性,还包括原型链上的可枚举属性。返回键名:每次迭代时,循环变量会得到当前属性的键(即字符串形式的属…...
Spring IoC的基本概念
引言 在 Java 中,出现了大量轻量级容器,这些容器有助于将来自不同项目的组件组装成一个有凝聚力的应用程序。这些容器的底层是它们如何执行布线的常见模式,它们将这一概念称为“控制反转”。 🏢 本章内容 🏭 IoC服务…...
解决GitHub项目泄露API密钥问题
文章目录 所有的步骤参考gpt步骤一 使用环境变量步骤二 撤销并移除历史中的API密钥(1) 安装: pip install git-filter-repo(2) 清除特定文件 git filter-repo --path PATH_TO_YOUR_FILE --invert-paths出错解决 步骤三 处理移除的 origin 远程步骤四 强制推送到GitHub步骤五 重…...
【BUG】VMware|vmrest正在运行此虚拟机,无法配置或删除快照
VMware版本:VMware 16 文章目录 省流版问题解决方案 详细解释版问题解决方案总结 省流版 问题 只读,因为vmrest正在运行虚拟机。 解决方案 参考:虚拟机设置,只读,因为vmrest正在运行此虚拟机。有谁遇到过这种问题吗&…...
Ruby On Rails 笔记2——表的基本知识
Active Record Basics — Ruby on Rails Guides Active Record Migrations — Ruby on Rails Guides 原文链接自取 1.Active Record是什么? Active Record是MVC模式中M的一部分,是负责展示数据和业务逻辑的一层,可以帮助你创建和使用Ruby…...
VideoConvertor.java ffmpeg.exe
VideoConvertor.java ffmpeg.exe 视频剪切原理 入点 和 出点 选中时间点,导出...
java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigur
在运行代码的过程中,报出以下错误: java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration.redisTemplate 或者是: Caused by: java.lang.IllegalArgu…...
C#设计模式--策略模式(Strategy Pattern)
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需…...
Webpack Tree Shaking 技术原理及应用实战,优化代码,精简产物
前言 在前端开发中,优化代码体积和提升应用性能是至关重要的课题。Webpack 提供了多种优化手段来帮助开发者实现这一目标,Tree Shaking 就是其中一种非常重要的优化技术,它通过在编译阶段移除未被使用的代码模块,从而显著减小最终…...
C++(十二)
前言: 本文将进一步讲解C中,条件判断语句以及它是如何运行的以及内部逻辑。 一,if-else,if-else语句。 在if语句中,只能判断两个条件的变量,若想实现判断两个以上条件的变体,就需要使用if-else,if-else语…...
ModelScope-Agent(1): 基于开源大语言模型的可定制Agent系统
目录 简介快速入门 简介 github地址 快速入门 看前两篇,调用千问API和天气API # 选用RolePlay 配置agent from modelscope_agent.agents.role_play import RolePlay # NOQArole_template 你扮演一个天气预报助手,你需要查询相应地区的天气&#x…...
Jmeter进阶篇(30)深入探索 JMeter 监听器
前言 在性能测试领域里,Apache JMeter 是一款经典而强大的工具,而其中的监听器(Listeners)组件更是发挥着不可或缺的关键作用。 监听器就像敏锐的观察者,默默记录测试执行过程中的各种数据,作为系统性能分析的数据依据。 本文将带你全方位走进 JMeter 监听器的奇妙世界,…...
HTTP multipart/form-data 请求
序言 最近在写项目的过程中有一个需求是利用 HTTP 协议传输图片和视频,经过查询方法相应的方法发现使用 multipart/form-data 的方式,这是最常见处理二进制文件的表单编码类型。 学习了一下午,现在总结一下使用的方法和相关的知识点&#x…...
记录关于阿里云智能媒体预览pdf文件的问题
pdf仅支持预览,不支持编辑,需要将权限设置成只读。 readonly参数一定要传,不能不传!!!! readonly的设置一定要用示例提供的方法!!!! 用WebofficeP…...
Milvus向量数据库01-基础概念
Milvus向量数据库01-基础概念 Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection,然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection 中的 Entity …...
字节高频算法面试题:小于 n 的最大数
问题描述(感觉n的位数需要大于等于2,因为n的位数1的话会有点问题,“且无重复”是指nums中存在重复,但是最后返回的小于n最大数是可以重复使用nums中的元素的): 思路: 先对nums倒序排序 暴力回…...
PowerShell 脚本实战:解决 GitLab 仓库文件批量重命名难题
使用PowerShell脚本解决文件重命名问题:一次实践经验分享 在软件开发过程中,我们经常会遇到需要批量处理文件的情况。最近,我在一个项目中就遇到了这样一个需求:将GitLab仓库中所有的.ts和.py文件的扩展名修改为原扩展名加上&quo…...
爬取的数据能实时更新吗?
在当今数字化时代,实时数据更新对于企业和个人都至关重要。无论是市场分析、商品类目监控还是其他需要实时数据的应用场景,爬虫技术都能提供有效的解决方案。本文将探讨如何利用PHP爬虫实现数据的实时更新,并提供相应的代码示例。 1. 实时数…...
【SKFramework框架核心模块】3-6、FSM有限状态机模块
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…...
Python之爬虫入门(1)
目录 一、简介 二、爬虫的功能 1、爬虫的用处 2、爬虫的应用场景 三、爬虫的实现步骤 四、GET和POST方法 1、GET方法 (1)、简介 (2)、适用场景 2、POST方法 (1)、简介 (2)…...
《MySQL 表结构设计基础》
一、引言 MySQL 表结构设计是数据库开发中的重要环节,合理的设计不仅能提高数据库性能,还能使数据更易于维护和管理。本文将详细介绍 MySQL 表结构设计的基础要点。 在数据库开发中,MySQL 表结构设计的重要性不言而喻。一个良好的表结构设计…...
微信小程序 - 解决报错{“errno“:600001,“errMsg“:“request:fail errcode:-202cronet_error_code:-202error_msg:net::
前言 关于此问题网上的教程都无法解决,如果您的报错信息与我相似,即可解决。 在微信小程序开发中,详细解决小程序请求接口报错:{“errno”:600001,“errMsg”:“request:fail errcode:-202cronet_error_code:-202error_msg:net::ERR_CERT_AUTH ORITY_INVALID”},微…...
k8s 为什么需要Pod?
Pod,是 Kubernetes 项目中最小的 API 对象,更加专业的说,Pod,是 Kubernetes 项目的原子调度单位。 Pod 是 Kubernetes 里的原子调度单位。这就意味着,Kubernetes 项目的调度器,是统一按照 Pod 而非容器的资…...
react 使用状态管理调用列表接口渲染列表(包含条件查询,统一使用查询按钮,重置功能),避免重复多次调用接口的方法
react开发调用api接口一般使用useEffect来监听值的变化,通过值的变化与否来进行接口调用。 比如我们要进行一个查询接口 const [pageParams, setPage] useState({name: ,id: ,});const [dataList, setDataList] useState([]);const getList async () > {const…...
常见限流算法详细解析
常见限流算法详细解析 分布式系统中,由于接口API无法控制上游调用方的行为,因此当瞬时请求量突增时,会导致服务器占用过多资源,发生响应速度降低、超时、乃至宕机,甚至引发雪崩造成整个系统不可用。 限流,…...
第四十一天 ASP应用 HTTP.sys 漏洞 iis6文件解析漏洞和短文件漏洞 access数据库泄露漏洞
前言 随着时代的发展现在呀,这个ASp已经淡出大众的视线了 ,ASP之前的火爆程度无异于现在的PHP 大家的童年 4399 什么的网站都是这个搭建的ASP 简介 | 菜鸟教程 那大家想问为什么你妹的 这个这么火的网站搭建语言被淘汰了呢 其实多半是以为它的不开…...
LLM输出评估标准
LLM输出评估标准 LLM评估方法 响应的完整性和简洁性:确定大模型的响应是否完全解决用户查询,简洁性则评估生成响应的相关性。文本相似性指标:将生成的文本与参考文本进行比较,评估它们的相似度,并给出得分以理解大模…...
ansible学习笔记之02command模块与shell模块
目录 1、概述 2、模块介绍 2.1 command模块 2.2 shell模块 2.3 小结 3、实验 3.1 测试ls命令 3.2 测试环境变量 3.3 测试操作符">" 1、概述 本文介绍ansible的command模块与shell模块,并通过实验比对两个模块的异同。 2、模块介绍 2.1…...