zoukankan      html  css  js  c++  java
  • 绑定对象至页面控件(支持可空类型)

      前提:控件名称和对象实体属性名称必须一致(可以带前缀)。

      另外支持对象实体属性为可空类型。

    public static class Types
        {
            public static bool IsNullableType(this Type type)
              {
                  return (((type != null) && type.IsGenericType) &&
                      (type.GetGenericTypeDefinition() == typeof(Nullable<>)));
              }
     
              public static Type GetNonNullableType(this Type type)
             {
                 if (IsNullableType(type))
                 {
                     return type.GetGenericArguments()[0];
                 }
                 return type;
             }

        }

    /// <summary>
            /// 绑定对象至控件(无前缀)
            /// </summary>
            /// <param name="obj"></param>
            /// <param name="container"></param>
            public static void BindObjectToControls(object obj, Control container)
            {
                BindObjectToControls(obj, container, "");
            }

            /// <summary>
            /// 绑定对象至控件(带前缀)
            /// </summary>
            /// <param name="obj"></param>
            /// <param name="container"></param>
            /// <param name="prefix"></param>
            public static void BindObjectToControls(object obj, Control container, string prefix)
            {
                if (obj == null) return;
                Type objType = obj.GetType();
                PropertyInfo[] objPropertiesArray = objType.GetProperties();
                foreach (PropertyInfo objProperty in objPropertiesArray)
                {
                    Control control = container.FindControl(prefix + objProperty.Name);

                    if (control != null)
                    {
                        bool success = false;
                        bool isCustom = false;

                        if (!isCustom)
                        {
                            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
                            {
                                Type controlType = control.GetType();
                                PropertyInfo[] controlPropertiesArray = controlType.GetProperties();
                                success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray,           "Checked", typeof(bool));
                                if (!success)
                                {
                                    success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "SelectedDate", typeof(DateTime));
                                    if (success)
                                        FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "VisibleDate", typeof(DateTime));
                                }
                                if (!success)
                                    success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Value", typeof(String));
                                if (!success)
                                    success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Text", typeof(String));
                            }
                        }
                    }
                }
            }
            private static bool FindAndSetControlProperty(object obj, PropertyInfo objProperty, Control control, PropertyInfo[] controlPropertiesArray, string propertyName, Type type)
            {
                foreach (PropertyInfo controlProperty in controlPropertiesArray)
                {
                    if (controlProperty.Name == propertyName && controlProperty.PropertyType == type)
                    {
                        controlProperty.SetValue(control, Convert.ChangeType(objProperty.GetValue(obj, null), type), null);
                        return true;
                    }
                }
                return false;
            }

            /// <summary>
            /// 绑定控件至对象(无前缀)
            /// </summary>
            /// <param name="obj"></param>
            /// <param name="container"></param>
            public static void BindControlsToObject(object obj, Control container)
            {
                BindControlsToObject(obj, container, "");
            }

            /// <summary>
            /// 绑定控件至对象(带前缀)
            /// </summary>
            /// <param name="obj"></param>
            /// <param name="container"></param>
            /// <param name="prefix"></param>
            public static void BindControlsToObject(object obj, Control container, string prefix)
            {
                if (obj == null) return;
                Type objType = obj.GetType();
                PropertyInfo[] objPropertiesArray = objType.GetProperties();
                foreach (PropertyInfo objProperty in objPropertiesArray)
                {
                    bool success = false;
                    bool isCustom = false;
                    Control control = container.FindControl(prefix + objProperty.Name);

                    if (control != null)
                    {
                        if (!isCustom)
                        {
                            if (control is ListControl)
                            {
                                ListControl listControl = (ListControl)control;
                                if (listControl.SelectedItem != null)
                                    objProperty.SetValue(obj, Convert.ChangeType(listControl.SelectedItem.Value, objProperty.PropertyType), null);
                            }
                            else
                            {
                                Type controlType = control.GetType();
                                PropertyInfo[] controlPropertiesArray = controlType.GetProperties();

                                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));
                            }
                        }
                    }
                }
            }
            private static bool FindAndGetControlProperty(object obj, PropertyInfo objProperty, Control control, PropertyInfo[] controlPropertiesArray, string propertyName, Type type)
            {
                foreach (PropertyInfo controlProperty in controlPropertiesArray)
                {
                    if (controlProperty.Name == propertyName && controlProperty.PropertyType == type)
                    {
                        try
                        {
                            //if (objProperty.PropertyType.IsGenericType && objProperty.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                            //{
                            //    objProperty.SetValue(obj, Convert.ChangeType(controlProperty.GetValue(control, null), objProperty.PropertyType.GetGenericArguments()[0]), null);
                            //}
                            //else
                            //{
                            objProperty.SetValue(obj, Convert.ChangeType(controlProperty.GetValue(control, null), objProperty.PropertyType.GetNonNullableType()), null);
                            //}
                            return true;
                        }
                        catch
                        {
                            return false;
                        }
                    }
                }
                return false;
            }

  • 相关阅读:
    混淆
    【虚拟DOM】√
    fn
    notebook
    sourceMappingURL
    十进制转换为十六进制
    关于this和super的区别
    类中访问级别
    Java中字符串解析
    IWorkspace操作
  • 原文地址:https://www.cnblogs.com/fang8206/p/2086678.html
Copyright © 2011-2022 走看看