• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

C#控件PropertyGrid使用

武飞扬头像
Chen_Kaien
帮助1

一、创建winform并在界面添加propertyGrid控件。

二、创建一个类并新增需要的属性和字段,用于添加到propertyGrid控件上显示,并用XML序列化和反序列化,保存在本地和读取显示。

三、用特性设定类中属性和字段,在propertyGrid控件上的:名称、显示、分组、描述。

四、用反射设定propertyGrid控件第1列(属性名称)的列宽,说明窗口高度,属性显示或隐藏

  1.  
     
  2.  
    using System;
  3.  
    using System.ComponentModel;
  4.  
    using System.IO;
  5.  
    using System.Runtime.Serialization;
  6.  
    using System.Xml.Serialization;
  7.  
     
  8.  
    namespace LearningRecords
  9.  
    {
  10.  
    /// <summary>
  11.  
    /// 自定义属性下拉效果的类,该类主要继承StringConverter类,并重载该类的一些虚拟方法
  12.  
    /// </summary>
  13.  
    public class genderItem : StringConverter
  14.  
    {
  15.  
    //true 启用,false 禁用
  16.  
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
  17.  
    {
  18.  
    return true;
  19.  
    }
  20.  
     
  21.  
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
  22.  
    {
  23.  
    return new StandardValuesCollection(new string[] { "MoveMinPowerDiff", "MoveMaxPowerSum" }); //编辑下拉框中的items
  24.  
    }
  25.  
     
  26.  
    //true:禁用文本编辑,false:启用文本编辑
  27.  
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
  28.  
    {
  29.  
    return true;
  30.  
    }
  31.  
    }
  32.  
     
  33.  
    / <summary>
  34.  
    /
  35.  
    / </summary>
  36.  
    //[XmlInclude(typeof(DeviceSetting))]
  37.  
    //[TypeConverter(typeof(ExpandableObjectConverter)), Category("参数")]
  38.  
    public class DeviceSetting
  39.  
    {
  40.  
     
  41.  
    private int singleScanMode_m;
  42.  
     
  43.  
    /// <summary>
  44.  
    /// 单轴扫描模式,0=范围步长方式,1=范围速度方式,2=递增方式
  45.  
    /// </summary>
  46.  
    [Browsable(true)]//是否在窗口显示
  47.  
    [Category("1.扫描参数")]//对参数进行分组
  48.  
    [DisplayName("单轴扫描模式")]//设置参数显示名称
  49.  
    [Description("0=范围(步长)\r\n1=范围(速度),2=递增")]//参数描述
  50.  
    public int SingleScanMode
  51.  
    {
  52.  
    get
  53.  
    {
  54.  
    return singleScanMode_m;
  55.  
    }
  56.  
     
  57.  
    set
  58.  
    {
  59.  
    if (value < 0 || value > 2)//限制设定值,避免错误
  60.  
    {
  61.  
    throw new Exception("给定的模式只能是:0,1,2");//抛出异常提示
  62.  
    }
  63.  
    singleScanMode_m = value;
  64.  
    }
  65.  
    }
  66.  
     
  67.  
    #region//常用参数
  68.  
    /// <summary>
  69.  
    /// PI耦合扫描范围um
  70.  
    /// </summary>
  71.  
    //[ReadOnly(false)]//是否只读
  72.  
    //[DefaultValue(false)]//默认值
  73.  
     
  74.  
    [Browsable(false)]//是否在窗口显示
  75.  
    [Category("1.参数1")]//对参数进行分组
  76.  
    [DisplayName("设备名称")]//设置参数显示名称
  77.  
    [Description("以此保存加载参数")]//参数描述
  78.  
    public string DevName
  79.  
    {
  80.  
    get;
  81.  
    set;
  82.  
    }
  83.  
     
  84.  
    /// <summary>
  85.  
    /// 扫描步长um
  86.  
    /// </summary>
  87.  
    [Browsable(true)]//是否在窗口显示
  88.  
    [Category("2.参数2")]//对参数进行分组
  89.  
    [DisplayName("扫描步长um")]//设置参数显示名称
  90.  
    [Description("最小步长为0.1um")]//参数描述
  91.  
    public double ScanStep
  92.  
    {
  93.  
    get;
  94.  
    set;
  95.  
    }
  96.  
     
  97.  
    /// <summary>
  98.  
    /// Z轴最大绝对位置mm
  99.  
    /// </summary>
  100.  
    [Browsable(true)]//是否在窗口显示
  101.  
    [Category("2.参数2")]//对参数进行分组
  102.  
    [DisplayName("Z轴最大绝对位置mm")]//设置参数显示名称
  103.  
    [Description("芯片与耦合头最小间距\r\n安全防呆以免碰撞")]//参数描述
  104.  
    public double MaxPosZ
  105.  
    {
  106.  
    get;
  107.  
    set;
  108.  
    }
  109.  
     
  110.  
    /// <summary>
  111.  
    /// 额定参考值
  112.  
    /// </summary>
  113.  
    [Browsable(true)]//是否在窗口显示
  114.  
    [Category("2.参数2")]//对参数进行分组
  115.  
    [DisplayName("额定参考值")]//设置参数显示名称
  116.  
    [Description("判定扫描结果\r\n及自动跟随时是否运动")]//参数描述
  117.  
    public double RatedRefValue
  118.  
    {
  119.  
    get;
  120.  
    set;
  121.  
    }
  122.  
     
  123.  
    /// <summary>
  124.  
    /// 多路耦合尾光束额定参考值
  125.  
    /// </summary>
  126.  
    [Browsable(true)]//是否在窗口显示
  127.  
    [Category("3.参数3")]//对参数进行分组
  128.  
    [DisplayName("尾光束参考值")]//设置参数显示名称
  129.  
    [Description("判定多路耦合,\r\n尾光束功率是否达标")]//参数描述
  130.  
    public double RatedRefValue_End
  131.  
    {
  132.  
    get;
  133.  
    set;
  134.  
    }
  135.  
     
  136.  
    /// <summary>
  137.  
    /// 扫描范围um
  138.  
    /// </summary>
  139.  
    [Browsable(true)]//是否在窗口显示
  140.  
    [Category("3.参数3")]//对参数进行分组
  141.  
    [DisplayName("扫描范围um")]//设置参数显示名称
  142.  
    [Description("单边最大移动距离\r\n如100um则总长200um")]//参数描述
  143.  
    public double ScanRange
  144.  
    {
  145.  
    get;
  146.  
    set;
  147.  
    }
  148.  
     
  149.  
    /// <summary>
  150.  
    /// 单方向扫描一直递减时,最大移动的步长次数--爬山算法扩展
  151.  
    /// </summary>
  152.  
    [Browsable(true)]//是否在窗口显示
  153.  
    [Category("3.参数3")]//对参数进行分组
  154.  
    [DisplayName("单方向递减次数")]//设置参数显示名称
  155.  
    [Description("参考值连续递减次数\r\n超过此值则反方向找寻")]//参数描述
  156.  
    public uint DecrementNum
  157.  
    {
  158.  
    get;
  159.  
    set;
  160.  
    }
  161.  
     
  162.  
    /// <summary>
  163.  
    /// 角度扫描完后,移动的函数
  164.  
    /// </summary>
  165.  
    [Browsable(true)]//是否在窗口显示
  166.  
    [Category("4.算法参数")]//对参数进行分组
  167.  
    [DisplayName("多路-移动函数")]//设置参数显示名称
  168.  
    [Description("RzRy轴角度扫描完后,\r\n移动到最佳点函数")]//参数描述
  169.  
    [TypeConverter(typeof(genderItem))] //使用自定义的属性下拉item类3.项目参数
  170.  
    public string MethodName
  171.  
    {
  172.  
    get;
  173.  
    set;
  174.  
    }
  175.  
     
  176.  
    #endregion
  177.  
     
  178.  
    /// <summary>
  179.  
    ///
  180.  
    /// </summary>
  181.  
    public DeviceSetting()
  182.  
    {
  183.  
    RatedRefValue = -0.15;
  184.  
    RatedRefValue_End = -15;
  185.  
     
  186.  
    MaxPosZ = 10;
  187.  
    ScanStep = 0.001;
  188.  
    ScanRange = 0.5;
  189.  
    DecrementNum = 5;
  190.  
    }
  191.  
     
  192.  
    /// <summary>
  193.  
    ///
  194.  
    /// </summary>
  195.  
    /// <param name="strName">硬件名称</param>
  196.  
    /// <returns></returns>
  197.  
    public DeviceSetting(string strName)
  198.  
    {
  199.  
    DevName = strName;
  200.  
    }
  201.  
     
  202.  
    /// <summary>
  203.  
    /// 加载参数
  204.  
    /// </summary>
  205.  
    /// <param name="strName">硬件名称</param>
  206.  
    /// <returns></returns>
  207.  
    public static DeviceSetting Load(string strName)
  208.  
    {
  209.  
    DeviceSetting setting = new DeviceSetting();
  210.  
    string configFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strName "_Config.xml");
  211.  
     
  212.  
    if(File.Exists(configFileName))
  213.  
    {
  214.  
    FileStream fs = new FileStream(configFileName, FileMode.Open);
  215.  
    try
  216.  
    {
  217.  
    XmlSerializer formatter = new XmlSerializer(typeof(DeviceSetting));
  218.  
    setting = (DeviceSetting)formatter.Deserialize(fs);
  219.  
    }
  220.  
    catch (SerializationException e)
  221.  
    {
  222.  
    Console.WriteLine("Failed to deserialize. Reason: " e.Message);
  223.  
    }
  224.  
    finally
  225.  
    {
  226.  
    fs.Close();
  227.  
    }
  228.  
    }
  229.  
     
  230.  
    setting.DevName = strName;
  231.  
     
  232.  
    return setting;
  233.  
    }
  234.  
     
  235.  
    /// <summary>
  236.  
    /// 保存参数
  237.  
    /// </summary>
  238.  
    /// <returns></returns>
  239.  
    public bool Save()
  240.  
    {
  241.  
    if (string.IsNullOrEmpty(DevName))
  242.  
    return false;
  243.  
     
  244.  
    bool result = true;
  245.  
    string configFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DevName "_Config.xml");
  246.  
    FileStream fs = new FileStream(configFileName, FileMode.Create);
  247.  
    XmlSerializer formatter = new XmlSerializer(typeof(DeviceSetting));
  248.  
    try
  249.  
    {
  250.  
    formatter.Serialize(fs, this);
  251.  
    }
  252.  
    catch (SerializationException e)
  253.  
    {
  254.  
    Console.WriteLine("Failed to serialize. Reason: " e.Message);
  255.  
    result = false;
  256.  
    }
  257.  
    finally
  258.  
    {
  259.  
    fs.Close();
  260.  
    }
  261.  
    return result;
  262.  
    }
  263.  
    }
  264.  
    }
