在程序开发过程中,常常会遇到从窗体上获取信息赋值给对应的实体,或者把实体信息赋值给窗体上的控件,

 为了避免写太多重复的代码,封装成一个类来实现。

 1     public class MyKeyValue
 2     {
 3         public object MyKey
 4         {
 5             get;
 6             set;
 7         }
 8 
 9         public object MyValue
10         {
11             get;
12             set;
13         }
14 
15         public MyKeyValue(object key, object value)
16         {
17             MyKey = key;
18             MyValue = value;
19         }
20     }
View Code

 

  1 /// <summary>
  2         /// 根据模型的属性名查找控件,。
  3         /// </summary>
  4         /// <param name="container">控件容器</param>
  5         /// <param name="propertyName">控件名称</param>
  6         /// <returns></returns>
  7         private static Control FindControl(Control container, string propertyName)
  8         {
  9             Control control = null;
 10 
 11             //考虑有些控件放在窗体的容器中,采用了递归查找
 12             foreach (Control ctr in container.Controls)
 13             {
 14                 if (!string.IsNullOrEmpty(ctr.Name))
 15                 {
 16                     //排除控件3个字符的前缀
 17                     if (ctr.Name.Substring(3) == propertyName)
 18                     {
 19                         return ctr;
 20                     }
 21 
 22                     control = FindControl(ctr, propertyName);
 23                     if (control != null)
 24                     {
 25                         return control;
 26                     }
 27                 }
 28             }
 29 
 30             return control;
 31         }
 32 
 33         /// <summary>
 34         /// 从窗体中获取模型
 35         /// </summary>
 36         /// <typeparam name="T">模型的类型</typeparam>
 37         /// <param name="container">窗体或控件容器</param>
 38         /// <returns>模型</returns>
 39         public static T GetModel<T>(this Control container) where T : new()
 40         {
 41             T model = new T();
 42 
 43             //获取业务对象的属性   
 44             foreach (PropertyInfo modelProperty in model.GetType().GetProperties())
 45             {
 46                 Control control = FindControl(container, modelProperty.Name);
 47 
 48                 if (control == null)
 49                 {
 50                     continue;
 51                 }
 52 
 53                 if (control is Label)
 54                 {
 55                     Label label = (Label)control;
 56                     modelProperty.SetValue(model, Convert.ChangeType(label.Text, modelProperty.PropertyType), null);
 57                     goto myContinue;
 58                 }
 59                 else if (control is TextBox)
 60                 {
 61                     TextBox textBox = (TextBox)control;
 62                     modelProperty.SetValue(model, Convert.ChangeType(textBox.Text, modelProperty.PropertyType), null);
 63                     goto myContinue;
 64                 }
 65                 else if (control is NumericUpDown)
 66                 {
 67                     NumericUpDown nud = (NumericUpDown)control;
 68                     modelProperty.SetValue(model, Convert.ChangeType(nud.Value, modelProperty.PropertyType), null);
 69                     goto myContinue;
 70                 }
 71                 else if (control is DateTimePicker)
 72                 {
 73                     DateTimePicker dateTimePicker = (DateTimePicker)control;
 74                     modelProperty.SetValue(model, Convert.ChangeType(dateTimePicker.Value, modelProperty.PropertyType), null);
 75                     goto myContinue;
 76                 }
 77                 else if (control is CheckBox)
 78                 {
 79                     CheckBox checkBox = (CheckBox)control;
 80                     modelProperty.SetValue(model, Convert.ChangeType(checkBox.Checked, modelProperty.PropertyType), null);
 81                     goto myContinue;
 82                 }
 83                 else if (control is ComboBox)
 84                 {
 85                     ComboBox comboBox = (ComboBox)control;
 86                     modelProperty.SetValue(model, Convert.ChangeType(comboBox.SelectedValue, modelProperty.PropertyType), null);
 87                     goto myContinue;
 88                 }              
 89                 else if (control is DataGridView)
 90                 {
 91                     DataGridView dgv = (DataGridView)control;
 92 
 93                     IList list = model.GetType().GetProperty(modelProperty.Name).GetValue(model, null) as IList;
 94                     Type[] itemTypes = model.GetType().GetProperty(modelProperty.Name).PropertyType.GetGenericArguments();
 95                     Type itemType = itemTypes[0];
 96 
 97                     int i = 0;
 98                     foreach (DataGridViewRow row in dgv.Rows)
 99                     {
100                         object item = Activator.CreateInstance(itemType);
101                         foreach (PropertyInfo itemModelProperty in itemType.GetProperties())
102                         {
103                             object val = dgv.Rows[i].Cells[itemModelProperty.Name].Value;
104                             itemType.GetProperty(itemModelProperty.Name).SetValue(item, Convert.ChangeType(val, itemModelProperty.PropertyType), null);
105                         }
106                         list.Add(item);
107                         i++;
108                     }
109                 }
110             myContinue:
111                 continue;
112             }
113   
114 
115             return model;
116         }
117 
118         /// <summary>
119         /// 从窗体中获取模型
120         /// </summary>
121         /// <typeparam name="T">模型的类型</typeparam>
122         /// <param name="container">窗体或控件容器</param>
123         /// <returns>模型</returns>
124         /// <param name="dirControl">Dictionary<属性名,Dictionary<属性值,控件名>></param>
125         public static T GetModelEx<T>(this Control container, Dictionary<string, IList<MyKeyValue>> dirControl) where T : new()
126         {
127             T model =GetModel<T>(container);
128             //获取业务对象的属性   
129             foreach (PropertyInfo modelProperty in model.GetType().GetProperties())
130             {
131                 if (dirControl.ContainsKey(modelProperty.Name))
132                 {
133                     IList<MyKeyValue> list = dirControl[modelProperty.Name];
134 
135                     foreach (MyKeyValue item in list)
136                     {
137                         Control control = FindControl(container, item.MyValue.ToString());
138 
139                         if (control == null)
140                         {
141                             continue;
142                         }
143                         if (control is RadioButton)
144                         {
145                             RadioButton radio = (RadioButton)control;
146                             modelProperty.SetValue(model, Convert.ChangeType(item.MyKey, modelProperty.PropertyType), null);
147                             //modelProperty.SetValue(model, Convert.ChangeType(radio.Checked, modelProperty.PropertyType), null);
148                             if (radio.Checked&&modelProperty.GetValue(model, null) != null)
149                                 goto myContinue;
150                         } 
151                     }
152                 myContinue:
153                     continue;
154                 }
155             }
156             return model;
157         }
158 
159         /// <summary>
160         /// 将模型绑定到窗体或控件容器
161         /// </summary>
162         /// <typeparam name="T">模型类型</typeparam>
163         /// <param name="container">窗体或控件容器</param>
164         /// <param name="model">模型</param>
165         public static bool SetModel<T>(this Control container, T model)
166         {
167             if (model == null)
168             {
169                 return false;
170             }
171             int result = 0;
172             foreach (PropertyInfo modelProperty in model.GetType().GetProperties())
173             {
174                 Control control = FindControl(container, modelProperty.Name);
175                 if (control == null)
176                 {
177                     continue;
178                 }
179                 
180                 if (control is Label)
181                 {
182                     Label label = (Label)control;
183                     label.Text = modelProperty.GetValue(model, null) == null ? string.Empty : modelProperty.GetValue(model, null).ToString();
184                     result += 1;
185                     goto myContinue;
186                 }
187                 else if (control is TextBox)
188                 {
189                     TextBox textBox = (TextBox)control;
190                     textBox.Text = modelProperty.GetValue(model, null) == null ? string.Empty : modelProperty.GetValue(model, null).ToString();
191                     result += 1;
192                     goto myContinue;
193                 }
194                 else if (control is DateTimePicker)
195                 {
196                     DateTimePicker dateTimePicker = (DateTimePicker)control;
197                     dateTimePicker.Value = Convert.ToDateTime(modelProperty.GetValue(model, null));
198                     result += 1;
199                     goto myContinue;
200                 }
201                 else if (control is NumericUpDown)
202                 {
203                     NumericUpDown nud = (NumericUpDown)control;
204                     nud.Value = Convert.ToInt32(modelProperty.GetValue(model, null));
205                     result += 1;
206                     goto myContinue;
207                 }
208                 else if (control is CheckBox)
209                 {
210                     CheckBox checkBox = (CheckBox)control;
211                     checkBox.Checked = Convert.ToBoolean(modelProperty.GetValue(model, null));
212                     result += 1;
213                     goto myContinue;
214                 }
215                 else if (control is ComboBox)
216                 {
217                     ComboBox comboBox = (ComboBox)control;
218                     comboBox.SelectedValue = (modelProperty.GetValue(model, null));
219                     result += 1;
220                     goto myContinue;
221                 }
222                 else if (control is DataGridView)
223                 {
224                     DataGridView dgv = (DataGridView)control;
225 
226                     object listPropertyValue = model.GetType().GetProperty(modelProperty.Name).GetValue(model, null);
227 
228                     IList list = listPropertyValue as IList;
229                     if (list != null)
230                     {
231                         int i = 0;
232                         dgv.Rows.Clear();
233 
234                         foreach (object o in list)
235                         {
236                             dgv.Rows.Add(1);
237 
238                             Type itemType = o.GetType();
239                             foreach (PropertyInfo itemModelProperty in itemType.GetProperties())
240                             {
241                                 
242                                 object val = itemType.GetProperty(itemModelProperty.Name).GetValue(o, null);
243                                 if (dgv.Columns.Contains(itemModelProperty.Name))
244                                 {
245                                     dgv.Rows[i].Cells[itemModelProperty.Name].Value = val.ToString();    
246                                 }
247                             }
248 
249                             i++;
250                         }
251                     }
252                     result += 1;
253                 }
254                myContinue:
255                 continue;
256             }
257             return result == model.GetType().GetProperties().Count();
258         }
259 
260 
261         /// <summary>
262         /// 将模型绑定到窗体或控件容器拓展方法
263         /// 主要是拓展关于属性值比较多  比如状态,性别,类型情况下单选
264         /// </summary>
265         /// <typeparam name="T">模型类型</typeparam>
266         /// <param name="container">窗体或控件容器</param>
267         /// <param name="model">模型</param>
268         /// <param name="dirControl">Dictionary<属性名,Dictionary<属性值,控件名>></param>
269         public static void SetModelEx<T>(this Control container, T model, Dictionary<string, IList<MyKeyValue>> dirControl)
270         {
271             if (model == null)
272             {
273                 return;
274             }
275             bool result = SetModel(container, model);
276             if (false == result)
277             {
278                 foreach (PropertyInfo modelProperty in model.GetType().GetProperties())
279                 {
280                     if (!dirControl.ContainsKey(modelProperty.Name))
281                     {
282                         continue;
283                     }
284                     foreach (MyKeyValue kvp in dirControl[modelProperty.Name])
285                     {
286                         Control control = FindControl(container, kvp.MyValue.ToString());
287                         if (control == null)
288                         {
289                             continue;
290                         }                       
291                         if (control is RadioButton)
292                         {
293                             string value = modelProperty.GetValue(model, null) == null ? string.Empty : modelProperty.GetValue(model, null).ToString();
294                             if (value != string.Empty)
295                             {
296                                 RadioButton radButton = (RadioButton)control;
297                                 radButton.Checked = modelProperty.GetValue(model, null).ToString() == kvp.MyKey.ToString();
298                                 if(radButton.Checked)
299                                     goto myContinue;
300                             }
301                         }
302                     }
303                 myContinue:
304                     continue;
305                 }
306             }
307         }
View Code


