b

blu

Sunday, 30 December 2012

Using linq to xml binding in silverlight datagrid VB.NET

Using linq to xml binding in silverlight datagrid VB.NET


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 ReadOnly Property ProductName() As String
                Get
            }
                End Get
            End Property
            Public ReadOnly Property Quanity() As Int32
                Get
            }
                End Get
            End Property
            Public ReadOnly Property UnitPrice() As Double
                Get
            }
                End Get
            End Property
            Public ReadOnly Property Total() As Double
                Get
            }
                End Get
            End Property
 'this is compute element.
End Class

Step 6)  Binding LINQ To XML to Datagrid in Silverlight

 Private  Sub LoadXml()
                Dim client As WebClient =  New WebClient()

                client.OpenReadCompleted += client_OpenReadCompleted
                client.OpenReadAsync(New Uri("SalesOrder.xml",UriKind.Relative))
  End Sub

     Private  Sub client_OpenReadCompleted(ByVal sender As Object, ByVal e As OpenReadCompletedEventArgs)
            Try

                Dim doc As XDocument =  XDocument.Load(e.Result)
                If doc Is Nothing Then
                     MessageBox.Show("doc is null")
                End If
                var query = from ele Function doc.Descendants(ByVal"Item") As in
                                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.
                End Function



             'LINQ to XML result binding it to Silverlight DataGrid.
                datagrid4.ItemsSource = query
            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try

     End Sub

Step7)   LINQ TO XML in Silverlight  call LoadXml on PageLoad

Private Function Page1() As Public
            InitializeComponent()
            LoadXml()
End Function

Step 8) Run the Application

No comments:

Post a Comment