学新通
  1.  
    using System;
  2.  
    using System.Collections.Generic;
  3.  
    using System.ComponentModel;
  4.  
    using System.Data;
  5.  
    using System.Drawing;
  6.  
    using System.IO;
  7.  
    using System.Linq;
  8.  
    using System.Reflection;
  9.  
    using System.Text;
  10.  
    using System.Threading.Tasks;
  11.  
    using System.Windows.Forms;
  12.  
     
  13.  
    namespace LearningRecords
  14.  
    {
  15.  
    public partial class Form1 : Form
  16.  
    {
  17.  
    DeviceSetting m_Setting;
  18.  
    public Form1()
  19.  
    {
  20.  
    InitializeComponent();
  21.  
    }
  22.  
     
  23.  
    private void Form1_Load(object sender, EventArgs e)
  24.  
    {
  25.  
    m_Setting = DeviceSetting.Load("配置文件");
  26.  
    propertyGrid1.SelectedObject = m_Setting;
  27.  
     
  28.  
    int width = Convert.ToInt32(propertyGrid1.Width * 0.7);
  29.  
    int height = Convert.ToInt32(propertyGrid1.Height * 0.2);
  30.  
    SetPropertyGridColumnWidth(propertyGrid1, width);
  31.  
    SetDescriptionHeight(propertyGrid1, height);
  32.  
    }
  33.  
     
  34.  
    private void AddLog(string strLog)
  35.  
    {
  36.  
    if (strLog == null || strLog == "")
  37.  
    {
  38.  
    return;
  39.  
    }
  40.  
    string logFilePath = string.Format(@"D:\Data\Log\{0}\{1}.csv", DateTime.Now.ToString("yyyMM"), DateTime.Now.ToString("yyyMMdd"));
  41.  
    string dirPath = Path.GetDirectoryName(logFilePath);
  42.  
    if (!Directory.Exists(dirPath))
  43.  
    {
  44.  
    Directory.CreateDirectory(dirPath);
  45.  
    }
  46.  
    strLog = DateTime.Now.ToString("HH:mm:ss.f") "," strLog;
  47.  
    string strError = "";
  48.  
     
  49.  
    try
  50.  
    {
  51.  
    File.AppendAllText(logFilePath, strLog "\r\n", Encoding.UTF8);
  52.  
    }
  53.  
    catch (Exception ex)
  54.  
    {
  55.  
    strError = DateTime.Now.ToString("HH:mm:ss.f") "," ex.Message.ToString();
  56.  
    }
  57.  
     
  58.  
    this.Invoke((MethodInvoker)delegate
  59.  
    {
  60.  
    lstShowLog.Items.Add(strLog);
  61.  
    if (strError != "")
  62.  
    {
  63.  
    lstShowLog.Items.Add(strError);
  64.  
    }
  65.  
     
  66.  
    lstShowLog.SelectedIndex = lstShowLog.Items.Count - 1;
  67.  
    lstShowLog.TopIndex = lstShowLog.Items.Count - 1;
  68.  
     
  69.  
    if (lstShowLog.Items.Count > 200)//满200行,就删除前190行
  70.  
    {
  71.  
    for (int i = 0; i < 40; i )
  72.  
    {
  73.  
    lstShowLog.Items.RemoveAt(0);
  74.  
    }
  75.  
    }
  76.  
    });
  77.  
    }
  78.  
     
  79.  
    /// <summary>
  80.  
    /// 设置propertyGrid第1列(属性名称)的列宽
  81.  
    /// </summary>
  82.  
    /// <param name="grid"></param>
  83.  
    /// <param name="width"></param>
  84.  
    private void SetPropertyGridColumnWidth(PropertyGrid grid, int width)
  85.  
    {
  86.  
    try
  87.  
    {
  88.  
    if (grid == null)
  89.  
    return;
  90.  
     
  91.  
    FieldInfo fi = grid.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic);
  92.  
    if (fi == null)
  93.  
    return;
  94.  
     
  95.  
    Control view = fi.GetValue(grid) as Control;
  96.  
    if (view == null)
  97.  
    return;
  98.  
     
  99.  
    MethodInfo mi = view.GetType().GetMethod("MoveSplitterTo", BindingFlags.Instance | BindingFlags.NonPublic);
  100.  
    if (mi == null)
  101.  
    return;
  102.  
    mi.Invoke(view, new object[] { width });
  103.  
    }
  104.  
    catch (Exception ex)
  105.  
    {
  106.  
    AddLog("设置属性窗格名称列宽异常:" ex.ToString());
  107.  
    }
  108.  
    }
  109.  
     
  110.  
    /// <summary>
  111.  
    /// 设置propertyGrid说明窗格高度
  112.  
    /// </summary>
  113.  
    /// <param name="grid"></param>
  114.  
    /// <param name="height"></param>
  115.  
    private void SetDescriptionHeight(PropertyGrid grid, int height)
  116.  
    {
  117.  
    try
  118.  
    {
  119.  
    if (grid == null)
  120.  
    return;
  121.  
     
  122.  
    foreach (Control control in grid.Controls)
  123.  
    {
  124.  
    if (control.GetType().Name == "DocComment")
  125.  
    {
  126.  
    control.Invoke((MethodInvoker)delegate
  127.  
    {
  128.  
    control.Height = height;
  129.  
    FieldInfo fieldInfo = control.GetType().BaseType.GetField("userSized", BindingFlags.Instance | BindingFlags.NonPublic);
  130.  
    fieldInfo.SetValue(control, true);
  131.  
    });
  132.  
    }
  133.  
    }
  134.  
    }
  135.  
    catch (Exception error)
  136.  
    {
  137.  
    AddLog("设置属性说明窗格高度异常:" error.ToString());
  138.  
    }
  139.  
    }
  140.  
     
  141.  
    /// <summary>
  142.  
    /// 通过反射以“类别属性”名称判别是否可见
  143.  
    /// </summary>
  144.  
    /// <param name="obj">属性对象</param>
  145.  
    /// <param name="showCategoryContains">需显示的属性名称包含字符串</param>
  146.  
    /// <param name="hideCategoryContains">需隐藏的属性名称包含字符串</param>
  147.  
    public static void SetCategoryVisibility(object obj, string showCategoryContains, string hideCategoryContains)
  148.  
    {
  149.  
    Type typeBrow = typeof(BrowsableAttribute);
  150.  
    Type typeCate = typeof(CategoryAttribute);
  151.  
     
  152.  
    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
  153.  
     
  154.  
    for (int i = 0; i < props.Count; i )
  155.  
    {
  156.  
    AttributeCollection attrs = props[i].Attributes;//获取特性集合,索引、属性名称都可以获取
  157.  
     
  158.  
    CategoryAttribute category = (CategoryAttribute)attrs[typeCate];
  159.  
    if (showCategoryContains != "" && category.Category.Contains(showCategoryContains))
  160.  
    {
  161.  
    FieldInfo fld = typeBrow.GetField("browsable", BindingFlags.Instance | BindingFlags.NonPublic);
  162.  
    fld.SetValue(attrs[typeBrow], true);
  163.  
    }
  164.  
     
  165.  
    if (hideCategoryContains != "" && category.Category.Contains(hideCategoryContains))
  166.  
    {
  167.  
    FieldInfo fld = typeBrow.GetField("browsable", BindingFlags.Instance | BindingFlags.NonPublic);
  168.  
    fld.SetValue(attrs[typeBrow], false);
  169.  
    }
  170.  
    }
  171.  
    }
  172.  
     
  173.  
    /// <summary>
  174.  
    /// 通过反射以“显示名称”判别是否可见
  175.  
    /// </summary>
  176.  
    /// <param name="obj">属性对象</param>
  177.  
    /// <param name="showNameContains">需显示的名称包含字符串</param>
  178.  
    /// <param name="hideNameContains">需隐藏的名称包含字符串</param>
  179.  
    public static void SetDisplayNameyVisibility(object obj, string showNameContains, string hideNameContains)
  180.  
    {
  181.  
    Type typeBrow = typeof(BrowsableAttribute);
  182.  
    Type typeCate = typeof(DisplayNameAttribute);
  183.  
     
  184.  
    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
  185.  
     
  186.  
    for (int i = 0; i < props.Count; i )
  187.  
    {
  188.  
    AttributeCollection attrs = props[i].Attributes;//获取特性集合,索引、属性名称都可以获取
  189.  
     
  190.  
    DisplayNameAttribute display = (DisplayNameAttribute)attrs[typeCate];
  191.  
    if (showNameContains != "" && display.DisplayName.Contains(showNameContains))
  192.  
    {
  193.  
    FieldInfo fld = typeBrow.GetField("browsable", BindingFlags.Instance | BindingFlags.NonPublic);
  194.  
    fld.SetValue(attrs[typeBrow], true);
  195.  
    }
  196.  
     
  197.  
    if (hideNameContains != "" && display.DisplayName.Contains(hideNameContains))
  198.  
    {
  199.  
    FieldInfo fld = typeBrow.GetField("browsable", BindingFlags.Instance | BindingFlags.NonPublic);
  200.  
    fld.SetValue(attrs[typeBrow], false);
  201.  
    }
  202.  
    }
  203.  
    }
  204.  
     
  205.  
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  206.  
    {
  207.  
    if(m_Setting !=null)
  208.  
    {
  209.  
    m_Setting.Save();
  210.  
    }
  211.  
    }
  212.  
    }
  213.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghfbgf
系列文章
更多 icon
同类精品
更多 icon
继续加载