当前位置: 首页 > news >正文

propertygrid同时显示numericupdown和slider

效果

 

image

 

在C# WinForms中,让PropertyGrid同时显示NumericUpDown和Slider控件来编辑同一个数值属性,可以通过自定义UITypeEditor来实现。下面是一个完整的解决方案。

🎯 实现思路概述

方法

核心思路

适用场景

优点

自定义UITypeEditor​

创建下拉编辑器同时包含NumericUpDown和TrackBar

需要直观的数值调整界面

用户体验好,操作直观

TypeConverter转换​

将自定义类型转换为PropertyGrid可识别的格式

复杂对象属性的显示与编辑

灵活性高,可处理复杂数据结构

⚙️ 具体实现步骤

1. 创建包含NumericUpDown和TrackBar的编辑控件

首先创建一个用户控件,同时包含NumericUpDown和TrackBar:

 1 using System;
 2 using System.Windows.Forms;
 3 
 4 public class NumericUpDownSliderControl : UserControl
 5 {
 6     private NumericUpDown numericUpDown;
 7     private TrackBar trackBar;
 8     private int _value;
 9     
10     public event EventHandler ValueChanged;
11     
12     public int Value
13     {
14         get { return _value; }
15         set 
16         { 
17             _value = value;
18             numericUpDown.Value = value;
19             trackBar.Value = value;
20         }
21     }
22     
23     public int Minimum
24     {
25         get { return (int)numericUpDown.Minimum; }
26         set 
27         { 
28             numericUpDown.Minimum = value;
29             trackBar.Minimum = value;
30         }
31     }
32     
33     public int Maximum
34     {
35         get { return (int)numericUpDown.Maximum; }
36         set 
37         { 
38             numericUpDown.Maximum = value;
39             trackBar.Maximum = value;
40         }
41     }
42     
43     public NumericUpDownSliderControl()
44     {
45         InitializeComponent();
46         SetupEventHandlers();
47     }
48     
49     private void InitializeComponent()
50     {
51         this.numericUpDown = new NumericUpDown();
52         this.trackBar = new TrackBar();
53         
54         // 配置NumericUpDown
55         numericUpDown.Location = new System.Drawing.Point(0, 0);
56         numericUpDown.Size = new System.Drawing.Size(60, 20);
57         numericUpDown.Minimum = 0;
58         numericUpDown.Maximum = 100;
59         
60         // 配置TrackBar
61         trackBar.Location = new System.Drawing.Point(65, 0);
62         trackBar.Size = new System.Drawing.Size(135, 20);
63         trackBar.Minimum = 0;
64         trackBar.Maximum = 100;
65         trackBar.TickFrequency = 10;
66         
67         // 配置用户控件
68         this.Size = new System.Drawing.Size(200, 45);
69         this.Controls.Add(numericUpDown);
70         this.Controls.Add(trackBar);
71     }
72     
73     private void SetupEventHandlers()
74     {
75         numericUpDown.ValueChanged += (s, e) =>
76         {
77             _value = (int)numericUpDown.Value;
78             trackBar.Value = _value;
79             ValueChanged?.Invoke(this, EventArgs.Empty);
80         };
81         
82         trackBar.Scroll += (s, e) =>
83         {
84             _value = trackBar.Value;
85             numericUpDown.Value = _value;
86             ValueChanged?.Invoke(this, EventArgs.Empty);
87         };
88     }
89 }

2. 创建自定义UITypeEditor

继承UITypeEditor创建自定义编辑器,以下拉形式显示组合控件

 1 using System;
 2 using System.ComponentModel;
 3 using System.Drawing.Design;
 4 using System.Windows.Forms.Design;
 5 
 6 public class NumericUpDownSliderEditor : UITypeEditor
 7 {
 8     public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
 9     {
10         // 设置编辑风格为下拉模式[6](@ref)
11         return UITypeEditorEditStyle.DropDown;
12     }
13     
14     public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
15     {
16         // 获取编辑服务[6](@ref)
17         IWindowsFormsEditorService editorService = 
18             provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
19         
20         if (editorService != null && value is int)
21         {
22             NumericUpDownSliderControl editorControl = new NumericUpDownSliderControl();
23             editorControl.Value = (int)value;
24             editorControl.Minimum = 0; // 可根据需要从属性获取范围
25             editorControl.Maximum = 100;
26             
27             editorControl.ValueChanged += (s, e) =>
28             {
29                 // 值改变时立即更新
30                 value = editorControl.Value;
31             };
32             
33             editorService.DropDownControl(editorControl);
34         }
35         
36         return value;
37     }
38 }

3. 定义使用该编辑器的数据类

