using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Reflection; /// <summary> /// TTT 的摘要说明 /// 具体用法:把窗体上的控件ID属性与实体层的属性设置成一致。 ///绑定实体层到窗体的时候用: ///BindObjectToControls(model,this);model为实体类 this为当前页 /// ///要把窗体数据绑定到实体层的时候用: ///BindControlsToObject(model,this); /// </summary> public class TTT { public TTT() { // // TODO: 在此处添加构造函数逻辑 // } /// <summary> /// A class with two static methods <see cref="BindObjectToControls"/> and <see cref="BindControlsToObject"/> /// used to bind the values of and object's properties with web <see cref="Control"/>s that have their /// ID property set to the name of the object property. /// 绑定业务对象到控件 /// </summary> /// <param name="obj">The object whose properties are being bound to forms Controls实体对象</param> /// <param name="container">The control in which the form Controls reside (usually a Page or ContainerControl)控件集合</param> public static void BindObjectToControls(object obj, Control container) { if (obj == null) return; // Get the properties of the business object // Type objType = obj.GetType();//得到业务对象的类型 PropertyInfo[] objPropertiesArray = objType.GetProperties();//得到此类型所有属性 foreach (PropertyInfo objProperty in objPropertiesArray) { Control control = container.FindControl(objProperty.Name);//在控件集合里查找和业务对象名称一样的控件 if (control == null) continue; // handle ListControls (DropDownList, CheckBoxList, RadioButtonList) // if (control is ListControl)//如果对象是集合类型控件 { ListControl listControl = (ListControl)control; string propertyValue = objProperty.GetValue(obj, null).ToString();//得到实体类属性的值 ListItem listItem = listControl.Items.FindByValue(propertyValue); if (listItem != null) listItem.Selected = true; } else { // get the properties of the control // Type controlType = control.GetType(); PropertyInfo[] controlPropertiesArray = controlType.GetProperties(); // test for common properties // bool success = false; success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Checked", typeof(bool)); if (!success) success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "SelectedDate", typeof(DateTime)); if (!success) success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Value", typeof(String)); if (!success) success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Text", typeof(String)); } } } /// <summary> /// 查找并设置控件属性 /// </summary> /// <param name="obj">The object whose properties are being retrieved</param> /// <param name="objProperty">The property of the object being retrieved</param> /// <param name="control">The control whose ID matches the object's property name.</param> /// <param name="controlPropertiesArray">An array of the control's properties</param> /// <param name="propertyName">The name of the Control property being set</param> /// <param name="type">The correct type for the Control property</param> /// <returns>Boolean for whether the property was found and set</returns> private static bool FindAndSetControlProperty(object obj, PropertyInfo objProperty, Control control, PropertyInfo[] controlPropertiesArray, string propertyName, Type type) { // iterate through control properties // foreach (PropertyInfo controlProperty in controlPropertiesArray) { // check for matching name and type // if (controlProperty.Name == propertyName && controlProperty.PropertyType == type) { // set the control's property to the business object property value // controlProperty.SetValue(control, Convert.ChangeType(objProperty.GetValue(obj, null), type), null); return true; } } return false; } /// <summary> /// 绑定控件到业务对象 /// </summary> /// <param name="obj">The object whose properties are being bound to Control values</param> /// <param name="container">The control in which the form Controls reside (usually a Page or ContainerControl)</param> public static void BindControlsToObject(object obj, Control container) { if (obj == null) return; // Get the properties of the business object // Type objType = obj.GetType(); PropertyInfo[] objPropertiesArray = objType.GetProperties(); foreach (PropertyInfo objProperty in objPropertiesArray) { Control control = container.FindControl(objProperty.Name); if (control == null) continue; if (control is ListControl) { ListControl listControl = (ListControl)control; if (listControl.SelectedItem != null) objProperty.SetValue(obj, Convert.ChangeType(listControl.SelectedItem.Value, objProperty.PropertyType), null); } else { // get the properties of the control // Type controlType = control.GetType(); PropertyInfo[] controlPropertiesArray = controlType.GetProperties(); // test for common properties // bool success = false; success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "Checked", typeof(bool)); if (!success) success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "SelectedDate", typeof(DateTime)); if (!success) success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "Value", typeof(String)); if (!success) success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "Text", typeof(String)); } } } /// <summary> /// 查找并得到控件属性 /// </summary> /// <param name="obj"></param> /// <param name="objProperty"></param> /// <param name="control"></param> /// <param name="controlPropertiesArray"></param> /// <param name="propertyName"></param> /// <param name="type"></param> /// <returns></returns> private static bool FindAndGetControlProperty(object obj, PropertyInfo objProperty, Control control, PropertyInfo[] controlPropertiesArray, string propertyName, Type type) { // 在整个控件属性中进行迭代 foreach (PropertyInfo controlProperty in controlPropertiesArray) { // 检查匹配的名称和类型 if (controlProperty.Name == "Text" && controlProperty.PropertyType == typeof(String)) { // 将控件的属性设置为 // 业务对象属性值 try { objProperty.SetValue(obj, Convert.ChangeType(controlProperty.GetValue(control, null), objProperty.PropertyType), null); return true; } catch { // 无法将来自窗体控件 // 的数据转换为 // objProperty.PropertyType return false; } } } return true; } }