请选择 进入手机版 | 继续访问电脑版

[C#教程] C# PropertyGrid使用 案例详解

[复制链接]
查看189 | 回复41 | 2021-9-12 13:17:30 | 显示全部楼层 |阅读模式

1. 只有public的property能表现 出来,可以通过BrowsableAttribute来控制是否表现 ,通过CategoryAttribute设置分类,通过DescriptionAttribute设置形貌 ,Attribute可以加在Class上,也可以加在属性上,属性上的Attribute优先级更高;

2. enum会主动 使用 列表框表示;

3. 自带输入有用 性检查,如int范例 输入double数值,会弹出提示对话框;

4. 基本范例 Array:增长 删除只能通过弹出的集合编辑器,修改可以直接睁开 ,值为null时,可以通过集合编辑器创建;

5. 基本范例 List:增编削 都只能通过集合编辑器,值为null时,能打开集合编辑器,但不能保存结果 ,以是 必须初始化;

6. ReadOnlyAttribute设置为true时,表现 为灰色;对List无效,可以打开集合编辑器,在集合编辑器内可以举行 增编削 ;应用于Array时,不能打开集合编辑器,即不能增删,但可以通过睁开 的方式修改Array元素;

7. 对象:值表现 Object.ToString();Class上加了[TypeConverter(typeof(ExpandableObjectConverter))]之后(也可以加在属性上),才能睁开 编辑,否则表现 为灰色只读;不初始化什么也干不了;

8. 基类范例 派生类对象:与平凡 对象没有区别,[TypeConverter(typeof(ExpandableObjectConverter))]加在基类上即可;

9. 对象Array:增长 删除只能通过弹出的集合编辑器,修改可以直接睁开 ,值为null时,可以通过集合编辑器创建;

10. 对象List:增长 删除修改只能通过弹出的集合编辑器,值为null时,能打开集合编辑器,但不能保存结果 ,以是 必须初始化;

11. Hashtable和Dictionary能打开集合编辑器,但不能编辑;

12. 通过MyDoubleConverter实现Double范例 只表现 小数点后两位:

  1. public class MyDoubleConverter : DoubleConverter
  2. {
  3. public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
  4. {
  5. if (destinationType == typeof(string))
  6. {
  7. return string.Format("{0:0.00}", value);
  8. }
  9. return base.ConvertTo(context, culture, value, destinationType);
  10. }
  11. }
复制代码

13. 通过TypeConverter实现用字符串表示对象

  1. [TypeConverter(typeof(StudentConverter))]
  2. public class Student
  3. {
  4. public Student(string name, int age)
  5. {
  6. Name = name;
  7. Age = age;
  8. }
  9. public string Name { get; set; }
  10. public int Age { get; set; }
  11. public static Student FromString(string s)
  12. {
  13. string name = "Default";
  14. int age = 0;
  15. string[] splits = s.Split(',');
  16. if (splits.Length == 2)
  17. {
  18. name = splits[0];
  19. int.TryParse(splits[1], out age);
  20. }
  21. return new Student(name, age);
  22. }
  23. public override string ToString()
  24. {
  25. return string.Format("{0},{1}", Name, Age);
  26. }
  27. }
  28. public class StudentConverter : TypeConverter
  29. {
  30. public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType)
  31. {
  32. if (sourceType == typeof(string))
  33. {
  34. return true;
  35. }
  36. return base.CanConvertFrom(context, sourceType);
  37. }
  38. public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
  39. {
  40. Student result = null;
  41. if ((value as string) != null)
  42. {
  43. result = Student.FromString(value as string);
  44. }
  45. return result;
  46. }
  47. public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
  48. {
  49. if (destinationType == typeof(string))
  50. {
  51. return true;
  52. }
  53. return base.CanConvertTo(context, destinationType);
  54. }
  55. public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
  56. {
  57. if (destinationType == typeof(string))
  58. {
  59. return value.ToString();
  60. }
  61. return base.ConvertTo(context, culture, value, destinationType);
  62. }
  63. }
复制代码

14. 使用 UITypeEditor实现文件或目次 选择

  1. // 需要在项目里添加引用:程序集|框架|System.Design
  2. [Editor(typeof(FileNameEditor), typeof(UITypeEditor))]
  3. public string FileName { get; set; }
  4. [Editor(typeof(FolderNameEditor), typeof(UITypeEditor))]
  5. public string FolderName { get; set; }
复制代码

15. 使用 自定义的下拉式编辑界面

  1. public class MyAddress
  2. {
  3. public string Province { get; set; }
  4. public string City { get; set; }
  5. public override string ToString()
  6. {
  7. return string.Format("{0}-{1}", Province, City);
  8. }
  9. }
  10. public class MyAddressEditor : UITypeEditor
  11. {
  12. public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
  13. {
  14. return UITypeEditorEditStyle.DropDown;
  15. }
  16. public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
  17. {
  18. IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
  19. if (service != null)
  20. {
  21. service.DropDownControl(new MyEditorControl(value as MyAddress));
  22. }
  23. return value;
  24. }
  25. }
  26. // 实现两个ComboBox用来编辑MyAddress的属性
  27. public partial class MyEditorControl : UserControl
  28. {
  29. private MyAddress _address;
  30. public MyEditorControl(MyAddress address)
  31. {
  32. InitializeComponent();
  33. _address = address;
  34. comboBoxProvince.Text = _address.Province;
  35. comboBoxCity.Text = _address.City;
  36. }
  37. private void comboBoxProvince_SelectedIndexChanged(object sender, EventArgs e)
  38. {
  39. _address.Province = comboBoxProvince.Text;
  40. }
  41. private void comboBoxCity_SelectedIndexChanged(object sender, EventArgs e)
  42. {
  43. _address.City = comboBoxCity.Text;
  44. }
  45. }
  46. // MyAddress属性声明
  47. [Editor(typeof(MyAddressEditor), typeof(UITypeEditor))]
  48. public MyAddress Address { get; set; }
