本文主要针对使用DataGrid动态绑定数据对象,并实现行列转换效果。

一,前台绑定

<sdk:DataGrid x:Name="dataGrid2" Style="{StaticResource ResourceKey=safeDataGrid2}" />
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Threading;
using Test.Util; namespace Test
{
public partial class MainPage : UserControl
{
public Md Model = null;
private DispatcherTimer timer;
int index = 0;
/// <summary>
///
/// </summary>
public ObservableCollection<Obj> objs = new ObservableCollection<Obj>(); public MainPage()
{
InitializeComponent();
init();
timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 8);
timer.Tick += timer_Tick;
timer.Start();
} /// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void timer_Tick(object sender, EventArgs e)
{
var ramd = new Random();
foreach (var tag in Model.Tags)
{
foreach (var para in Consts.Params)
{
var rv = index % 2 == 0 ? ramd.Next(2, 10) : ramd.Next(1, 5);
var o = new Obj
{
IsAlarm = false,
Value = (0.5 + rv).ToString(),
State = index % 2 == 0 ? 1 : 0,
MeterId = tag.F_METER_ID,
MeterName = tag.F_METER_NAME,
ParaId = para.Id
};
if (para.Id == "10")
{
o.IsAlarm = false;
o.ParaId = string.Empty;
o.State = 0;
o.Value = string.Empty;
}
var temp = objs.FirstOrDefault(i => i.MeterName.Equals(o.MeterName) && i.ParaId == o.ParaId);
if (temp != null)
{
temp.IsAlarm = o.IsAlarm;
temp.State = o.State;
temp.Value = o.Value;
}
else
objs.Add(o);
}
}
//CommHelper.GetSource(Model.Tags, objs, ref this.dataGrid2);
CommHelper.BindData(Model.Tags, objs, ref this.dataGrid2);
index++;
} /// <summary>
///
/// </summary>
void init()
{
Model = new Md();
Model.Tags = new List<T_METER>();
Model.Eles = new List<Param>();
for (int i = 0; i < 1; i++)
{
var temp = new T_METER
{
F_BUILD_ID = "440300B059",
F_METER_ID = string.Format("TAG_{0}", i),
F_METER_NAME = string.Format("CM-{0}", i)
};
if (i == 0)
temp.F_EQT_TYPE = "D";
else if (i == 1)
temp.F_EQT_TYPE = "C";
else if (i == 2)
temp.F_EQT_TYPE = "E";
else
temp.F_EQT_TYPE = "A";
Model.Tags.Add(temp);
}
this.dataGrid1.ItemsSource = Consts.Params;
CommHelper.CreateDataGrid(Model.Tags, ref this.dataGrid2);
}
} /// <summary>
///
/// </summary>
public class Md
{
/// <summary>
/// 参数集合
/// </summary>
public List<Param> Eles { get; set; }
/// <summary>
/// 电表集合
/// </summary>
public List<T_METER> Tags { get; set; }
}
/// <summary>
///
/// </summary>
public class T_METER
{
public string F_BUILD_ID { get; set; }
public string F_METER_ID { get; set; } public string F_METER_NAME { get; set; } public string F_EQT_TYPE { get; set; } public string F_VALUE { get; set; }
} /// <summary>
/// 参数
/// </summary>
public class Param
{
public string Id { get; set; } public string Name { get; set; }
} /// <summary>
/// 绑定数据对象
/// </summary>
public class Obj
{
/// <summary>
/// 对应参数编号
/// </summary>
public string ParaId { get; set; } public string MeterId { get; set; }
/// <summary>
/// 电表名称
/// </summary>
public string MeterName { get; set; }
/// <summary>
/// 开关状态0-关,1-开
/// </summary>
public int State { get; set; }
/// <summary>
/// OPC读取值
/// </summary>
public string Value { get; set; }
/// <summary>
/// 是否报警
/// </summary>
public bool IsAlarm { get; set; } } }

  

二,动态列对象

 using System.Collections.Generic;

 namespace Test.Util
{
/* ==============================
* Desc:DynamicColumn
* Author:hezp
* Date:2014/8/14 15:49:17
* ==============================*/
public class DynamicColumn
{
/// <summary>
/// 列名
/// </summary>
public string ColumnName { get; set; }
/// <summary>
/// 列对应集合
/// </summary>
public List<string> Values { get; set; }
}
}

三,DataGrid动态生成类

 using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Text.RegularExpressions;
