zoukankan      html  css  js  c++  java
  • 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");

    }
    }
    }
    }

  • 相关阅读:
    BadUSB 利用
    java 将函数作为参数传递
    odoo12 修行提升篇之 常用的高阶函数 (二)
    odoo12 修行提升篇之 异步定时任务 (一)
    odoo12 修行基础篇之 利用kanban做分析 点击跳转分析模型列表 (九)
    odoo12 修行基础篇之 kanban (八)
    odoo12 修行基础篇之 记录批处理 (七)
    odoo12 修行基础篇之 列表的筛选和分组 (六)
    odoo12 修行基础篇之 添加记录编码 (五)
    odoo12 修行基础篇之 添加工作流和操作记录 (四)
  • 原文地址:https://www.cnblogs.com/hirisw/p/2745917.html
Copyright © 2011-2022 走看看