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