方法名以Ex结尾的是在原有实现的基础上再实现多类型单选,比如说 性别(男女),类型(有效,无效)等一个属性对应多个控件的功能

控件赋值给实体调用方式:

 1     /// <summary>
 2     /// 学生信息
 3     /// </summary>
 4     public class StudentInfo
 5     {
 6         /// <summary>
 7         /// 性别
 8         /// </summary>
 9         public string Sex
10         {
11             get;
12             set;
13         }
14         /// <summary>
15         /// 姓名
16         /// </summary>
17         public string Name
18         {
19             get;
20             set;
21         }
22     }  
23 
24 Dictionary<string, IList<MyKeyValue>> dirControl = new Dictionary<string, IList<MyKeyValue>>();
25             IList<MyKeyValue> list = new List<MyKeyValue>();
26             list.Add(new MyKeyValue("1", "Sex男"));
27             list.Add(new MyKeyValue("0", "Sex女"));
28             dirControl.Add("Sex", list);
29             StudentInfo model = new StudentInfo();
30             model=FormBinding.GetModelEx<StudentInfo>(this, dirControl);
View Code

实体赋值给控件调用方式:

1  StudentInfo model=new StudentInfo(){Sex="0",Name="TEST"};
2             Dictionary<string, IList<MyKeyValue>> dirControl = new Dictionary<string, IList<MyKeyValue>>();
3             IList<MyKeyValue> list = new List<MyKeyValue>();
4             list.Add(new MyKeyValue("1","Sex男"));
5             list.Add(new MyKeyValue("0", "Sex女"));
6             dirControl.Add("Sex", list);
7             FormBinding.SetModelEx(this, model, dirControl);
View Code

 
  以上只做了简单的封装,有更好的实现方式欢迎推荐!