复制代码

结果 如图:

C# PropertyGrid使用

案例详解

16. 实现弹出式编辑对话框,只要将UserControl改成Form,EditStyle改成Modal,service.DropDownControl改成service.ShowDialog

  1. public partial class MyEditorForm : Form
  2. {
  3. private MyAddress _address;
  4. public MyEditorForm(MyAddress address)
  5. {
  6. InitializeComponent();
  7. _address = address;
  8. comboBoxProvince.Text = _address.Province;
  9. comboBoxCity.Text = _address.City;
  10. }
  11. private void comboBoxProvince_SelectedIndexChanged(object sender, EventArgs e)
  12. {
  13. _address.Province = comboBoxProvince.Text;
  14. }
  15. private void comboBoxCity_SelectedIndexChanged(object sender, EventArgs e)
  16. {
  17. _address.City = comboBoxCity.Text;
  18. }
  19. }
  20. public class MyAddressEditor : UITypeEditor
  21. {
  22. public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
  23. {
  24. return UITypeEditorEditStyle.Modal;
  25. }
  26. public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
  27. {
  28. IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
  29. if (service != null)
  30. {
  31. service.ShowDialog(new MyEditorForm(value as MyAddress));
  32. }
  33. return value;
  34. }
  35. }
复制代码

17. 暗码 表示:[PasswordPropertyText(true)]

18. 动态表现 /埋伏 属性

  1. class MyData
  2. {
  3. public static void SetPropertyAttribute(object obj, string propertyName, Type attrType, string attrField, object value)
  4. {
  5. PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
  6. Attribute attr = props[propertyName].Attributes[attrType];
  7. FieldInfo field = attrType.GetField(attrField, BindingFlags.Instance | BindingFlags.NonPublic);
  8. field.SetValue(attr, value);
  9. }
  10. private bool _ShowPassword = false;
  11. public bool ShowPassword
  12. {
  13. get { return _ShowPassword; }
  14. set
  15. {
  16. _ShowPassword = value;
  17. SetPropertyAttribute(this, "Password", typeof(BrowsableAttribute), "browsable", _ShowPassword);
  18. }
  19. }
  20. [PasswordPropertyText(true)]
  21. [Browsable(true)]
  22. public string Password { get; set; }
  23. }
  24. public partial class MainFrm : Form
  25. {
  26. // 不添加PropertyValueChanged事件,不能实现动态显示/隐藏
  27. private void myData_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
  28. {
  29. this.myData.SelectedObject = this.myData.SelectedObject;
  30. }
  31. }
复制代码

19. 提供下拉选项的string

  1. public class ListStringConverter : StringConverter
  2. {
  3. public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
  4. {
  5. return true;
  6. }
  7. public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
  8. {
  9. return new StandardValuesCollection(new string[] { "A", "B" });
  10. }
  11. public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
  12. {
  13. return false;
  14. }
  15. }
  16. [TypeConverter(typeof(ListStringConverter))]
  17. public string Name { get; set; }
复制代码

到此这篇关于C# PropertyGrid使用 案例详解的文章就先容 到这了,更多干系 C# PropertyGrid使用 内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 沙941 | 2021-9-15 22:18:37 | 显示全部楼层
论坛的人气不行了!
回复

使用道具 举报

avatar 疑骨德秋忘 | 2021-9-16 03:12:33 | 显示全部楼层
楼上的说的很多!
回复

使用道具 举报

avatar 永远丶并不远 | 2021-9-18 19:42:37 | 显示全部楼层
最近精神病院在打折,admin楼主去看看吧?
回复

使用道具 举报

avatar 找食的麻雀粮 | 2021-9-19 01:30:12 | 显示全部楼层
不错的帖子,值得收藏!
回复

使用道具 举报

avatar 安桐AnnTong | 2021-9-20 23:02:04 | 显示全部楼层
顶一下,收藏了!
回复

使用道具 举报

avatar 亦池 | 2021-9-21 05:15:05 | 显示全部楼层
不灌水就活不下去了啊!
回复

使用道具 举报

avatar 李圆子wzl | 2021-9-21 05:15:08 | 显示全部楼层
收藏了,以后可能会用到!
回复

使用道具 举报

avatar 蓝色妖姬2017 | 2021-9-22 14:59:03 | 显示全部楼层
楼上的忘记吃药了!
回复

使用道具 举报

avatar 123457710 | 2021-9-23 07:11:57 | 显示全部楼层
看帖、回帖、拿分、走人
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则