using System.Collections.ObjectModel; namespace Test.Util
{
/* ==============================
* Desc:CommHelper
* Author:hezp
* Date:2014/8/14 15:58:26
* ==============================*/
public class CommHelper
{
/// <summary>
///
/// </summary>
/// <param name="columnBindName"></param>
/// <param name="columnHeaderName"></param>
/// <param name="width"></param>
/// <param name="index"></param>
/// <returns></returns>
private static DataGridTemplateColumn CreateDataGridTextColumn(string columnBindName, string columnHeaderName, T_METER tag)
{
DataGridTemplateColumn dgColumn = new DataGridTemplateColumn();
dgColumn.Header = columnHeaderName;
dgColumn.IsReadOnly = true;
var w = ;
if (tag != null)
{
if (tag.F_EQT_TYPE.Equals("D"))
{
dgColumn.HeaderStyle = ResourcesWrapper.GetStyle<Style>("safeByqStyle");
w = ;
}
else if (tag.F_EQT_TYPE.Equals("B"))
{
dgColumn.HeaderStyle = ResourcesWrapper.GetStyle<Style>("safeSingleDrStyle");
w = ;
}
else if (tag.F_EQT_TYPE.Equals("C"))
{
dgColumn.HeaderStyle = ResourcesWrapper.GetStyle<Style>("safeDoubleDrStyle");
w = ;
}
else if (tag.F_EQT_TYPE.Equals("E"))
{
dgColumn.HeaderStyle = ResourcesWrapper.GetStyle<Style>("safeHookStyle");
w = ;
}
else
dgColumn.HeaderStyle = ResourcesWrapper.GetStyle<Style>("safeMeterStyle");
}
else
dgColumn.HeaderStyle = ResourcesWrapper.GetStyle<Style>("safeMeterStyle"); dgColumn.CellStyle = ResourcesWrapper.GetStyle<Style>("safeCellStyle"); StringBuilder cellTemplate = new StringBuilder();
cellTemplate.Append("<DataTemplate ");
cellTemplate.Append(" xmlns='http://schemas.microsoft.com/client/2007' ");
cellTemplate.Append(" xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' ");
cellTemplate.Append(" xmlns:c='clr-namespace:Test.Controls;assembly=Test.Controls' ");
cellTemplate.Append(" xmlns:local = 'Test");
cellTemplate.Append(";assembly=Test'>");
cellTemplate.Append(string.Format("<c:CustomCell Width='{1}' Text='{{Binding {0}}}'/>", columnBindName, w));
cellTemplate.Append("</DataTemplate>");
dgColumn.CellTemplate = (DataTemplate)XamlReader.Load(cellTemplate.ToString());
dgColumn.CellTemplate.LoadContent(); return dgColumn;
} /// <summary>
///
/// </summary>
/// <param name="SourceList"></param>
/// <returns></returns>
private static IEnumerable<IDictionary> GetEnumerable(List<Dictionary<string, string>> SourceList)
{
for (int i = ; i < SourceList.Count; i++)
{
var dict = new Dictionary<string, string>();
dict = SourceList[i];
yield return dict;
}
}
/// <summary>
///
/// </summary>
/// <param name="list"></param>
/// <param name="objs"></param>
/// <returns></returns>
private static List<DynamicColumn> Grenartor(List<T_METER> list, ObservableCollection<Obj> objs)
{
var columns = new List<DynamicColumn>();
if (null == list) return null;
var ms = from p in list
group p by new { p.F_BUILD_ID, p.F_METER_ID, p.F_METER_NAME } into gg
select gg.Key;
var ramd = new System.Random();
foreach (var m in ms)
{
var column = new DynamicColumn
{
ColumnName = string.Format("{0}____{1}", m.F_METER_NAME, )//格式:支路名称|开关状态值
};
if (objs != null)
{
var obj = objs.FirstOrDefault(i => i.MeterName.Equals(m.F_METER_NAME));
if (obj != null)
column.ColumnName = string.Format("{0}____{1}", obj.MeterName, obj.State);
}
column.Values = new List<string>();
var count = Consts.Params.Count;
for (int i = ; i < count; i++)
{
var v = false;//是否显示按钮
if (i == count - )
v = true;
if (objs != null)
{
var temp = objs.FirstOrDefault(j => j.MeterName.Equals(m.F_METER_NAME) && !string.IsNullOrEmpty(j.ParaId) && j.ParaId.Equals(Consts.Params[i].Id));
if (temp != null)
column.Values.Add(string.Format("{0}____{1}____{2}____{3}____{4}____{5}____{6}", m.F_BUILD_ID, m.F_METER_ID, m.F_METER_NAME, temp.Value, v, temp.IsAlarm, Consts.Params[i].Id));
else
column.Values.Add(string.Format("{0}____{1}____{2}____{3}____{4}____{5}____{6}", m.F_BUILD_ID, m.F_METER_ID, m.F_METER_NAME, "-", v, false, Consts.Params[i].Id));//格式:建筑编号____支路编号____支路名称____数值____是否是按钮____是否报警
}
else
column.Values.Add(string.Format("{0}____{1}____{2}____{3}____{4}____{5}____{6}", m.F_BUILD_ID, m.F_METER_ID, m.F_METER_NAME, "-", v, false, Consts.Params[i].Id));
}
columns.Add(column);
}
return columns;
}
/// <summary>
/// 绑定数据
/// </summary>
/// <param name="tags"></param>
/// <param name="objs"></param>
/// <param name="datagrid"></param>
public static void BindData(List<T_METER> tags, ObservableCollection<Obj> objs, ref DataGrid datagrid)
{
var list = Grenartor(tags, objs);
var dataSources = new List<Dictionary<string, string>>();
for (int j = ; j < ; j++)
{
var dict = new Dictionary<string, string>();//数据行(Key:列名,Value:列值)
list.ForEach(item =>
{
dict.Add(item.ColumnName.Replace(" ", "_").Replace("-", "_"), item.Values[j]);
});
dataSources.Add(dict);
}
foreach (var item in list)
{
var index = list.IndexOf(item);
var arr = Regex.Split(item.ColumnName, "____", RegexOptions.IgnoreCase);
var tag = tags.FirstOrDefault(i => i.F_METER_NAME.ToUpper().Equals(arr[].ToUpper()));
var column = CreateDataGridTextColumn(item.ColumnName.Replace(" ", "_").Replace("-", "_"), item.ColumnName, tag);
var cl = datagrid.Columns.FirstOrDefault(i => i.Header.ToString().StartsWith(tag.F_METER_NAME));
if (cl != null)
cl = column;
else
datagrid.Columns.Add(column);
}
datagrid.ItemsSource = GetEnumerable(dataSources).ToDataSource();
} public static void GetSource(List<T_METER> tags, ObservableCollection<Obj> objs, ref DataGrid datagrid)
{
var list = Grenartor(tags, objs);
var dataSources = new List<Dictionary<string, string>>();
for (int j = ; j < ; j++)
{
var dict = new Dictionary<string, string>();//数据行(Key:列名,Value:列值)
list.ForEach(item =>
{
dict.Add(item.ColumnName.Replace(" ", "_").Replace("-", "_"), item.Values[j]);
});
dataSources.Add(dict);
}
datagrid.ItemsSource = GetEnumerable(dataSources).ToDataSource();
} public static void CreateDataGrid(List<T_METER> tags, ref DataGrid datagrid)
{
var list = Grenartor(tags, null);
var dataSources = new List<Dictionary<string, string>>();
for (int j = ; j < ; j++)
{
var dict = new Dictionary<string, string>();//数据行(Key:列名,Value:列值)
list.ForEach(item =>
{
dict.Add(item.ColumnName.Replace(" ", "_").Replace("-", "_"), item.Values[j]);
});
dataSources.Add(dict);
}
foreach (var item in list)
{
var index = list.IndexOf(item);
var arr = Regex.Split(item.ColumnName, "____", RegexOptions.IgnoreCase);
var tag = tags.FirstOrDefault(i => i.F_METER_ID.ToUpper().Equals(arr[].ToUpper()));
var column = CreateDataGridTextColumn(item.ColumnName.Replace(" ", "_").Replace("-", "_"), item.ColumnName, tag);
var cl = datagrid.Columns.FirstOrDefault(i => i.Header.ToString().StartsWith(tag.F_METER_NAME));
if (cl != null)
cl = column;
else
datagrid.Columns.Add(column);
}
datagrid.ItemsSource = GetEnumerable(dataSources).ToDataSource();
}
}
}

