自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

C#开发

本人2004年开始写C#,擅长C#程序开发。目前专注Revit二次开发,顺便毕生为神族汉服复兴而努力。

  • 博客(154)
  • 资源 (22)
  • 收藏
  • 关注

原创 C# Winform DataGridView的列顺序,在运行时/数据源绑定后被改变的问题

C# Winform DataGridView的列顺序,在运行时/数据源绑定后被改变的问题,这个问题对于需要控制列顺序的人来说,如果找不到原因,你就会发现一直都控制不了列的顺序。当然,你可能也有事件处理程序或者其它代码编程导致主动改变了列顺序,甚至你可能设置了独特的样式和主题导致的,但这种不是我们考虑的范围。我们要讲的是针对数据绑定影响了列的顺序的这个原因,没有人为去控制列顺序的程序下,数据源绑定后列就自动被改变了。这个问题的处理,需要用到列的DisplayIndex属性,该属性可以设定顺序。

2024-04-16 09:50:10 429

原创 项目框架构建之6:编写通用主机基础类

本文是“”系列之6,本文介绍如何编写通用主机基础类。

2024-01-04 19:14:58 418

原创 项目框架构建之5:日志的构建

本文是“”系列之5,本文介绍日志的构建。为了做出通用的公共日志模块,我们需要使用微软的Microsoft.Extensions.Logging日志管理模块,该模块提供了灵活且可扩展的日志记录机制,它为整个.net应用程序提供了一致统一的接口,而且不受具体日志库的限制。通过使用这个库,,它可以集成你想要的任何常见库,如NLog、log4net等。: ILogger 是核心接口,用于在应用程序中进行日志记录。应用程序代码应该通过 ILogger 进行日志记录,而不是直接依赖于具体的日志库。

2024-01-04 19:01:45 851

原创 项目框架构建之4:基础类,公共扩展方法项目的构建

本文是“”系列之4,本文介绍基础类,公共扩展方法项目的构建。为什么要构建基础类、公共扩展方法呢?因为我们在项目中经常会使用到一些常用的扩展方法,以及一些基础标准类。将这些公共标准的类放在基础项目Xejen中是合适的,可以被其它项目引用并使用。

2024-01-04 18:50:59 383

原创 项目框架构建之3:Nuget服务器的搭建

本文是“”系列之3,本文介绍一下Nuget服务器的搭建,这是一项简单的工作,您或许早已会了。

2024-01-03 20:51:34 560

原创 项目框架构建之2:主机程序的搭建

微软的主机系统是指.net core或者.net 5以上的应用程序主机,这个主机允许我们使用配置、日志、依赖注入等一些常见的功能,还可以编写中间件等很多丰富功能。简单介绍一下主机程序,我们生产系统中往往需要构建控制台应用程序、Web应用程序、后台服务、Winform窗体应用程序等,为了应对各种应用所带来的挑战,我们就很需要微软的主机系统。”系列之2,要编写一个项目框架,就好像一个操作系统似的,得有一些东西可以搭载项目结构,而.net core的主机框架正是可以实现这一目的的好帮手。

2024-01-03 19:50:44 338

原创 项目框架构建之1:编程之美-构建高可用项目结构的思考与实践,手把手一步一步演练构建整个项目框架结构系统以及生产子系统的应用

好久没有动笔写文章了,思来想去,发现基础的东西在网上已经被讨论得差不多了,写的千篇一律,缺乏新意。于是,我想借此机会与大家一起探讨一个让我心血来潮的话题:如何构建一个高可用、高扩展、高性能的项目结构。然而,真正热爱编程的人,对技术的沉迷,对自己代码的美感体验是一种难得的体验,我深有体会。虽然它们各有特点,但本质上都在追求将项目尽可能单一化,让每个工作、任务、功能尽量独立,再通过开放的接口相互访问。

2024-01-03 19:13:55 333

原创 提供一个使用Npoi生成excel文档的例子,应能帮助到各位使用Npoi的朋友,因为具有多种情形处理

由于代码注释已经很详细了,所以,我就直接贴上完整代码,就不啰唆了,我知道,读者其实也不想看我放屁,你们只想要源码,而且还不想放在下载中(因为那个要积分要钱)。1.第一行大标题加了背景色,且这个背景色,不在常用的颜色范围中,需要自定义。2.第二行的表格信息是单独的,每一项信息对应一个单元格给它填写值。6.第1行的高度要最高,第2行的高度要次之,第3行的高度再次之,第4行用excel的默认高度。要注意的是跟第3行一样,要合并单元格。且根据单元格的文字多少,自适应文档的单元格宽度范围。

