惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Jina AI
Jina AI
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
博客园 - 【当耐特】
小众软件
小众软件
博客园 - Franky
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
雷峰网
雷峰网
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
Last Week in AI
Last Week in AI
博客园_首页
月光博客
月光博客
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
Webroot Blog
Webroot Blog
Stack Overflow Blog
Stack Overflow Blog
腾讯CDC
云风的 BLOG
云风的 BLOG
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Docker
The Last Watchdog
The Last Watchdog
有赞技术团队
有赞技术团队
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
DataBreaches.Net
S
Security @ Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
TaoSecurity Blog
TaoSecurity Blog
S
Security Affairs
Y
Y Combinator Blog
O
OpenAI News
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Forbes - Security
Forbes - Security
P
Palo Alto Networks Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
K
Kaspersky official blog
Cloudbric
Cloudbric

博客园 - *小小黄*

List<T>的Sort,Find,Exists等的使用(摘抄) JQuery常用代码1 使用Telerik控件时出现Failed to create designer 的解决方法 GridView 笔记 - *小小黄* - 博客园 Telerik Rad 笔记 一 Silverlight学习笔记四:如何通过自定义ComboBox实现SelectedValue Silverlight学习笔记二(续) Silverlight学习笔记二:DataGrid 服务器端分页、排序的实现 Silverlight学习笔记一:DataGrid如何处理鼠标的滚轮事件 SQL2005快照 在ASP.NET中使用HTTP压缩 Web注册表单设计样式的研究(下) Web注册表单设计样式的研究(上) 禁用aspx页面的客户端缓存 DataGrid中没有数据时显示表头(转) 在 Windows Vista 上安裝 Reporting Services IIS7中访问Access数据库报错的解决方案 解决“无法删除文件:无法读源文件或磁盘” AjaxControlToolkit中的CalendarExtender被遮挡的解决方法
Silverlight学习笔记三:如何自定义DataGrid的Header
*小小黄* · 2008-12-29 · via 博客园 - *小小黄*

接上篇,继续学习DataGrid。下面我来学习DataGrid的Header的自定义功能。
在上篇中,我们实现的对Grid的排序,但是用的是Grid自动生产的Header,现在我们用自定义的控件来代替系统自动生成的Header,并且在Header下面添加一个可以对数据进行过滤的功能。

在这里我参考了silverlight.net上一群牛人的代码。

因为过去没有用过silverlight,在silverlight.net上听说在2.0RC出来之前,自定义ColumnHeader很容易,只需要设置Column.Header为某个控件就可以了,但是现在全变了,Column.Header变成了表头的内容了,要更改Header,必须用做一个新的Style,赋给Column.HeaderStyle。不是太明白微软问什么要这样做,把一个简单的问题搞的很复杂,对一个新手来说,做一个Style真的很费事。按照字面的意思,我认为Style应该是用来控制控件的展现方式,有点像 WEB 上的 CSS ,但是这里的Style不但可以控制如何展示控件,还要设置用什么控件,如何绑定数据,甚至还是事件的处理等等,感觉像个像个自定义控件,但是又没有自定义控件好用。

好了,废话不说了,先看效果:

具体实现的过程:

第一步,我们要做一个新的ColumnHeader。这里直接用来silverlight.net上一位高手的代码,并且做了扩展,主要是添加了Header的点击事件和过滤框的事件,
以及一个新的属性用来保存字段名。应为在实际的项目中,我们不可能在Grid上直接显示数据库的字段名,而是要用中文来显示。代码不是太复杂,就不做解释了。
 GridHeader.cs

Code

第二步,在Themes下添加一个Generic.xaml,内容如下:

Generic

这里定义了我们自定义的ColumnHeader的展现方式,包括用了一个Button和TextBox。

关于Generic.xaml我不是太明白这个文件,有些人说会自动产生这个文件,但是我的机器上并没有这个文件,我是手工添加的,现建一个themes下建一个 SilverLight用户控件,然后用上面的内容替换掉自动生成的内容,并且去掉Generic.xaml.cs的public Generic()里面的代码。

第三步,在DataGrid页面上添加Resources。如下:

