• Asp.net控件页面绑定


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Reflection;
    using System.Text;
    using TCHRS.Server.Business.UserCode;
    using CommonCore.EntityCore;

    namespace Web.SendArchive
    {
    public static class HMIHelper
    {
    public static Dictionary<Type, Func<Control>> DicTypeControl ;

    public static Dictionary<string, Type> DicStringType;

    private static string environment = string.Empty;
    public static string Environment {
    get {
    if (string.IsNullOrEmpty(environment))
    environment = System.Web.Configuration.WebConfigurationManager.AppSettings["Environment"].ToString();
    return environment; }
    }

    public static bool IsDemo { get { return Environment == "Demo"; } }

    static HMIHelper()
    {
    DicTypeControl = new Dictionary<Type, Func<Control>>();
    DicTypeControl.Add(typeof(string),()=>new TextBox());
    DicTypeControl.Add(typeof(Enum),()=>new DropDownList());
    DicStringType = new Dictionary<string,Type>();
    DicStringType = GetPropertyList();
    }


    /// <summary>
    /// 将控件中的子控件值绑定到业务对象 要求子控件的名字和对象属性的名字一致
    /// </summary>
    /// <param name="container">窗体或控件容器</param>
    /// <param name="model">业务对象</param>
    public static void BindControlsToModel(this Control container, EntityBase model)
    //public static void BindControlsToModel<T>(this Control container, T model) where T : EntityBase<T>
    {
    if (model == null) return;
    Type objType = model.GetType();
    var realContainer = container.GetType().BaseType;
    PropertyInfo[] objPropertyArray = objType.GetProperties();

    foreach (PropertyInfo propertyInfo in objPropertyArray)
    {
    //根据对象属性去查找控件
    Control control = container.FindControl(propertyInfo.Name);

    if (control == null)//无法找到控件 从父类查找
    {
    try
    {
    var mem = realContainer.InvokeMember(propertyInfo.Name, BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
    | BindingFlags.GetField | BindingFlags.GetProperty, null, container, null);

    if (mem != null)
    control = mem as Control;
    }
    catch
    { }
    }

    if (control == null) continue;

    // ListControl是CheckBoxList、DropDownList、ListBox 和 RadioButtonList 的基类
    if (control is ListControl)
    {
    var listControl = (ListControl)control;
    if (listControl.SelectedItem != null)
    {
    var stringBuilder = new StringBuilder();
    for (int i = 0; i < listControl.Items.Count; i++)
    {
    if (listControl.Items[i].Selected)
    {
    stringBuilder.Append(listControl.Items[i].Value).Append(",");
    }
    }

    Type propertyType = propertyInfo.PropertyType;

    if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
    //判断是否为 System.Nullable 类型
    propertyType = propertyType.GetGenericArguments()[0];

    if (string.IsNullOrEmpty(stringBuilder.ToString()))
    {
    propertyInfo.SetValue(model, null, null);
    continue;
    }
    }
    object objValue = Convert.ChangeType(stringBuilder.ToString().Trim(','), propertyType);
    propertyInfo.SetValue(model, objValue, null);
    }
    }
    else
    {
    Type controlType = control.GetType();
    PropertyInfo[] controlPropertyArray = controlType.GetProperties();

    GetControlProperty(model, propertyInfo, control, controlPropertyArray);

    }
    }
    }

    /// <summary>
    /// 将对象值绑定到页面控件(进行中) 要求子控件的名字和对象属性的名字一致
    /// </summary>
    /// <param name="model">业务对象</param>
    /// <param name="container">窗体或控件容器</param>
    public static void BindModelToControls(this EntityBase model, Control container)
    {
    if (model == null) return;
    Type objType = model.GetType();
    var realContainer = container.GetType().BaseType;
    PropertyInfo[] objPropertyArray = objType.GetProperties(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.NonPublic);
    foreach (PropertyInfo propertyInfo in objPropertyArray)
    {
    //根据对象属性去查找控件
    Control control = container.FindControl(propertyInfo.Name);

    if (control == null)//无法找到控件 从父类查找
    {
    try
    {
    var mem = realContainer.InvokeMember(propertyInfo.Name, BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
    | BindingFlags.GetField | BindingFlags.GetProperty, null, container, null);

    if (mem != null)
    control = mem as Control;
    }
    catch
    { }
    }

    if (control == null) continue;

    if (control is ListControl)
    {
    var listControl = (ListControl)control;
    var items = propertyInfo.GetValue(model, null);
    if(items==null) continue ;
    string propertyValue = items.ToString();
    string[] values = propertyValue.Split(',');
    if (values.Length == 0) continue;

    foreach (string value in values)
    {
    ListItem listItem = listControl.Items.FindByValue(value);
    if (listItem != null)
    {
    listItem.Selected = true;
    }
    }
    }
    else
    {
    Type controlType = control.GetType();
    PropertyInfo[] controlPropertyArray = controlType.GetProperties();
    SetControlProperty(model, propertyInfo, control, controlPropertyArray);

    }
    }
    }

    /// <summary>
    /// 将实体对象的属性值赋值给页面控件
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="objProperty"></param>
    /// <param name="control"></param>
    /// <param name="controlPropertyArray"></param>
    private static void SetControlProperty(object obj, PropertyInfo objProperty, Control control, IEnumerable<PropertyInfo> controlPropertyArray)
    {
    Dictionary<string, Type> list = GetPropertyList();

    foreach (var dict in list)
    {
    // 在整个控件属性中进行迭代,检查控件匹配名称和类型的属性
    var propertys = from p in controlPropertyArray
    where p.Name == dict.Key && p.PropertyType == dict.Value
    select p;

    if (propertys.Count() == 0)
    continue;

    PropertyInfo controlProperty = propertys.First();

    controlProperty.SetValue(control, Convert.ChangeType(objProperty.GetValue(obj, null), dict.Value), null);

    }

    }

    /// <summary>
    /// 获取页面控件的值,并赋值给实体对象
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="objProperty"></param>
    /// <param name="control"></param>
    /// <param name="controlPropertyArray"></param>
    private static void GetControlProperty(object obj, PropertyInfo objProperty, Control control, IEnumerable<PropertyInfo> controlPropertyArray)
    {
    //控件值属性集合及其类型
    Dictionary<string, Type> list = GetPropertyList();

    foreach (var dict in list)
    {
    // 检查控件匹配名称和类型的属性
    var propertys = from p in controlPropertyArray
    where p.Name == dict.Key && p.PropertyType == dict.Value
    select p;

    if (propertys.Count() == 0)
    continue;

    PropertyInfo controlProperty = propertys.First();
    // 将控件的属性设置为
    // 业务对象属性值
    Type propertyType = objProperty.PropertyType;

    try
    {
    //判断是否为 System.Nullable 类型
    if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
    propertyType = propertyType.GetGenericArguments()[0];

    if (string.IsNullOrEmpty(controlProperty.GetValue(control, null).ToString()))
    {
    //当属性的类型为 System.Nullable,且值为空/null时,设置属性值为null
    objProperty.SetValue(obj, null, null);

    //赋值成功时,退出循环
    break;
    }
    }

    object objValue = Convert.ChangeType(controlProperty.GetValue(control, null), propertyType);
    objProperty.SetValue(obj, objValue, null);
    //赋值成功时,退出循环
    break;

    }
    catch (Exception e)
    {
    throw new Exception(e.Message);
    }
    }
    }

    private static Dictionary<string, Type> GetPropertyList()
    {
    var list = new Dictionary<string, Type>();
    list.Add("Checked", typeof(bool));
    list.Add("Value", typeof(String));
    list.Add("Text", typeof(String));
    return list;
    }

    public static void UserDataBind(this BaseDataBoundControl dataListShow)
    {
    object listDataSource = dataListShow.DataSource;
    var type = listDataSource.GetType();
    var props = type.GetProperties();
    var propParent = type.BaseType.GetProperties();
    var propChild = props.Except(propParent);
    if(type == typeof(List<>).MakeGenericType())
    {
    var innerType = type.GetGenericArguments().FirstOrDefault();
    var headerRow = type.GetProperty("HeaderRow");

    }
    }
    }
    }

  • 相关阅读:
    redis实现与分析
    NULL, '',0 '0'的区别
    Linux strace命令
    strcpy和memcpy的区别
    图书推荐
    php与mysql通讯那点事
    linux命令汇总
    linux系统信息查询及相关概念
    LNMP zabbix安装
    lftp查看文件时间与登录服务查看文件时间相差8小时
  • 原文地址:https://www.cnblogs.com/hirisw/p/2745917.html
Copyright © 2020-2023  润新知