Silverlight 資料應用:XML,LINQ,DataGrid

  • 8018
  • 0

在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>

然後將版面配置部份加入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>

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();
        }


    }

}

這樣就輕輕鬆鬆完成可搜尋的Sliverlight 版本DataGrid。寫的還滿簡短,但如有任何問題或指教都我很樂意接受,希望能幫助到大家!