PDMS c# 动态添加按钮到用户控件
先看效果,这个方法可以用于任何形式的程序,思路就是这样我比较喜欢偷懒
这个按钮是自动添加上去的
1# 定义一个特性
public class MyPdmsFunction : Attribute { public string FunctionName { get; set; } public string ClassName { get; set; } public MyPdmsFunction(string _Name,string _clsName="") { this.FunctionName = _Name; this.ClassName = _clsName; } }
2# 写自己的方法,并在方法上标记该特性
public class 画圆测试 { [MyPdmsFunction(nameof(画圆测试), nameof(画圆测试函数))] public static void 画圆测试函数(WindowManager wm, Command _cmd) { var draftApp = new MarDrafting(); MarUi marui = new MarUi(); var pt = new MarPointPlanar(); marui.PointPlanarReq("指定一个圆心:\n", pt); var pt1 = new MarPointPlanar(); marui.PointPlanarReq("指定一个圆上的一点:\n", pt1); var r = pt.DistanceToPoint(pt1); draftApp.CircleNew(new Aveva.Marine.Geometry.MarCirclePlanar(pt, r)); wm.StatusBar.Text = "创建成功!"; } }
3#在你的主窗体上做文章,利用特性和反射知识动态加载按钮和按钮的事件
public partial class UserControl1 : UserControl { public WindowManager WinManager { get; set; } public Command Cmd { get; set; } public UserControl1(WindowManager wm, Command _cmd) { InitializeComponent(); this.WinManager = wm; this.Cmd = _cmd; //反射读取程序集 var allCls = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.IsPublic); List<MethodInfo> mis = new List<MethodInfo>(); //提取所有含有自定义特性标记的方法 foreach (var item in allCls) { var curClsMis = item.GetMethods().Where(m => m.GetCustomAttributes(typeof(MyPdmsFunction), true).Any()); if (curClsMis.Count() > 0) mis.AddRange(curClsMis); } if (mis.Any()) { var i = 0; foreach (var mi in mis) { MyPdmsFunction myAtt = mi.GetCustomAttributes(true).First(att => att.GetType().FullName == typeof(MyPdmsFunction).FullName) as MyPdmsFunction; var btn = new Button(); this.SuspendLayout(); btn.Location = new System.Drawing.Point(15, 30 * (i + 1)); btn.Name = myAtt.FunctionName; btn.Size = new System.Drawing.Size((int)(this.Width * 0.85), 25); btn.TabIndex = i; btn.Text = myAtt.FunctionName; btn.UseVisualStyleBackColor = true; btn.Click += (o, e) => mi.Invoke(mi.IsStatic ? null : Activator.CreateInstance(mi.DeclaringType), new object[] { wm, _cmd }); this.Controls.Add(btn); i++; } } } } }
标签:
AVEVA MRINE
, PDMS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具