annotate Demo/WinForms/Forms/BizEntityForm.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.ComponentModel;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Drawing;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Windows.Forms;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using Microsoft.Win32;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.Validation;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using BLToolkit.Demo.ObjectModel;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 namespace BLToolkit.Demo.Forms
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 public class BizEntityForm<F,T> : Form
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 where F : BizEntityForm<F,T>, new()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 where T : BizEntity
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 #region Static Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 public static bool Edit(T entity, Action<T> saveAction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 T clone = (T)entity.Clone();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 F form = new F();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 form.SetBizEntity(clone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 form.Init(clone, delegate
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 saveAction(clone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 clone.CopyTo(entity);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 entity.AcceptChanges();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 return form.ShowDialog() == DialogResult.OK;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 public static T EditNew(Action<T> saveAction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 T entity = TypeAccessor<T>.CreateInstanceEx();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 F form = new F();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 form.SetBizEntity(entity);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 form.Init(entity, delegate
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 saveAction(entity);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 entity.AcceptChanges();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 return form.ShowDialog() == DialogResult.OK? entity: null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 private void Init(BizEntity entity, SaveHandler saveHandler)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 if (AcceptButton is Button)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 ((Button)AcceptButton).Click += SaveEntity;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 _entity = entity;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 _saveHandler = saveHandler;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 #region Abstracts
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 protected virtual void SetBizEntity(T entity)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 throw new NotImplementedException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 #region SaveEntity Handler
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 private delegate void SaveHandler();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 private SaveHandler _saveHandler;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 private BizEntity _entity;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 protected void SaveEntity(object sender, EventArgs e)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 if (_entity.IsDirty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 _entity.Validate();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 UseWaitCursor = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 _saveHandler();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 UseWaitCursor = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 DialogResult = DialogResult.OK;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 Close();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 catch (Exception ex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 UseWaitCursor = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 DialogResult = DialogResult.None;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 DialogResult = DialogResult.Cancel;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 Close();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 #region Scan Controls
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 private static void ForEach(Control control, Hashtable scanedControls, Predicate<Control> controlHandler)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 if (control != null && !scanedControls.ContainsKey(control))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 scanedControls.Add(control, control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 if (controlHandler(control))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 foreach (Control c in control.Controls)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 ForEach(c, scanedControls, controlHandler);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 protected virtual void ScanControls(Predicate<Control> controlHandler)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 ForEach(this, new Hashtable(), controlHandler);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 protected virtual void ScanControls(Control control, Predicate<Control> controlHandler)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 ForEach(control, new Hashtable(), controlHandler);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 #region OnLoad
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 protected override void OnLoad(EventArgs e)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 base.OnLoad(e);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 _toolTip.ToolTipIcon = ToolTipIcon.Warning;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 _toolTip.ToolTipTitle = "Validation";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 _toolTip.IsBalloon = (int)Registry.GetValue(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 "EnableBalloonTips", 1) != 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 catch
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 if (!DesignMode)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 ScanControls(InitBindableControls);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 ValidateForm();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 #region Binding
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 class ControlInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 public ControlInfo(Control control, bool isValidatable, PropertyDescriptor pd)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 Control = control;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 IsValidatable = isValidatable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 PropertyDescriptor = pd;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 public Control Control;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 public bool IsValidatable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 public PropertyDescriptor PropertyDescriptor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 ToolTip _toolTip = new ToolTip();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 Dictionary<string, ControlInfo> _keyToControl = new Dictionary<string,ControlInfo>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 List<ControlInfo> _bindableControls = new List<ControlInfo>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 private bool InitBindableControls(Control control)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 foreach (Binding binding in control.DataBindings)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 BizEntity item = binding.BindingManagerBase.Current as BizEntity;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 if (item != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 string key = GetBindingKey(item, binding, control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 if (_keyToControl.ContainsKey(key))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 string[] str = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 PropertyDescriptor pd = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 ITypedList typedList = binding.DataSource as ITypedList;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 if (typedList != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 pd = typedList.GetItemProperties(null).Find(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 binding.BindingMemberInfo.BindingField, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 if (pd != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 str = Validator.GetErrorMessages(item, pd);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 if (str == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 str = item.GetErrorMessages(binding.BindingMemberInfo.BindingField);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 if (str.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 Array.Sort(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 ControlInfo ci = new ControlInfo(control, str.Length > 0, pd);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 _bindableControls.Add(ci);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 _keyToControl.Add(key, ci);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 if (ci.IsValidatable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 _toolTip.SetToolTip(control, string.Join("\r\n", str));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 control.LostFocus += ValidateControl;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 control.Validated += ValidateControl;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 control.EnabledChanged += ValidateControl;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 private void ValidateControl(object sender, EventArgs e)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 Validate((Control)sender, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 private static string GetBindingKey(BizEntity entity, Binding binding, Control control)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 return string.Format("{0}.{1}.{2}",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 entity.GetHashCode(), binding.BindingMemberInfo.BindingField, control.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 protected bool Validate(Control control, bool validateCombines)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 bool result = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 foreach (Binding binding in control.DataBindings)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 if (binding.BindingManagerBase == null || binding.BindingManagerBase.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 BizEntity item = binding.BindingManagerBase.Current as BizEntity;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 if (item != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 string key = GetBindingKey(item, binding, control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 if (!_keyToControl.ContainsKey(key))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 ControlInfo ci = _keyToControl[key];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 string fieldName = binding.BindingMemberInfo.BindingField;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 bool isValid = ci.IsValidatable?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 ci.PropertyDescriptor != null?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 Validator.IsValid(item, ci.PropertyDescriptor):
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 item.IsValid(fieldName):
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 if (isValid)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 if (item.IsDirtyMember(fieldName))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 SetDirty(control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 ResetControl(control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 SetInvalid(control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 result = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 /*
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 if (validateCombines)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 PropertyInfo pi =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 item.GetType().GetProperty(binding.BindingMemberInfo.BindingField);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 if (pi != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 object[] attrs = pi.GetCustomAttributes(typeof(CombineAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 foreach (CombineAttribute a in attrs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 string key = GetBindingKey(item, binding, control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 string key = item.GetHashCode() + "." + a.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 ControlInfo ci = (ControlInfo)nameToControl[key];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 if (ci != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 result = Validate(ci.Control, false) && result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 */
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 return result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 Dictionary<Control, Control> _modifiedControls = new Dictionary<Control,Control>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 Dictionary<Control, Color> _originalColors = new Dictionary<Control,Color>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 protected virtual void SetInvalid(Control control)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 if (control.Enabled == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 if (_modifiedControls.ContainsKey(control) == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 _modifiedControls.Add(control, control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 if (_originalColors.ContainsKey(control) == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 _originalColors.Add(control, control.BackColor);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 Color color = Modify((Color)_originalColors[control], 45, 0, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 if (color != control.BackColor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 control.BackColor = color;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 protected virtual void SetDirty(Control control)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 if (control.Enabled == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 if (_modifiedControls.ContainsKey(control) == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 _modifiedControls.Add(control, control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 if (_originalColors.ContainsKey(control) == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 _originalColors.Add(control, control.BackColor);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 Color color = Modify((Color)_originalColors[control], 50, 50, -15);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 if (color != control.BackColor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 control.BackColor = color;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 protected virtual void ResetControl(Control control)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 if (_modifiedControls.ContainsKey(control))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 _modifiedControls.Remove(control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 if (_originalColors.ContainsKey(control))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 control.BackColor = control.Enabled?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 (Color)_originalColors[control]:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 Color.FromKnownColor(KnownColor.Control);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 public virtual bool ValidateForm()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 bool isValid = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 foreach (ControlInfo ci in _bindableControls)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 isValid = Validate(ci.Control, false) && isValid;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 return isValid;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 public static Color Modify(Color original, int dr, int dg, int db)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 int r = original.R + dr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 int g = original.G + dg;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 int b = original.B + db;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 if (r > 255 || g > 255 || b > 255)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 int d = Math.Max(r, Math.Max(g, b)) - 255;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 r -= d;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 g -= d;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 b -= d;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 if (r < 0) r = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 if (g < 0) g = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 if (b < 0) b = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 return Color.FromArgb(r, g, b);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 }