四,数据源构造(实现行列转换)类

 using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Reflection;
using System.Reflection.Emit; namespace Test.Util
{
/* ==============================
* Desc:DataSourceCreator
* Author:hezp
* Date:2014/8/14 15:51:04
* ==============================*/
public static class DataSourceCreator
{
public static ObservableCollection<object> ToDataSource(this IEnumerable<IDictionary> list)
{
IDictionary firstDict = null;
bool hasData = false;
foreach (IDictionary currentDict in list)
{
hasData = true;
firstDict = currentDict;
break;
}
if (!hasData)
{
return new ObservableCollection<object> { };
}
if (firstDict == null)
{
throw new ArgumentException("IDictionary entry cannot be null");
}
Type objectType = null;
TypeBuilder tb = GetTypeBuilder(list.GetHashCode());
ConstructorBuilder constructor =
tb.DefineDefaultConstructor(
MethodAttributes.Public |
MethodAttributes.SpecialName |
MethodAttributes.RTSpecialName);
foreach (DictionaryEntry pair in firstDict)
{ CreateProperty(tb,
Convert.ToString(pair.Key),
pair.Value == null ?
typeof(object) :
pair.Value.GetType()); }
objectType = tb.CreateType();
return GenerateArray(objectType, list, firstDict);
}
private static ObservableCollection<object> GenerateArray(Type objectType, IEnumerable<IDictionary> list, IDictionary firstDict)
{
var itemsSource = new ObservableCollection<object>();
foreach (var currentDict in list)
{
object row = Activator.CreateInstance(objectType);
foreach (DictionaryEntry pair in firstDict)
{
if (currentDict.Contains(pair.Key))
{
PropertyInfo property =
objectType.GetProperty(Convert.ToString(pair.Key));
property.SetValue(
row,
Convert.ChangeType(
currentDict[pair.Key],
property.PropertyType,
null),
null);
}
}
itemsSource.Add(row);
}
return itemsSource;
}
private static TypeBuilder GetTypeBuilder(int code)
{
AssemblyName an = new AssemblyName("TempAssembly" + code);
AssemblyBuilder assemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(
an, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
TypeBuilder tb = moduleBuilder.DefineType("TempType" + code
, TypeAttributes.Public |
TypeAttributes.Class |
TypeAttributes.AutoClass |
TypeAttributes.AnsiClass |
TypeAttributes.BeforeFieldInit |
TypeAttributes.AutoLayout
, typeof(object));
return tb;
}
private static void CreateProperty(TypeBuilder tb, string propertyName, Type propertyType)
{
FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName,
propertyType,
FieldAttributes.Private); PropertyBuilder propertyBuilder =
tb.DefineProperty(
propertyName, PropertyAttributes.HasDefault, propertyType, null);
MethodBuilder getPropMthdBldr =
tb.DefineMethod("get_" + propertyName,
MethodAttributes.Public |
MethodAttributes.SpecialName |
MethodAttributes.HideBySig,
propertyType, Type.EmptyTypes);
ILGenerator getIL = getPropMthdBldr.GetILGenerator();
getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, fieldBuilder);
getIL.Emit(OpCodes.Ret);
MethodBuilder setPropMthdBldr =
tb.DefineMethod("set_" + propertyName,
MethodAttributes.Public |
MethodAttributes.SpecialName |
MethodAttributes.HideBySig,
null, new Type[] { propertyType });
ILGenerator setIL = setPropMthdBldr.GetILGenerator();
setIL.Emit(OpCodes.Ldarg_0);
setIL.Emit(OpCodes.Ldarg_1);
setIL.Emit(OpCodes.Stfld, fieldBuilder);
setIL.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getPropMthdBldr);
propertyBuilder.SetSetMethod(setPropMthdBldr);
}
}
}

