b

blu

Sunday, 30 December 2012

using linq to xml binding in silverlight datagrid

Using linq to xml binding in silverlight datagrid


Step 1) Create Silverlight Project using C#.NET
Step 2) Add a datagrid to  Grid/canvas/statckpanel layout Here Grid Layout

    <Grid x:Name="LayoutRoot" Background="red">
        <sdk:DataGrid
             x:Name="datagrid4"
            AutoGenerateColumns="False"
           ItemsSource="{Binding}" 
Grid.Column="01" 
Grid.Row="2"
 HorizontalAlignment="Left"
 Height="150"
 VerticalAlignment="Top"
 Width="330"  
GridLinesVisibility="All" 
Margin="0,0,-180,0">
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn
Foreground="Red"  Visibility="Visible" 
Binding="{Binding Path=ProductName}"
Header="Prodcutname">
</sdk:DataGridTextColumn>
                <sdk:DataGridTextColumn 
Binding="{Binding Path=Quanity}"
Header="Quantity">
</sdk:DataGridTextColumn>
                <sdk:DataGridTextColumn
 Binding="{Binding Path=UnitPrice}"
 Header="UnitPrice">
</sdk:DataGridTextColumn>
                <sdk:DataGridTextColumn 
Binding="{Binding Path=Total}"
Header="Total Amount">
</sdk:DataGridTextColumn>
 </sdk:DataGrid.Columns>
 </sdk:DataGrid>

Step 3)  For this example I used SalesOrder.xml shown below
  Note:  Add SalesOrder.xml to ClientBin Directory.
<?xml version="1.0" encoding="utf-8" ?>

<HeaderLines>
  <SalesOrder>
    <Header Date="17-02-04" Type="Quote">
      <SellTo CountryRegion="GB">
       <Name>The Cannon Group PLC</Name>
       <Address>192 Market Square</Address>
       <City>Birmingham</City>
       <Zip>B27 4KT</Zip>
     </SellTo>
     <BillTo CountryRegion="GB">
       <Name>The Cannon Group PLC</Name>
       <Address>192 Market Square</Address>
       <City>Birmingham</City>
       <Zip>B27 4KT</Zip>
     </BillTo>
     <Lines>
       <Item PartNum="LS-150">
         <ProductName>Loudspeaker, Cherry, 150W</ProductName>
         <Quantity>8</Quantity>
         <UnitPrice>12900</UnitPrice>
         <ShipmentDate />
         <Comment>Confirm the voltage is 75W</Comment>
       </Item>
          <Item PartNum="LS-MAN-10">
          <ProductName>Manual for Loudspeakers</ProductName>
          <Quantity>20</Quantity>
            <UnitPrice>100</UnitPrice>
          <ShipmentDate />
          <Comment />
       </Item>
          <Item PartNum="LS-2">
            <ProductName>Cables for Loudspeakers</ProductName>
            <Quantity>10</Quantity>
            <UnitPrice>2100</UnitPrice>
            <ShipmentDate />
            <Comment />
            </Item>
     </Lines>
     <Contact>Mr. Andy Toal</Contact>
     <Terms>14 days</Terms>
    </Header>
  </SalesOrder>
</HeaderLines>

Step 4) Add System.Xml.Linq   to the project

Step 5)  Add a Public class Equivalent to Elements you are going to fetch from XML.
in this case 3 elements 1 compute element.
 note:  if not public day may not be visible.
public class Item
        {
            public String ProductName{get;set;}
            public Int32 Quanity{get;set;}
            public Double UnitPrice{get;set;}
            public Double Total{get;set;} //this is compute element.
        }

Step 6)  Binding LINQ To XML to Datagrid in Silverlight

 void LoadXml()
        {
                WebClient client = new WebClient();
               
                client.OpenReadCompleted += client_OpenReadCompleted;
                client.OpenReadAsync(new Uri("SalesOrder.xml", UriKind.Relative));
        }

     void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            try{

                XDocument doc = XDocument.Load(e.Result);
                if (doc == null) MessageBox.Show("doc is null");
                var query = from ele in doc.Descendants("Item")
                            select new Item
                            {
                                ProductName = ele.Element("ProductName").Value,
                                Quanity = Convert.ToInt32(ele.Element("Quantity").Value),
                                UnitPrice = Convert.ToDouble(ele.Element("UnitPrice").Value),
                                Total =  Convert.ToInt32(ele.Element("Quantity").Value)*
                                         Convert.ToDouble(ele.Element("UnitPrice").Value)
                                        //Total is compute column.
                            };

              
             //LINQ to XML result binding it to Silverlight DataGrid.
                datagrid4.ItemsSource = query;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
              
            }

        }


Step7)   LINQ TO XML in Silverlight  call LoadXml on PageLoad

public Page1()
        {
            InitializeComponent();
            LoadXml();
        }
Step 8) Run the Application

No comments:

Post a Comment