Code

注意,要在文件头部加上
xmlns:my="clr-namespace:SilverlightDemoApp;assembly=SilverlightDemoApp"
就是这个my:GridHeader的namespace和assembly信息。不然就找不到my:GridHeader的了。

第四步,实现DataGrid所在页面的代码。

基础的代码可以见我的前一篇文档。

Silverlight学习笔记二:DataGrid 服务器端分页、排序的实现

Silverlight学习笔记二(续)

这里主要写一下修改的地方
xaml中的DataGrid部分。

Code

在获取数据之后,对DataGrid的Header进行了处理。新增了CreateHeader()这个方法。

 1   private void client_GetProductsPagingCompleted(object sender, GetProductsPagingCompletedEventArgs e)
 2    {
 3    if (e.Error == null)
 4    {
 5    products_list = e.Result.ToList();
 6    dgData.ItemsSource = products_list;
 7    if (pager == null)
 8    {
 9    pager = new Pager(e.TotalPage, 2);
10    pager.Click += new Pager.PagerButtonClick(pager_Click);
11    pager.PageIndex = 1;
12    spPager.Children.Clear();
13    spPager.Children.Add(pager);
14    //第一次时创建GridHeader
15    CreateHeader();
16    }
17    }
18    else
19    MessageBox.Show(e.Error.Message);
20    canvas.Visibility = Visibility.Collapsed;
21    }
22 
23   //用来存储HeaderText和数据库字段之间的对照信息
24    Dictionary<stringstring> FieldDict = new Dictionary<stringstring>();
25    private void CreateHeader()
26    {
27    var v = from p in dgData.Columns
28    where p is DataGridBoundColumn
29    select p;
30    foreach (DataGridBoundColumn column in v.ToList())
31    {
32    string fieldname = column.Binding.Path.Path;
33    Style style_header = Resources["grid-header"as Style;
34    column.HeaderStyle = style_header;
35 
36    //本来这里我是希望可以直接设置Header的FieldText为字段名的,但是却找不到什么好的方法,
37    //
38    //<my:GridHeader HeaderText="{TemplateBinding Content}" Height="Auto" Loaded="GridHeader_Loaded" />
39    //Resources中这里也不能直接绑定FieldText为Binding.Path.Path,因为这里是从DataGridColumnHeader来的,
40    //DataGridColumnHeader只有Content,而找不到对应的绑定信息。
41    //
42    //另外,通过访问Style的Setter,我也只能获取到ControlTemplate,但是ControlTemplate下面的内容,也就是my:GridHeader取怎么也获取不到,
43    //如果有高人知道,请指教一下。谢谢
44    //
45    //所以,没办法,只能暂时把字段名和HeaderText都保存到Dictionary里面,供后面使用
46 
47    FieldDict.Add(column.Header.ToString(), fieldname);
48    }
49    }
50 
51    private void GridHeader_Loaded(object sender, RoutedEventArgs e)
52    {
53    GridHeader header = sender as GridHeader;
54    header.OnFilter += new GridHeader.FilterTextEvent(header_OnFilter);
55    header.OnSort += new GridHeader.HeaderClickEvent(header_OnSort);
56    string fieldtext;
57    //在这里,我们对Header的FieldText设置为字段名。
58    //如果能在这里获取到当前的Column的话,前面就不要用Dictionary了,但是这里我仍然不知道该怎么获取到当前的Column。
59    if (FieldDict.TryGetValue(header.HeaderText, out fieldtext))
60    header.FieldText = fieldtext;
61    }
62 
63    void header_OnSort(string fieldname)
64    {
65    //这里具体的代码就不写了。
66    //在获取到字段名之后,对数据进行排序。
67    MessageBox.Show("对字段:" + fieldname + "进行排序");
68    }
69 
70    void header_OnFilter(string fieldname, string filtertext)
71    {
72    //这里具体的代码就不写了。
73    //在获取到字段名和关键字只有,就可以通过WCF获取到指定的数据了。
74    MessageBox.Show("对字段:" + fieldname + " 按照 " + filtertext + " 进行过滤");
75    }

ok,打完手工。