创建一个类,其属性使用自定义编辑器

 1 using System.ComponentModel;
 2 
 3 public class Settings
 4 {
 5     private int _sliderValue = 50;
 6     
 7     [DisplayName("数值调节")]
 8     [Description("使用数字框和滑动条同时调节数值")]
 9     [Editor(typeof(NumericUpDownSliderEditor), typeof(System.Drawing.Design.UITypeEditor))]
10     [DefaultValue(50)]
11     public int SliderValue
12     {
13         get { return _sliderValue; }
14         set 
15         { 
16             _sliderValue = value;
17             // 可在此添加属性变化处理逻辑
18         }
19     }
20     
21     // 其他属性...
22     [Category("基本设置")]
23     public string Name { get; set; }
24     
25     [Category("基本设置")]
26     [Description("普通数值属性")]
27     public int NormalValue { get; set; }
28 }

4. 在窗体中使用PropertyGrid

最后,在窗体中添加PropertyGrid并绑定数据对象

 1 public partial class MainForm : Form
 2 {
 3     private PropertyGrid propertyGrid;
 4     private Settings settings;
 5     
 6     public MainForm()
 7     {
 8         InitializeComponent();
 9         SetupPropertyGrid();
10     }
11     
12     private void SetupPropertyGrid()
13     {
14         // 创建PropertyGrid
15         propertyGrid = new PropertyGrid();
16         propertyGrid.Dock = DockStyle.Fill;
17         propertyGrid.ToolbarVisible = true;
18         propertyGrid.HelpVisible = true;
19         
20         // 创建设置对象并绑定
21         settings = new Settings();
22         propertyGrid.SelectedObject = settings;
23         
24         // 添加到窗体
25         this.Controls.Add(propertyGrid);
26         
27         // 可选:添加值改变事件处理
28         propertyGrid.PropertyValueChanged += (s, e) =>
29         {
30             MessageBox.Show($"值已更改为: {settings.SliderValue}");
31         };
32     }
33 }

 

http://www.zskr.cn/news/79385.html

相关文章:

  • 北京专注婚姻家事的律所:服务特点与业务细分观察
  • openstack基础——各组件交互过程总结
  • 北京知名家事律所排名:聚焦婚姻家事法律服务机构参考
  • (最新)2026有哪些好用的降ai率工具?亲测5个靠谱平台,这个真能把AI率降下去!
  • 改善免疫力的灵芝推荐几款,这些品牌口碑之选
  • 2025年广东快思聪4k分布式编码器服务权威推荐榜单:快思聪4k编码器/快思聪编码器/快思聪分布式4k编码器服务商精选
  • 数字服务贸易浪潮下,广州数融互联网小额贷款有限公司如何破局?
  • 2025公认有效防脱洗发水TOP10:对症脱发成因选择,有效减少脱发
  • 2025企业短视频引流营销服务TOP5权威推荐:助力企业获客
  • 2025年12月成都离婚分房产律师 TOP3 推荐:李航律师16年实战,离婚房产纠纷首选
  • 2025年质量好的铁碳填料厂家推荐及选择参考
  • 2025年湖南智能生物脑电波反馈训练系统服务商权威推荐榜单:3D电子沙盘‌/团体反馈系统‌/智能拥抱引导系统源头服务商精选
  • 2025 南通购买商标平台测评:5 家靠谱平台对比,选对省时间省成本
  • 2025年砂光辊五大品牌厂家推荐:砂光辊来图定制靠谱供应商有
  • Misinformation Detection using Large Language Models with Explainability
  • 降ai率工具哪个好?五款实用工具推荐解析
  • Entity 查询:解决可观测性系统中实体检索与跨域联合查询的痛点
  • 降ai率免费网站推荐:高效AI论文工具实用指南
  • 2025年口碑好的力位移监控油压机/智能油压机用户好评厂家排行
  • 智能燃气表
  • VS Code——Live Server的简介、安装与使用
  • 42. 接雨水
  • 2025年如何选择靠谱的广东市场全屋定制制造商?
  • 2025年12月减持节税服务机构推荐:专业评测榜与口碑评价深度分析报告
  • 江苏省刑事律所推荐:如何选择专业法律服务机构
  • 2025年12月甘肃全屋定制推荐:欧比亚全屋定制公司,以匠人精神定义西北家居新标杆
  • 螺旋卸料离心机/卧式螺旋卸料沉降离心机生产厂TOP5权威推荐
  • 2025年顶级极简护眼吸顶灯供应商及源头厂家有哪些推荐?
  • 2025年十大全域外卖服务商排行榜,斯创全域外卖可靠吗?
  • 2025年12月麦冬苗批发基地推荐榜:核心产区供应商综合对比与排名分析