在Silverlight上用DataGrid讀取XML的資料,並且可以使用LINQ方式寫搜尋的功能。
今天我要教大家做一個簡單的範例,主要是用DataGrid讀取XML的資料並且可以使用LINQ方式搜尋資料
先在專案中加入一個XML檔案,來做讀取資料部分
命名為Person.xml,其內容格式如下
<?xml version="1.0" encoding="utf-8" ?>
<persons>
<person>
<Name>張三</Name>
<Birthday>2008/10/10</Birthday>
<Tel>0900000123</Tel>
<address city="台北" country="台灣" />
</person>
<person>
<Name>李四</Name>
<Birthday>2008/10/10</Birthday>
<Tel>0900000123</Tel>
<address city="台灣" country="台灣" />
</person>
</persons>
<persons>
<person>
<Name>張三</Name>
<Birthday>2008/10/10</Birthday>
<Tel>0900000123</Tel>
<address city="台北" country="台灣" />
</person>
<person>
<Name>李四</Name>
<Birthday>2008/10/10</Birthday>
<Tel>0900000123</Tel>
<address city="台灣" country="台灣" />
</person>
</persons>
然後將版面配置部份加入Sliverlight元件的TextBox、ComboBox、Button,這是要來做搜尋的功能
而主要程現資料內容的是DataGrid。
Page.xaml
<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightXMLTest.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="SearchTextBox" Grid.Column="0"/>
<ComboBox x:Name="SearchItem" Grid.Column="1" FontSize="15" />
<Button x:Name="SearchButton" Grid.Column="2" Content="搜尋" FontSize="15" Click="SearchButton_Click"/>
<data:DataGrid x:Name="MyDataGrid" Grid.ColumnSpan="3" Grid.Row="1" AutoGenerateColumns="False">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="姓名" Binding="{Binding Name}" />
<data:DataGridTextColumn Header="生日" Binding="{Binding Birthday}" />
<data:DataGridTextColumn Header="電話" Binding="{Binding Tel}" />
<data:DataGridTextColumn Header="城市" Binding="{Binding City}" />
<data:DataGridTextColumn Header="國籍" Binding="{Binding Country}" />
</data:DataGrid.Columns>
</data:DataGrid>
</Grid>
</UserControl>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="SearchTextBox" Grid.Column="0"/>
<ComboBox x:Name="SearchItem" Grid.Column="1" FontSize="15" />
<Button x:Name="SearchButton" Grid.Column="2" Content="搜尋" FontSize="15" Click="SearchButton_Click"/>
<data:DataGrid x:Name="MyDataGrid" Grid.ColumnSpan="3" Grid.Row="1" AutoGenerateColumns="False">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="姓名" Binding="{Binding Name}" />
<data:DataGridTextColumn Header="生日" Binding="{Binding Birthday}" />
<data:DataGridTextColumn Header="電話" Binding="{Binding Tel}" />
<data:DataGridTextColumn Header="城市" Binding="{Binding City}" />
<data:DataGridTextColumn Header="國籍" Binding="{Binding Country}" />
</data:DataGrid.Columns>
</data:DataGrid>
</Grid>
</UserControl>
在DataGrid的部分,記得要先將AutoGenerateColumns="False"然後再自行設定欄位名稱及要繫結的欄位。
接下來進入程式的部分
因為我們是要用LINQ對XML所以要加上using System.Xml.Linq,因為預設的專案是沒加上這個的
在Reference按右鍵,選擇.NET如圖,最後按下OK
Page.xaml.cs 程式如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml.Linq;
namespace SilverlightTheadTest
{
public partial class Page : UserControl
{
//建立資料的格式
public class Person
{
public string Name { get; set; }
public string Birthday { get; set; }
public string Tel { get; set; }
public string Country { get; set; }
public string City { get; set; }
}
//下拉選單的選項
List<string> items = new List<string>() { "姓名", "生日", "電話", "城市","國籍" };
//選擇要查詢的欄位
List<string> SelectItems = new List<string>() { "Name", "Birthday", "Tel", "City", "Country" };
XDocument PersonXml = XDocument.Load("Person.xml"); //讀取Person.xml檔案
public Page()
{
InitializeComponent();
//讀取的事件
Loaded += new RoutedEventHandler(Page_Loaded);
//下拉選單加入選項
SearchItem.ItemsSource = items;
//預設為姓名
SearchItem.SelectedIndex = 0;
}
void Page_Loaded(object sender, RoutedEventArgs e)
{
getData();
}
void getData()
{
//建立資料來源
List<Person> source = new List<Person>();
//使用LINQ方式查詢XML
var Persons = from a in PersonXml.Element("persons").Descendants("person")
where a.Element(SelectItems[SearchItem.SelectedIndex]).Value.Contains(SearchTextBox.Text)
select a;
//將查詢的結果放入資料來源
foreach (XElement Person in Persons)
{
source.Add(new Person()
{
Name = Person.Element("Name").Value,
Birthday = Person.Element("Birthday").Value,
Tel = Person.Element("Tel").Value,
City = Person.Element("address").Attribute("city").Value,
Country = Person.Element("address").Attribute("country").Value
});
}
//將DataGrid與資料來源做連結
MyDataGrid.ItemsSource = source;
}
//當按下搜尋的時候
private void SearchButton_Click(object sender, RoutedEventArgs e)
{
getData();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml.Linq;
namespace SilverlightTheadTest
{
public partial class Page : UserControl
{
//建立資料的格式
public class Person
{
public string Name { get; set; }
public string Birthday { get; set; }
public string Tel { get; set; }
public string Country { get; set; }
public string City { get; set; }
}
//下拉選單的選項
List<string> items = new List<string>() { "姓名", "生日", "電話", "城市","國籍" };
//選擇要查詢的欄位
List<string> SelectItems = new List<string>() { "Name", "Birthday", "Tel", "City", "Country" };
XDocument PersonXml = XDocument.Load("Person.xml"); //讀取Person.xml檔案
public Page()
{
InitializeComponent();
//讀取的事件
Loaded += new RoutedEventHandler(Page_Loaded);
//下拉選單加入選項
SearchItem.ItemsSource = items;
//預設為姓名
SearchItem.SelectedIndex = 0;
}
void Page_Loaded(object sender, RoutedEventArgs e)
{
getData();
}
void getData()
{
//建立資料來源
List<Person> source = new List<Person>();
//使用LINQ方式查詢XML
var Persons = from a in PersonXml.Element("persons").Descendants("person")
where a.Element(SelectItems[SearchItem.SelectedIndex]).Value.Contains(SearchTextBox.Text)
select a;
//將查詢的結果放入資料來源
foreach (XElement Person in Persons)
{
source.Add(new Person()
{
Name = Person.Element("Name").Value,
Birthday = Person.Element("Birthday").Value,
Tel = Person.Element("Tel").Value,
City = Person.Element("address").Attribute("city").Value,
Country = Person.Element("address").Attribute("country").Value
});
}
//將DataGrid與資料來源做連結
MyDataGrid.ItemsSource = source;
}
//當按下搜尋的時候
private void SearchButton_Click(object sender, RoutedEventArgs e)
{
getData();
}
}
}
這樣就輕輕鬆鬆完成可搜尋的Sliverlight 版本DataGrid。寫的還滿簡短,但如有任何問題或指教都我很樂意接受,希望能幫助到大家!