ValuePanel.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Reflection;
  10. using CommonLang.Property;
  11. using CommonFroms.Utils;
  12. using System.Drawing.Design;
  13. using CommonLang;
  14. using System.Collections;
  15. using CommonFroms.G2D.DataGrid;
  16. namespace CommonFroms.DescAttributeEdit
  17. {
  18. public partial class ValuePanel : UserControl
  19. {
  20. public object EditValue { get; private set; }
  21. private IG2DPropertyAdapter[] value_adapters;
  22. public ValuePanel()
  23. {
  24. InitializeComponent();
  25. this.propertyGrid1.PropertySort = PropertySort.Categorized;
  26. }
  27. public void SetAdapters(IG2DPropertyAdapter[] adapters)
  28. {
  29. this.value_adapters = CUtils.ArrayLink<IG2DPropertyAdapter>(adapters, new ValuePanelAdapter(adapters));
  30. }
  31. public void SetValue(object obj)
  32. {
  33. this.EditValue = obj;
  34. this.propertyGrid1.SelectedObject = new G2DPropertyDescriptor(obj, value_adapters);
  35. }
  36. class ValuePanelAdapter : IG2DPropertyAdapter
  37. {
  38. private IG2DPropertyAdapter[] adapters;
  39. public ValuePanelAdapter(IG2DPropertyAdapter[] adapters)
  40. {
  41. this.adapters = adapters;
  42. }
  43. public UITypeEditor GetEditor(MemberInfo field, Type fieldType, object ownerData)
  44. {
  45. return new ValuePanelUITypeEditor(adapters, field, ownerData);
  46. }
  47. public TypeConverter GetConverter(MemberInfo field, Type fieldType, object ownerData)
  48. {
  49. return null;
  50. }
  51. }
  52. class ValuePanelUITypeEditor : G2DMemberUITypeEditor
  53. {
  54. private IG2DPropertyAdapter[] adapters;
  55. private DescAttribute desc;
  56. public ValuePanelUITypeEditor(IG2DPropertyAdapter[] adapters, MemberInfo field, object ownerData)
  57. : base(field, ownerData)
  58. {
  59. this.adapters = CUtils.ArrayLink<IG2DPropertyAdapter>(adapters, new ValuePanelAdapter(adapters));
  60. this.desc = PropertyUtil.GetAttribute<DescAttribute>(field);
  61. }
  62. public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
  63. {
  64. if (fieldType.IsPrimitive)
  65. {
  66. return UITypeEditorEditStyle.None;
  67. }
  68. else if (fieldType.IsEnum)
  69. {
  70. return UITypeEditorEditStyle.None;
  71. }
  72. else if (fieldType.Equals(typeof(string)))
  73. {
  74. return UITypeEditorEditStyle.None;
  75. }
  76. else if (fieldType.IsClass)
  77. {
  78. return UITypeEditorEditStyle.Modal;
  79. }
  80. else if (fieldType.IsArray)
  81. {
  82. return UITypeEditorEditStyle.Modal;
  83. }
  84. return UITypeEditorEditStyle.Modal;
  85. }
  86. public override object EditValue(
  87. ITypeDescriptorContext context,
  88. IServiceProvider provider,
  89. object value)
  90. {
  91. ListAttribute listattr = PropertyUtil.GetAttribute<ListAttribute>(fieldInfo);
  92. if (listattr != null)
  93. {
  94. G2DCollectionEditor editor = new G2DCollectionEditor(
  95. fieldType,
  96. value,
  97. listattr.ElementTypes.ToArray(),
  98. adapters);
  99. if (editor.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  100. {
  101. return editor.GetEditCompleteData();
  102. }
  103. }
  104. else
  105. {
  106. object result = ValueTypeDialog.ShowValueDialog(
  107. null, "设置 " + desc.Desc, fieldType, value, adapters);
  108. if (result != null)
  109. {
  110. return result;
  111. }
  112. }
  113. return base.EditValue(context, provider, value);
  114. }
  115. }
  116. }
  117. }