Siverlight 动态生成datagrid复杂表头
来源:互联网 发布:西安网络电视台 编辑:程序博客网 时间:2024/05/17 01:26
既然可以动态生成复杂表头,自然也就可以动态绑定,也就不需要建立两个datagrid同步滚动了
先建立两个模板文件(就是简单的siverlight页)
表头模板
<Style xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:p="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data" TargetType="p:DataGridColumnHeader">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<!--/////////////111111///////////////-->
<Rectangle x:Name="BackgroundRectangle" Fill="#FF1F3B53" Stretch="Fill" Grid.ColumnSpan="2"/>
<Rectangle x:Name="BackgroundGradient" Stretch="Fill" Grid.ColumnSpan="2">
<Rectangle.Fill>
<LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
<GradientStop Color="#FCFFFFFF" Offset="0.015"/>
<GradientStop Color="#F7FFFFFF" Offset="0.375"/>
<GradientStop Color="#E5FFFFFF" Offset="0.6"/>
<GradientStop Color="#D1FFFFFF" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!--上面两个Rectangel是Datagrid动态列的背景颜色,可以删除,个人喜好-->
<Grid HorizontalAlignment="Stretch">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimation Duration="0"
Storyboard.TargetName="BackgroundRectangle"
Storyboard.TargetProperty="(Fill).Color" To="#FF448DCA"/>
<ColorAnimation Duration="0"
Storyboard.TargetName="BackgroundGradient"
Storyboard.TargetProperty="(Fill).(GradientStops)[3].Color" To="#7FFFFFFF"/>
<ColorAnimation Duration="0"
Storyboard.TargetName="BackgroundGradient"
Storyboard.TargetProperty="(Fill).(GradientStops)[2].Color" To="#CCFFFFFF"/>
<ColorAnimation Duration="0"
Storyboard.TargetName="BackgroundGradient"
Storyboard.TargetProperty="(Fill).(GradientStops)[1].Color" To="#F2FFFFFF"/>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<ColorAnimation Duration="0"
Storyboard.TargetName="BackgroundRectangle"
Storyboard.TargetProperty="(Fill).Color" To="#FF448DCA"/>
<ColorAnimation Duration="0"
Storyboard.TargetName="BackgroundGradient"
Storyboard.TargetProperty="(Fill).(GradientStops)[0].Color" To="#D8FFFFFF"/>
<ColorAnimation Duration="0"
Storyboard.TargetName="BackgroundGradient"
Storyboard.TargetProperty="(Fill).(GradientStops)[1].Color" To="#C6FFFFFF"/>
<ColorAnimation Duration="0"
Storyboard.TargetName="BackgroundGradient"
Storyboard.TargetProperty="(Fill).(GradientStops)[2].Color" To="#8CFFFFFF"/>
<ColorAnimation Duration="0"
Storyboard.TargetName="BackgroundGradient"
Storyboard.TargetProperty="(Fill).(GradientStops)[3].Color" To="#3FFFFFFF"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="SortStates">
<VisualState x:Name="Unsorted"/>
<VisualState x:Name="SortAscending" />
<VisualState x:Name="SortDescending" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
{#replace#} //这里要加上,动态生成的表头要填充到这里
</Grid>
<!--这个Rectangel是Datagrid拖动列宽度时的那个根线-->
<Rectangle x:Name="VerticalSeparator" Fill="#FFC9CACA"
VerticalAlignment="Stretch" Width="1" Visibility="Visible"
Grid.Row="1" Grid.Column="1"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
列模板
<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<!--这里是内容部分-->
{#replace#} //要被动态生成的代码覆盖
</Grid>
</DataTemplate>
cs代码
//创建一个简单的列
public static DataGridTemplateColumn CreateSingleTemplateColumn(string name, long SmallDigit, string key)
{
var column = new DataGridTemplateColumn();
#region 生成头样式
var sb = new StringBuilder();
//增加父头显示
sb.AppendLine(string.Format("<ContentPresenter Content=\"{0}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>", name));
//合成模板 填写你的HeaderStyle.xaml所在的路径 /...../HeaderStyle.xaml
//注意url的格式 UH是项目名称 component固定写法,后边的才是那个模板文件的相对路径
Uri mm = new Uri("/UH;component/../../MyStyle/HeaderStyle.xaml", UriKind.Relative);
var res = Application.GetResourceStream(mm);
var sr = new StreamReader(res.Stream);
var h_style = sr.ReadToEnd();
h_style = h_style.Replace("{#replace#}", sb.ToString());//覆盖模板文件中的{#replace#}
//生成样式
column.HeaderStyle = (Style)XamlReader.Load(h_style);
#endregion
sb.Clear();
#region 生成CELL模板
string sds = "#0.";
if (SmallDigit > 0)
{
for (int sd = 0; sd < SmallDigit; sd++)
{
sds += "0";
}
sb.AppendLine("<TextBlock Height=\"30\" Text=\"{Binding [" + key + "],StringFormat='" + sds + "'}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />");
}
else
{
//sb.AppendLine("<TextBlock Height=\"30\" Text=\"{Binding [" + key + "]}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />");
sb.AppendLine("<TextBlock Height=\"30\" Text=\"{Binding "+key+"}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />");
}
//合成模板
res = Application.GetResourceStream(new Uri("/UH;component/../../MyStyle/CellDataTemplate.xaml", UriKind.Relative));
var sr2 = new StreamReader(res.Stream);
var cell_Template = sr2.ReadToEnd();
cell_Template = cell_Template.Replace("{#replace#}", sb.ToString());
//生成样式
column.CellTemplate = (DataTemplate)XamlReader.Load(cell_Template);
#endregion
return column;
}
//创建喊有一个父标题的列,parent父标题名称,bindings是子表头可以喊有对个子标题,每个键值对表示一列的列名与绑定的值
//这里只支持一个父标题
public static DataGridTemplateColumn CreateComplexTemplateColumn(string parent,IDictionary<string, string> bindings)
{
var column = new DataGridTemplateColumn();
var list = bindings.Keys.ToList();
#region 生成头样式
var sb = new StringBuilder();
sb.AppendLine("<Grid.RowDefinitions>");
sb.AppendLine("<RowDefinition Height=\"20\" />");
sb.AppendLine("<RowDefinition Height=\"1\" />");
sb.AppendLine("<RowDefinition Height=\"20\" />");
sb.AppendLine("</Grid.RowDefinitions>");
sb.AppendLine("<Grid.ColumnDefinitions>");
for (int i = 0; i < list.Count; i++)
{
if (i > 0)
sb.AppendLine("<ColumnDefinition Width=\"1\" />");
sb.AppendLine("<ColumnDefinition Width=\"80*\"/>");
}
int offsetNum = bindings.Keys.Count * 2 - 1;
sb.AppendLine("</Grid.ColumnDefinitions>");
//增加父头显示
sb.AppendLine(string.Format("<ContentPresenter Content=\"{0}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Grid.ColumnSpan=\"{1}\" />", parent, offsetNum));
sb.AppendLine(string.Format("<Rectangle Fill=\"#FFC9CACA\" VerticalAlignment=\"Stretch\" Height=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"{0}\" />", offsetNum));
//增加明细头显示
int n = 0;
for (int i = 0; i < list.Count; i++)
{
var key = list[i];
if (i > 0)
{
n++;
sb.AppendLine(string.Format("<Rectangle Fill=\"#FFC9CACA\" VerticalAlignment=\"Stretch\" Width=\"1\" Visibility=\"Visible\" Grid.Row=\"2\" Grid.Column=\"{0}\" />", n));
n++;
}
sb.AppendLine(string.Format("<ContentPresenter Content=\"{0}\" Grid.Row=\"2\" Grid.Column=\"{1}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />", key, n));
}
//合成模板 填写你的HeaderStyle.xaml所在的路径 /...../HeaderStyle.xaml
var res = Application.GetResourceStream(new Uri("/UH;component/../../MyStyle/HeaderStyle.xaml", UriKind.Relative));
var sr = new StreamReader(res.Stream);
var h_style = sr.ReadToEnd();
h_style = h_style.Replace("{#replace#}", sb.ToString());
//生成样式
column.HeaderStyle = (Style)XamlReader.Load(h_style);
#endregion
sb.Clear();
#region 生成CELL模板
sb.AppendLine("<Grid.ColumnDefinitions>");
for (int i = 0; i < list.Count; i++)
{
if (i > 0)
sb.AppendLine("<ColumnDefinition Width=\"1\" />");
sb.AppendLine("<ColumnDefinition Width=\"80*\"/>");
}
sb.AppendLine("</Grid.ColumnDefinitions>");
//增加明细显示
n = 0;
for (int i = 0; i < list.Count; i++)
{
var key = list[i];
if (i > 0)
{
n++;
sb.AppendLine(string.Format("<Rectangle Fill=\"#FFC9CACA\" VerticalAlignment=\"Stretch\" Grid.Column=\"{0}\"/>", n));
n++;
}
sb.AppendLine("<TextBlock Height=\"30\" Text=\"{Binding " + bindings[key] + "}\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Grid.Column=\"" + n + "\" />");
}
//合成模板
res = Application.GetResourceStream(new Uri("/UH;component/../../MyStyle/CellDataTemplate.xaml", UriKind.Relative));
var sr2 = new StreamReader(res.Stream);
var cell_Template = sr2.ReadToEnd();
cell_Template = cell_Template.Replace("{#replace#}", sb.ToString());
//生成样式
column.CellTemplate = (DataTemplate)XamlReader.Load(cell_Template);
#endregion
return column;
}
//用法例子
//添加简单的列
DataGridTemplateColumn Number1 = UHService.CreateSingleTemplateColumn("序号", 0, "Number");
Number1.Width = new DataGridLength(100);
//添加复杂的列
Dictionary<string, string> mm = new Dictionary<string, string>();
mm.Add("哈哈", "hh");//他下边的列
mm.Add("嘿嘿", "xx");
DataGridTemplateColumn Number2 = UHService.CreateComplexTemplateColumn("序号", mm);
Number2.Width = new DataGridLength(100);
testDataGrid.Columns.Add(Number1);
testDataGrid.Columns.Add(Number2);
//绑定值测试
List<Dictionary<string, string>> hx = new List<Dictionary<string, string>>();
Dictionary<string, string> mx = new Dictionary<string, string>();
mx.Add("Number", "1");
mx.Add("hh", "妹子");
mx.Add("xx", "妹子");
Dictionary<string, string> mx2 = new Dictionary<string, string>();
mx2.Add("Number", "2");
mx2.Add("xx", "妹子");
mx2.Add("hh", "妹子");
hx.Add(mx);
hx.Add(mx2);
List<object> jj = UHService.GetEnumerable(hx).ToDataSource();
testDataGrid.ItemsSource = jj;
- Siverlight 动态生成datagrid复杂表头
- Siverlight DataGrid动态表头
- flex复杂表头动态生成
- Flex中动态生成DataGrid以及动态生成表头
- Siverlight 动态生成的datagrid改变指定格格内的值
- datagrid 显示多级复杂表头
- easyUI datagrid 多级复杂表头
- easyui datagrid制作复杂表头
- JAVA操作Excel 可配置,动态 生成复杂表头
- POI导入导出及动态复杂表头生成
- datagrid制作动态表头
- 重画具有动态生成列的datagrid表头
- jquery easyui datagrid 动态生成表头 + 嵌套对象属性展示
- [转载]DataGrid中创建复杂表头方法
- DataGrid中创建复杂表头方法
- DataGrid中创建复杂表头(转载)
- JQuery EasyUI datagrid 复杂表头处理
- JQuery EasyUI datagrid 复杂表头处理
- 动态内存空间初始化方式的比较
- Axis2(9):编写Axis2模块(Module)
- 通过宏代码自动解除excel工作表格保护
- UIImage,CGImage和CGImageRef详解
- Axis2(8):异步调用WebService
- Siverlight 动态生成datagrid复杂表头
- unix下各种包安装方法备忘
- node.js安装
- 改善C#程序的建议2:C#中dynamic的正确用法
- 字符串中连续多个空格合并成一个空格
- Axis2(7):将Spring的装配JavaBean发布成WebService
- 线程间操作无效: 从不是创建控件“label1”的线程访问它。C#定时器
- 模拟Hibernate框架的小demo
- 某大型银行深化系统之一:平台技术