2023-06-06 09:48:43 562

原创 C# winform 如何让TextBox文本内容垂直居中?

如题,C# winform 如何让TextBox文本内容垂直居中?初一看感觉这个问题很简单,但实际比较复杂。winform的TextBox控件本身是不提供这个属性的。本文提供一个可靠可用的重写控件给大家使用。相信本文能够给一些需要此控件的人带去很大的方便。本文主要提供以下主要功能:1.控件提供了VerticalAlign属性,他提供了垂直对方的三个方向:居上、居中、居下。2.单行文本。即不允许输入多行内容。屏蔽了通过复制粘贴,以及回车换行弄出多行文本的操作。下图的枚举提供了该

2022-04-22 17:00:46 11763 3

原创 C# 用真实需求,手把手教你写面向对象的代码

好久没写过文章了,这里工作很忙。今天继续给大家讲解下,怎么写面向对象的代码。之前也写过类似的文章,但那都是随便举的例子,不是活生生的现实案例。今天使用我刚写的项目来举例子,它是真实存在的需求案例,引领大家一步一步写面向对象代码。号外:各位看到文档不要惊慌,我也是第一次接触这个文档,也不懂这些需求,就是纯看英文文档写出来的代码,跟你们没有两样,我对它的业务也是不懂的。一、首先,先仔细看下需求文档,需求文档是英文的,相信大家大体能看懂,需求是截取的片段。二、实现第一段需求本需求截图如下,该需

2022-02-18 11:14:52 3544 1

原创 不卡主线程,N个异步方法后台运行,且需要按时序顺序执行,要怎么写?