五,显示效果

最新文章

  1. Sublime、Webstorm,还有CLI、Atom,这些开发工具的更新你清楚吗?
  2. POJ 3009 DFS+剪枝
  3. 信息加密之非对称加密算法RSA
  4. 6.1:SportStore:一个真实的应用
  5. 【转】./configure &amp;&amp; make &amp;&amp; make install详解
  6. Hello WPF!
  7. easyui 使特定tab处于选中状态
  8. U盘装系统出现错误 安装失败怎么办
  9. 王立平--result += &amp;quot;{&amp;quot;;
  10. Go 初体验 - 闭包,数组,切片,锁
  11. JAVA-获取 JDK 动态代理生成的 Class 文件
  12. 重建控制文件报错 ORA-01503 ORA-01192
  13. hdu 1558 Segment set 线段相交+并查集
  14. Eigen矩阵基本运算
  15. 洛谷P1516 青蛙的约会(扩展欧几里德)
  16. S老师 破坏神学习
  17. 百度Ocr文字识别
  18. poj2991 Crane(线段树)
  19. 【Tsinsen-A1486】树(王康宁) 点分治 + Trie
  20. Redis源代码分析(三十三)--- redis-cli.cclient命令行接口的实现(2)

热门文章

  1. [转]PBFT 算法详解
  2. 洛谷P1005 矩阵取数游戏
  3. LibreOJ #2036. 「SHOI2015」自动刷题机
  4. 【UVA - 136】Ugly Numbers(set)
  5. java 文件相关问题
  6. JS高级学习历程-13
  7. idea 添加yuicompressor压缩js/css
  8. Sass 愿景
  9. CoreCLR
  10. CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)