我们会有很多异步方法,通常,调用了N个异步方法后,哪个先执行完,哪个后执行完,是不确定的。场景:若需要确保不影响主线程,即不卡主线程,仍然让这些耗时的异步方法在后台执行,且需要让这些异步方法,按一定的先后顺序(时序)执行,那么要怎么办呢?下面直接提供一个类给大家针对上述场景使用。直接上代码,抄过去即可直接使用。using System;namespace Zhongzhou.TaskFlow{ /// <summary> /// 作业流程任务控制器 .

2022-02-09 17:01:28 980

原创 C# 提供一个点击按钮时可变更状态并显示对应文字的按钮控件

本按钮控件很简单,提供简易的状态变更,并显示对应的文字。具体请看效果图:一、提供按钮触发时间间隔,默认300毫秒/// <summary>/// 状态切换时间间隔,单位毫秒。默认300/// </summary>[Browsable(true)][Category("Zhongzhou")][DefaultValue(300)][Description("状态切换时间间隔,单位毫秒。默认300")]public int Interval { ge.

2021-12-02 08:55:54 4371

原创 C# Winform可长按延时触发事件的按钮控件

背景:通过长按一个按钮,达到指定时间后,才执行该按钮的事件。按钮截图如下,其中长按过程中,按钮背景加了进度条,通过改变按钮颜色的形式可以看到长按的时间进度:一、定义开放属性总共提供了3个属性,具体如代码注释所示:/// <summary>/// 延迟多久才触发按钮事件,默认0,单位毫秒/// </summary>[Browsable(true)][Category("Kintai")][DefaultValue(0)][Description("表示

2021-11-12 13:54:51 4455 1

原创 C# 提供一个Winform可控的延迟触发按钮

效果描述:当点击一个按钮时,会自动延时您所以设定的时间,然后才执行该按钮事件,这个过程不会占用UI线程,不会卡死。直接给您传上代码,您可以自行测试一下效果:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.Drawing;using System.Linq;using

2021-11-12 08:36:41 2103

原创 C# 提供一个Winform小数字键盘模拟器

文章开始之前,先看一下效果图,看是不是您正所需要的:一、构建计算器的界面要构建出一个好看点的计算器界面,还是需要颇费些小心思的,我做这个的时候,也花了两三个小时的时间构建这个界面。其主要的使用控制是TableLayoutPanel控件。另外一个小难点则在于内容控件Textbox的显示,要让文字垂直居中,在没有重写Textbox控件的情况下要达到这个效果,也是花了些小心思。其它的界面则没有什么的。至于加减号嘛,则用输入法的特殊符号即可。二、构建控件的开放属性一共开放了3个属性,

2021-11-12 08:31:56 3299

原创 C# 生成chm代码文档

如何生成chm代码文档?一、下载Sandcastlehttps://github.com/EWSoftware/SHFB/releases通过上面的链接可以时刻下载到最新的版本。本文是针对vs2019来操作。二、安装Sandcastle下载解压后,会有一个SandcastleInstaller.exe文件,双击安装它。如上图,安装过程会有很多个Next,一路点下去,若遇到有提示你要Install的地方,通通点一下安装即可,一直到最后一个Next点完,即表示安装完成。.

2021-08-19 10:42:16 1444 1

原创 Revit二次开发,C#:gltf转glb格式,如何编译glTF-CSharp-Loader

问题:使用C#代码将.gltf格式如何转为.glb格式?本文先不讲如何转,先讲如何编译这个源码项目。将.gltf格式转.glb格式,需要用到一个gltfLoader的Nuget包。1.我们先下载这个源码包glTF-CSharp-Loader网址在:https://github.com/KhronosGroup/glTF-CSharp-Loader2.无法编译下载后,你会发现,无法直接编译通过。仔细阅读他的文档,他会告诉我们,需要先运行Generator项目,通过运行这个项目才会自动

2021-08-02 09:30:08 1553 1

原创 Revit二次开发,如何判断机械设备所属的专业类型

截止目前2021.7.12,我找遍全网,应该是没人说过这个问题。所以,你如果来到了这里,那么本文可能是你的唯一答案。在Revit中,是有很机械设备的,通常我们并不需要知道这些设备是属于什么专业的?但是万一你恰好需要知道呢?那如何判断呢?如下图,比如一台空调机,他的族分类是机械设备,你怎么判断他是属于“暖通”专业,还是属于“机电”专业呢?这里可以用到该族实例(FamilyInstance)的MEPModel属性。通过它的Domain属性,我们可以做一个大略的判断。如...

2021-07-12 18:45:25 715

原创 C# 安装android studio以及flutter

一、安装flutter先下载flutter,网址在:https://flutter.dev/docs/development/tools/sdk/releases#windows

2021-06-17 08:02:21 1126 1

原创 C# 在wpf中使用Command及CommandParameter

假设你的xaml页面有以下控件:<Button Content="按钮"></Button><TextBlock x:Name="Text" Text="中国"></TextBlock>那么,您想要使用

2021-06-11 09:12:06 2809

原创 C# 在Wpf中使用快捷键功能

一、使用RoutedUICommand实现假设您有一个window界面,在window中添加以下代码:

2021-06-02 18:28:27 1633 1

原创 Revit二次开发,怎么判断2个向量之间是平行还是垂直?

已知向量a(x1,y1,z1)、b(x2,y2,z2)判断垂直,需要点积为0。公式为:a*b=x1x2+y1y2+z1z2=0在Revit中,

2021-06-01 11:36:38 993

原创 Revit二次开发,如何解析系统族的几何信息?如墙、风管等

如何解析系统族的几何信息?如墙、风管等。一、系统族的继承特征系统族,如Wall、Duct等,它们有一个父级继承,就是都来自于HostObject,这可能就是系统族的标志。知道这个信息很有用。二、编写获取系统族的几何信息的代码Autodesk.Revit.DB.Options opt = new Options();SolidToMesh solidToMesh = new SolidToMesh();Autodesk.Revit.DB.GeometryElement geomEle

2021-05-26 14:58:33 538

原创 Revit二次开发,判断参数的值类型

怎么判断Revit的参数Parameter的值类型呢?方法一、通过StorageType判断,请看下图:使用StorageType,可以进行判断。StorageType一共分以下几种:None = 0,Integer = 1,Double = 2,String = 3,ElementId = 4从字面意思是比较好理解的。其中None的话,我也不知道在什么条件下触发。ElementId就是元素id,你可以当成是一个Int值。提供一个简单类: /// <summary

2021-05-26 09:45:09 489

原创 C# 在wpf中如何使用image

一、如果您的Image使用的是已知的图片,那么直接传路径即可<Image Source="iphone_protrait-r0-c0.png" Width="100" Height="60" Stretch="Fill"/>这种情况,使用的是相对路径,即使用者BootView.xaml跟它所使用的图片iphone_protrait-r0-c0.png,在同级,那么代码就如上面使用。如果使用者,跟它所使用的图片,不在一起,那么您可以使用绝对路径访问:<Image.

2021-05-18 19:08:44 2061 4

原创 Revit二次开发,判断3点围绕方向是顺时针还是逆时针

已经空间任意3点a,b,c,如何判断他们的环绕顺序是顺时针还是逆时针呢?直接给出代码: /// <summary> /// 判断3点组成的方式是顺时针还是逆时针 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <param

2021-03-04 15:38:54 598 2

原创 WPF,如何上传文件,OpenFileDialog

在WPF中,是没有类似winform的OpenFileDialog控件的,那么要怎么办呢?在wpf界面上,放置一个button按钮,双击生成点击事件,编写以下代码即可:/// <summary>/// 浏览选择文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void BrowseButton_

2021-02-08 10:26:38 2264 2

原创 WPF,为何样式对TargetType=“Window“无效

在wpf中,您直接定义样式,并设置TargetType="Window",会发现是无效的。要怎么解决呢?让我们定义一个样式文件,路径为Styles/App.xaml:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

2021-02-07 15:07:18 1025

原创 Revit二次开发,取三角面片坐标数据,并还原生成图形

如何在revit中得到一个项目的三角面片坐标数据?以生成这个桌子为例子。文章开始前,先看下gif效果图:1.打开个Revit项目,该项目就上图一张桌子,执行下面程序将会生成一个文件,位置在:E:\gra.txt/// <summary>/// 三角面片/// </summary>public void DrawMesh(){ StreamWriter sw = new StreamWriter(@"E:\gra.txt", false);

2021-01-26 17:24:45 1367 1

原创 C# byte、string、char、unicode的相关性。

经常会遇到需要转换字节数组和字符数组,以及编码问题。即便是老手,都不一定能搞明白他们的关系。除非你回去看书,把基础复习一遍记下来打牢。string:是字符串的意思。char:是字符的意思。它用于表示字符。但字符可能是2个char组成的,不过大多数情况下,一个字符,对应一个char。byte:表示字节。unicode:编码,它包含了这个星球的所有语言。所以又有别称“万国码”。好的,下面重点:一个字符串string,通常由N个字符char组成,所以,string.length,.

2021-01-18 15:09:03 977

原创 C#面向对象设计模式14:命令模式(Command)

命令模式,先占位,由于文章太耗时,后面补上。using System;using System.Collections.Generic;using System.Linq;namespace SimpleFactory{ class Program { static void Main(string[] args) { 服务员 servicer = new 服务员(); 马师傅 shifu =

2021-01-12 17:26:42 361 1

原创 C#面向对象设计模式16:中介者模式(Mediator)

中介者模式,先占位,由于文章太耗时,后面补上。using System;using System.Collections;using System.Collections.Generic;using System.Linq;namespace SimpleFactory{ class Program { static void Main(string[] args) { 走位 servicer = new 走位()

2021-01-12 16:14:46 297

原创 C#面向对象设计模式15:迭代器模式(Iterator)

迭代器模式,先占位,由于文章太耗时,后面补上。using System;using System.Collections;using System.Collections.Generic;using System.Linq;namespace SimpleFactory{ class Program { static void Main(string[] args) { 炸好的油条 youtiaos = new 炸

2021-01-12 11:50:31 137

原创 C#面向对象设计模式13:责任链模式(ChainofResponsibility)

责任链模式,先占位,由于文章太耗时,后面补上。using System;using System.Collections.Generic;using System.Linq;namespace SimpleFactory{ class Program { static void Main(string[] args) { //前台服务员收到客人订单,录入系统下订单。 控制系统 controll

2021-01-08 10:26:32 222 1

原创 C#面向对象设计模式12:代理模式(Proxy)

代理模式,先占位,由于文章太耗时,后面补上。using System;using System.Collections.Generic;using System.Linq;namespace SimpleFactory{ class Program { static void Main(string[] args) { 现金支付 cash = new 现金支付(); 支付代理 proxy1 = n

2021-01-08 09:49:40 386

原创 C#面向对象设计模式11:享元模式(Flyweight)

享元模式,先占位,由于文章太耗时,后面补上。其实就是缓存使用。using System;using System.Collections.Generic;using System.Linq;namespace SimpleFactory{ class Program { static void Main(string[] args) { var package1 = new 炒粉打包(true, false);

2021-01-07 18:28:33 90

原创 C#面向对象设计模式10:外观模式(Facade)

外观模式,先占位,由于文章太耗时,后面补上。using System;using System.Collections.Generic;namespace SimpleFactory{ class Program { static void Main(string[] args) { Console.WriteLine("有客人来啦"); 服务员 waiter = new 服务员();

2021-01-07 15:24:14 124 2

原创 C#面向对象设计模式9:装饰模式(Composite)

装饰模式,先占位,由于文章太耗时,后面补上。using System;using System.Collections.Generic;namespace SimpleFactory{ class Program { static void Main(string[] args) { 月饼 cake = new 月饼(); cake.制作(); cake.价格();

2021-01-07 15:05:54 165 2

原创 C#面向对象设计模式8:组合模式(Composite)

组合模式,先占位,由于文章太耗时,后面补上。using System;using System.Collections.Generic;namespace SimpleFactory{ class Program { static void Main(string[] args) { 福建省 福建 = new 福建省(); 城市 龙岩 = new 城市(); 区县 连城县 =

2021-01-07 11:10:58 137

原创 C#面向对象设计模式7:桥接模式(Bridge)

桥接模式,先占位,后面再写文章补充using System;using System.Collections.Generic;namespace SimpleFactory{ class Program { static void Main(string[] args) { var meterial = new 辅料(); var potatos = new 酸辣土豆丝(meterial);

2021-01-07 10:21:07 126

C# 用真实需求,手把手教你写面向对象的代码

对应文章在:https://blog.csdn.net/mazhiyuan1981/article/details/122998975

2022-02-18

MiniKeyboard.Designer.zip

C# 提供一个Winform小数字键盘模拟器,文章地址在:https://blog.csdn.net/mazhiyuan1981/article/details/121280371

2021-11-16

C# Winform可长按延时触发事件的按钮控件

对应文章地址在https://blog.csdn.net/mazhiyuan1981/article/details/121286666

2021-11-12

C#面向对象设计模式2:工厂方法(Factory Method)

文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/110196482

2020-12-31

C#面向对象设计模式4:生成器(Builder)

文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/110638833

2020-12-24

C#面向对象设计模式1:简单工厂

文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/110225903

2020-11-27

Revit二次开发,求任意一点到直线的垂直交点坐标

对应文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/109772173

2020-11-18

软件开发过程管理和控制.docx

文章链接:https://blog.csdn.net/mazhiyuan1981/article/details/109627083

2020-11-11

C#Core演示Winform窗体最小化后,显示到系统托盘上

对应文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/109472818

2020-11-03

Revit二次开发,通过xml或者json等文件自动生成菜单

对应文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/109311364

2020-10-27

C#窗体,如何制作漂亮的窗体UI界面,像微信电脑版一样

对应文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/109250749

2020-10-23

C#中如何使用Sqlite、SqliCe等本地数据库?

对应文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/109223031

2020-10-22

C#窗体Winform,鼠标悬停在控件上,提示框,显示信息。

对应文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/109199984

2020-10-21

Revit二次开发,已知ab直线,求经过a点并垂直于ab的垂线,然后与cd线相交得到交点e

文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/109118984

2020-10-16

Revit二次开发,在winform中制作3d预览效果。完整项目可生产中实例运用。

对应文章地址:https://blog.csdn.net/mazhiyuan1981/article/details/108972765

2020-10-09

Revit二次开发,基于图元中心点,批量旋转指定角度

文章地址在:https://blog.csdn.net/mazhiyuan1981/article/details/108882385

2020-09-30

Revit二次开发,无限选点操作后,当按下Esc键取消无限循环时,如何让已经发生的作业保持完成?

文章所对应的网址:https://blog.csdn.net/mazhiyuan1981/article/details/108755346

2020-09-23

Revit二次开发,创建任意视角的3d视图

文章对应地址:https://blog.csdn.net/mazhiyuan1981/article/details/108745615

2020-09-23

Revit二次开发,取视图列表,以及可打印的视图列表

本资源对应的文章地址为 https://blog.csdn.net/mazhiyuan1981/article/details/108745382

2020-09-23

Revit二次开发,如何选点,如何在Revit界面中选点

对应文章地址链接为 https://blog.csdn.net/mazhiyuan1981/article/details/108745131

2020-09-23

Revit二次开发,创建系统默认的3D视图,以及3d视图的盒子

文章对应地址在 https://blog.csdn.net/mazhiyuan1981/article/details/108724019

2020-09-22

Revit二次开发,新手接入IExternalCommand、IExternalApplication,如何使用它们!

Revit二次开发,新手接入IExternalCommand、IExternalApplication,如何使用它们!对应文章请参见:https://blog.csdn.net/mazhiyuan1981/article/details/108713369

2020-09-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除