.NET Blog

Tony Cavaliere

 
My Favourite Albums
  And the Grappa wins.
E-mail me Send mail
Add to Technorati Favorites AddThis Feed Button

Subscribe to Cynot Why Not


Recent posts

Disclaimer

Hey unlike other bloggers I stand by what I say but just in case. The opinions expressed herein are my own except on Tuesday when the second card is not turned up otherwise it ain't worth squat.

© Copyright 2010

LINQ to XML, Object Graphs and the ListView control

I have a subscription to msdn magazine and am a regular reader. I especially try to read all the articles on any ASP.NET related topics. Dino Exposito is a regular contributor to this magazine and has written many great articles on ASP.NET. In the April 2008 he wrote an excellent article on the new ASP.NET ListView control, specially, he discusses in detail how to bind a ListView control to hierarchical data.

This is by no means the first article that I have read on the topic of ListView controls. In all the articles or blog postings that I have read, I have yet to see how to use LINQ to create custom objects with complex object graphs. Instead anonymous types are used. In this post I will demonstrate how to create a custom object graph from a LINQ to XML query. Furthermore, I will bind this object to a nested ListView control. I will use the same example as presented by Dino in the August edition of msdn magazine.

We will be creating a hierarchical menu that is rendered using LINQ to XML, ListView control and an XML file. Listing 1 shows the menu.xml file.

Listing 1: menu.xml

<?xml version="1.0" encoding="utf-8" ?>

<menu>

  <item>

    <title>Menu Title 1</title>

    <link url="url1-1" text="text1-1"></link>

    <link url="url1-2" text="text1-2"></link>

    <link url="url1-3" text="text1-3"></link>

    <link url="url1-4" text="text1-4"></link>

  </item>

  <item>

    <title>Menu Title 2</title>

    <link url="url2-1" text="text2-1"></link>

    <link url="url2-2" text="text2-2"></link>

    <link url="url2-3" text="text2-3"></link>

  </item>

  <item>

    <title>Menu Title 3</title>

    <link url="url3-1" text="text3-1"></link>

    <link url="url3-2" text="text3-2"></link>

  </item>

</menu>

The schema of this XML file is straight forward. Each <item> node contains a menu title and then has 1 or more links. Each link has the URL to navigate too and the title that is to be used as textual display for the link.

Ultimately we would like to bind this data to a nested ListView control. The markup for this nested ListView control is shown in Listing 2. The title is render in the outer ListView control, whereas, the links are render in the inner ListView control. The code bind will be responsible for binding the outer ListView. The inner is bound declaratively. Please note that DataSource for the inner ListView control must be named links.

List 2: Nested ListView Control

    <asp:ListView ID="ListViewMenu" runat="server" ItemPlaceholderID="PlaceHolder1">

 

      <LayoutTemplate>

          <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

      </LayoutTemplate>

      <ItemTemplate>

 

        <h1><%# Eval("title")%></h1>

 

        <asp:ListView ID="ListViewSubMenu" runat="server"

          DataSource='<%# Eval("links") %>' ItemPlaceholderID="PlaceHolder2">

 

          <LayoutTemplate>

            <ul><asp:PlaceHolder ID="PlaceHolder2" runat="server"></asp:PlaceHolder></ul>

          </LayoutTemplate>

 

          <ItemTemplate>

            <li><a href='<%# Eval("url") %>'><%#Eval("text")%></a></li>

          </ItemTemplate>

 

        </asp:ListView>

      </ItemTemplate>

    </asp:ListView>

Before we use custom objects, let's review how we can use LINQ to XML and anonymous types as a data source to a ListView control. Listing 3 shows the code behind that accomplishes this.

List 3: Binding ListView Control with an Anonymous Type

        Dim doc As XDocument = XDocument.Load(Server.MapPath("App_Data/Menu.xml"))

        Dim menu = From mi In doc.<menu>.<item> _

                   Select _

                        title = mi.<title>.Value, _

                        links = From link In mi.<link> _

                                Select _

                                    url = link.@url, _

                                    [text] = link.@text

 

        ListViewMenu.DataSource = menu

        ListViewMenu.DataBind()

In this code snippet we are using the LINQ to XML features of VB.NET to query the XML file. The doc.<menu>.<item> retrieves all the <item> children for the document. The content of the <item> node is loaded into an anonymous type having two properties; title and links. The property links is a collection that is populated by the sub query. In the end, the anonymous type, menu is of type IEnumerable(Of <anonymous type>). The menu object is then used as data source to the outer ListView control.

Anonymous type are great, however, there are cases when you may need to pass the data between methods, tiers or even across process boundaries. In this scenario you should us a custom type. To do this you must first create the classes. In our case two classes are required. Listing 4 shows the two classes.

List 4: Custom Types 

<DebuggerStepThrough()> _

Public Class Menu

    <DebuggerBrowsable(DebuggerBrowsableState.Never)> _

    Private _title As String

    Public Property title() As String

        Get

            Return _title

        End Get

        Set(ByVal value As String)

            _title = value

        End Set

    End Property

    <DebuggerBrowsable(DebuggerBrowsableState.Never)> _

    Private _links As IEnumerable(Of Link)

    Public Property links() As IEnumerable(Of Link)

        Get

            Return _links

        End Get

        Set(ByVal value As IEnumerable(Of Link))

            _links = value

        End Set

    End Property

End Class

 

<DebuggerStepThrough()> _

Public Class Link

    <DebuggerBrowsable(DebuggerBrowsableState.Never)> _

    Private _url As String

    Public Property url() As String

        Get

            Return _url

        End Get

        Set(ByVal value As String)

            _url = value

        End Set

    End Property

    <DebuggerBrowsable(DebuggerBrowsableState.Never)> _

    Private _text As String

    Public Property text() As String

        Get

            Return _text

        End Get

        Set(ByVal value As String)

            _text = value

        End Set

    End Property

End Class

The two classes are named, Menu and Link. Menu contains two properties; title and links. links is of type IEnumerable(Of Link) which is important as LINQ queries of this type return the generic type IEnumerable(Of T). I have tried other generic types that derive from IEnumerable(Of T) such as List(Of T) but they generate Unable to cast object of type... exception. Perhaps there is a way to explicitly cast the object but that would require further investigation. Perhaps a future blog post?

Listing 5 shows LINQ to XML code to make use of the custom type.

List 5: Binding ListView Control with a Custom Type

        Dim doc As XDocument = XDocument.Load(Server.MapPath("App_Data/Menu.xml"))

        Dim menu = From mi In doc.<menu>.<item> _

                   Select New Menu With { _

                        .title = mi.<title>.Value, _

                        .links = From l In mi.<link> _

                                Select New Link With { _

                                    .url = l.@url, _

                                    .[text] = l.@text _

                            } _

                    }

        ListViewMenu.DataSource = menu

        ListViewMenu.DataBind()

The menu object is now of type IEnumerable(Of Menu), which can be easily passed as a parameter to a method or serialized across the wire.

Guess the movie

You loved my father, I know. But so did I. That makes us brothers, doesn't it? Smile for me now, brother.

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: ASP.NET | VB.NET | LINQ | XML
Posted by CynotWhyNot on Wednesday, April 16, 2008 4:10 PM
Permalink | Comments (71) | Post RSSRSS comment feed

Related posts

Comments

Vacation Homes Sonoma us

Monday, November 16, 2009 6:04 AM

Vacation Homes Sonoma

I often read your blog and always find it very interesting. Thought it was about time i let you know�Keep up the great work



Regards
Crosby

cataract eye drops for dogs us

Tuesday, November 17, 2009 1:31 AM

cataract eye drops for dogs

this is nice information need to know more

Regards
Haynes


watch smallville Episodes us

Tuesday, November 17, 2009 1:47 AM

watch smallville Episodes

i would love to read more from you on this


Regards
Donnelly

discount handbags sale US

Wednesday, December 02, 2009 12:35 PM

discount handbags sale

What a great info, thank you for sharing. this will help me so much in my learning.

air jordan sneakers US

Thursday, December 24, 2009 4:38 PM

air jordan sneakers

This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog.

discount designer handbags US

Thursday, December 31, 2009 12:18 PM

discount designer handbags

If you need to buy discount gucci bags, you can just type bagsvendor.com in you browser address line and find out the gucci bags on big sale in discounted price. The information below is only introducing the discount news about gucci bags and gucci handbags. A woman leads the world accounting her gucci bag. But then we must also remember that there is a well discount news that has to see. It is a common complaint that women having their share is not large enough to hold all your belongings necessary, such as discount gucci bags, designer bags. This gucci bags you can find in bagsvendor.com is that the person is unable to organize things properly. Each discount bag has a clear purpose and objects you choose to take the bag must be compatible with the purposes for which it is purchased in your mind. We can meet the wide range of needs that are part of the common things for a trip on a beautiful handbag, bags or purses. Thus, while the discounted gucci bags needs, here are some points that may be useful to organize the contents of the discount gucci bag. Even it is a discounted price gucci bags, but it has high quality. The quality of materials used with the gucci bag is leather, suede or cotton. These materials can be sure that they are not less than 100% authentic and of excellent quality discount bags. Accessories and decorative items from the discount gucci bag, such as hinges, chains, rings and belt buckles are higher that other bags. Some designers in the Gucci company will even give as a repair or replacement free of charge in a period of time to ensure that their discount handbags are offered in a different league than the shares that you can find at any mall or online store. Designer Gucci bags can be changed to discounted gucci bags. This is a big news about handbags on sale. Brands are just called by many famous fashion people, and can be done with any discounted news. Just find more in bagsvendor.com

air jordan US

Friday, January 01, 2010 11:12 PM

air jordan

In winnersneaker, these Nike Air Jordan shoes were associated with sport, fashion and basketball. The Nike Air Jordan sneakers were a way to hide some of the smaller sizes, or raise an important NBA star to even higher levels to the count. Nike Air Jordan shoes, but also less fashionable of Air Jordan history. Which were commonly used by high-ranking customers in NBA during the 19th century and were used in the 20th century to let the putrid mud in the streets, all you know is that you can find many discounted Air Jordan shoes in winnersneaker.com. Existing Air Jordan retro sneakers in the United States and Europe retails do not feel in fashion until the new Air Jordan shoes come in the street. At first the Air Jordan 1 shoes important wearing for young sport men, but once reigned basketball, Jordan shoes became the must-have fashion accessory for young people in the basketball playground. These Air Jordan original shoes were all to make a statement vividly. Air Jordans like Air Jordan 23 and Air Jordan 6 wore basketball shoes kiss in the context of his people larger than life. Wish you find a suitable Air Jordan shoes in winnersneaker.com.

Oil Change us

Tuesday, January 26, 2010 2:32 PM

Oil Change

if every editor wrote like you believe me the world would be a better place! this was an excellent read expecting more!

discount bags US

Sunday, March 07, 2010 4:04 PM

discount bags

Easily, the post is really the greatest on this laudable topic. I concur with your conclusions and will thirstily look forward to your future updates. Saying thanks will not just be sufficient, for the fantasti c lucidity in your writing. I will instantly grab your rss feed to stay privy of any updates. Solid work and much success in your business enterprize!

designer bags sale US

Monday, March 08, 2010 10:54 PM

designer bags sale

Comfortabl y, the article is in reality the best on this valuable topic. I harmonise with your conclusions and will thirstily look forward to your coming updates. Just saying thanks will not just be sufficient, for the wonderful clarity in your writing. I will instantly grab your rss feed to stay privy of any updates. Fabulous work and much success in your business dealings!

discount designer handbags US

Tuesday, March 09, 2010 2:34 PM

discount designer handbags

Substantially, the article is in reality the sweetest on this precious topic. I harmonise with your conclusions and will thirstily look forward to your upcoming updates. Saying thanks will not just be sufficient, for the phenomenal clarity in your writing. I will directly grab your rss feed to stay abreast of any updates. Pleasant work and much success in your business efforts!

james sneakers US

Wednesday, March 10, 2010 9:44 PM

james sneakers

You have a point. Very insightful. A nice different perspective

wholesale shoes from china US

Wednesday, March 10, 2010 11:28 PM

wholesale shoes from china

Funny, I actually had this on my mind a few days ago and now I come across your blog.

discount handbags sale US

Thursday, March 11, 2010 2:48 AM

discount handbags sale

Hey, guy, your blog is nice. It can bring me many useful information.

james sneakers US

Thursday, March 11, 2010 6:47 AM

james sneakers

While this subject can be very touchy for most people, my opinion is that there has to be a middle or common ground that we all can find. I do appreciate that youve added relevant and intelligent commentary here though. Thank you!

china shoes US

Friday, March 12, 2010 12:05 AM

china shoes

What a great info, thank you for sharing. this will help me so much in my learning.

shoes china US

Friday, March 12, 2010 2:51 PM

shoes china

Nice content, I trust this is a nice blog. Wish to see fresh content next time.

winner sneaker US

Sunday, March 14, 2010 3:26 AM

winner sneaker

Yeah, you are right, I agree with you.

shoes wholesale china US

Sunday, March 14, 2010 3:26 AM

shoes wholesale china

Easily, the post is really the greatest on this laudable topic. I concur with your conclusions and will thirstily look forward to your future updates. Saying thanks will not just be sufficient, for the fantasti c lucidity in your writing. I will instantly grab your rss feed to stay privy of any updates. Solid work and much success in your business enterprize!

designer bag US

Sunday, March 14, 2010 4:05 AM

designer bag

Comfortabl y, the article is in reality the best on this valuable topic. I harmonise with your conclusions and will thirstily look forward to your coming updates. Just saying thanks will not just be sufficient, for the wonderful clarity in your writing. I will instantly grab your rss feed to stay privy of any updates. Fabulous work and much success in your business dealings!

kobe shoes sale US

Sunday, March 14, 2010 4:50 AM

kobe shoes sale

You have a point. Very insightful. A nice different perspective

Winnersneaker.com US

Sunday, March 14, 2010 4:50 AM

Winnersneaker.com

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

designer handbags US

Sunday, March 14, 2010 4:53 AM

designer handbags

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

james sneakers US

Sunday, March 14, 2010 6:20 AM

james sneakers

Comfortabl y, the article is in reality the best on this valuable topic. I harmonise with your conclusions and will thirstily look forward to your coming updates. Just saying thanks will not just be sufficient, for the wonderful clarity in your writing. I will instantly grab your rss feed to stay privy of any updates. Fabulous work and much success in your business dealings!

air max sale US

Sunday, March 14, 2010 8:06 AM

air max sale

Substantially, the article is in reality the sweetest on this precious topic. I harmonise with your conclusions and will thirstily look forward to your upcoming updates. Saying thanks will not just be sufficient, for the phenomenal clarity in your writing. I will directly grab your rss feed to stay abreast of any updates. Pleasant work and much success in your business efforts!

nike air max shoes US

Monday, March 15, 2010 12:56 AM

nike air max shoes

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

kobe shoes sale US

Monday, March 15, 2010 5:58 PM

kobe shoes sale

Your blog is perfect, and I like this article. I find the information I need. I think I can find more useful information here, thanks.

designer bags sale US

Thursday, March 25, 2010 5:34 AM

designer bags sale

You have a point. Very insightful. A nice different perspective

discount air max US

Thursday, March 25, 2010 7:34 AM

discount air max

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

basketball sneakers US

Thursday, March 25, 2010 10:51 AM

basketball sneakers

Yeah, you are right, I agree with you.

supra sneakers US

Thursday, March 25, 2010 4:32 PM

supra sneakers

Hey, guy, your blog is nice. It can bring me many useful information.

kobe shoes sale US

Thursday, March 25, 2010 6:25 PM

kobe shoes sale

Yeah, you are right, I agree with you.

supra shoes US

Friday, March 26, 2010 6:53 AM

supra shoes

Hey, guy, your blog is nice. It can bring me many useful information.

paul sneakers US

Friday, March 26, 2010 10:14 AM

paul sneakers

Hey, guy, your blog is nice. It can bring me many useful information.

china shoes products US

Saturday, March 27, 2010 9:03 AM

china shoes products

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

china shoes US

Saturday, March 27, 2010 5:18 PM

china shoes

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

nba basketball shoes US

Saturday, March 27, 2010 6:01 PM

nba basketball shoes

There are certainly a lot of details like that to take into consideration. That is a great point to bring up. I offer the thoughts above as general inspiration but clearly there are questions like the one you bring up where the most important thing will be working in honest good faith. I don?t know if best practices have emerged around things like that, but I am sure that your job is clearly identified as a fair game.

discount handbag US

Sunday, March 28, 2010 7:12 AM

discount handbag

Easily, the post is really the greatest on this laudable topic. I concur with your conclusions and will thirstily look forward to your future updates. Saying thanks will not just be sufficient, for the fantasti c lucidity in your writing. I will instantly grab your rss feed to stay privy of any updates. Solid work and much success in your business enterprize!

adidas shoes US

Sunday, March 28, 2010 7:55 AM

adidas shoes

There are certainly a lot of details like that to take into consideration. That is a great point to bring up. I offer the thoughts above as general inspiration but clearly there are questions like the one you bring up where the most important thing will be working in honest good faith. I don?t know if best practices have emerged around things like that, but I am sure that your job is clearly identified as a fair game.

air max shoes US

Sunday, March 28, 2010 8:59 AM

air max shoes

You did the a great work writing and revealing the hidden beneficial features of BlogEngine.Net, that I found it was popularly used by bloggers nowadays. I think BE has emerged to be one of the best blogging platform right now. I wish you good luck with your blogging experiences.

kobe shoes US

Sunday, March 28, 2010 5:51 PM

kobe shoes

You have a point. Very insightful. A nice different perspective

nike shox US

Tuesday, March 30, 2010 6:12 PM

nike shox

Amazing article. Bookmarked it already. Best regards, Ken.

air yeezy sneakers US

Wednesday, March 31, 2010 7:16 AM

air yeezy sneakers

I was very pleased to find this site.I wanted to thank you for this great read!! I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post.

air max sneaker US

Wednesday, March 31, 2010 8:31 AM

air max sneaker

Your blog seems interesting.Regards,Kevin.

supra shoes sale US

Saturday, April 03, 2010 7:55 AM

supra shoes sale

Your blog seems interesting.Regards,Kevin.

basketball sheos US

Saturday, April 03, 2010 11:34 AM

basketball sheos

There are certainly a lot of details like that to take into consideration. That is a great point to bring up. I offer the thoughts above as general inspiration but clearly there are questions like the one you bring up where the most important thing will be working in honest good faith. I don?t know if best practices have emerged around things like that, but I am sure that your job is clearly identified as a fair game.

discount designer bags US

Saturday, April 03, 2010 4:29 PM

discount designer bags

Your blog seems interesting.Regards,Kevin.

Winnersneaker.com US

Saturday, April 03, 2010 5:53 PM

Winnersneaker.com

Thanks for your article.

james shoes sale US

Monday, April 05, 2010 6:25 PM

james shoes sale

While this subject can be very touchy for most people, my opinion is that there has to be a middle or common ground that we all can find. I do appreciate that youve added relevant and intelligent commentary here though. Thank you!

kobe sneakers US

Wednesday, April 07, 2010 4:28 PM

kobe sneakers

I was thinking of using BlogEngine but then I saw that most of the sites I looked either had comments full of spam or they had simply closed the comments altogether. I hope that you have been able to combat the spam because at the moment it is something that is making me stay away from BE.

discount designer bag US

Friday, April 09, 2010 5:21 AM

discount designer bag

I was thinking of using BlogEngine but then I saw that most of the sites I looked either had comments full of spam or they had simply closed the comments altogether. I hope that you have been able to combat the spam because at the moment it is something that is making me stay away from BE.

nike air force 1 US

Friday, April 09, 2010 6:12 AM

nike air force 1

I really appreciate this wonderful post that you have provided for us. I assure this would be beneficial for most of the people.

discount designer bag US

Saturday, April 10, 2010 5:50 PM

discount designer bag

You did the a great work writing and revealing the hidden beneficial features of BlogEngine.Net, that I found it was popularly used by bloggers nowadays. I think BE has emerged to be one of the best blogging platform right now. I wish you good luck with your blogging experiences.

nike air max shoes US

Sunday, April 11, 2010 5:05 PM

nike air max shoes

Substantially, the article is in reality the sweetest on this precious topic. I harmonise with your conclusions and will thirstily look forward to your upcoming updates. Saying thanks will not just be sufficient, for the phenomenal clarity in your writing. I will directly grab your rss feed to stay abreast of any updates. Pleasant work and much success in your business efforts!

china shoes products US

Monday, April 12, 2010 5:59 PM

china shoes products

Comfortabl y, the article is in reality the best on this valuable topic. I harmonise with your conclusions and will thirstily look forward to your coming updates. Just saying thanks will not just be sufficient, for the wonderful clarity in your writing. I will instantly grab your rss feed to stay privy of any updates. Fabulous work and much success in your business dealings!

air max 2009 US

Monday, April 12, 2010 6:02 PM

air max 2009

Amazing article. Bookmarked it already. Best regards, Ken.

air max 87 US

Wednesday, April 14, 2010 2:17 PM

air max 87

Substantially, the article is in reality the sweetest on this precious topic. I harmonise with your conclusions and will thirstily look forward to your upcoming updates. Saying thanks will not just be sufficient, for the phenomenal clarity in your writing. I will directly grab your rss feed to stay abreast of any updates. Pleasant work and much success in your business efforts!

air force 1s US

Saturday, April 17, 2010 4:52 PM

air force 1s

Amazing article. Bookmarked it already. Best regards, Ken.

worldwide shoes china US

Tuesday, April 20, 2010 6:50 PM

worldwide shoes china

While this subject can be very touchy for most people, my opinion is that there has to be a middle or common ground that we all can find. I do appreciate that youve added relevant and intelligent commentary here though. Thank you!

discount sheos wholesale US

Wednesday, April 28, 2010 5:57 PM

discount sheos wholesale

This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog.

basketball sneakers US

Wednesday, April 28, 2010 7:03 PM

basketball sneakers

Funny, I actually had this on my mind a few days ago and now I come across your blog.

bagsvendor coupon US

Thursday, May 27, 2010 10:07 AM

bagsvendor coupon

Yeah, you are right, I agree with you.

wallets online US

Thursday, May 27, 2010 10:21 AM

wallets online

Amazing article. Bookmarked it already. Best regards, Ken.

nike air jordan US

Friday, May 28, 2010 10:41 PM

nike air jordan

Nice content, I trust this is a nice blog. Wish to see fresh content next time.

discount prada handbags US

Tuesday, June 15, 2010 1:19 AM

discount prada handbags

I find your blog in google. And I will be back next time, thanks.

prada brand bags US

Friday, July 02, 2010 8:18 AM

prada brand bags

Nice content, I trust this is a nice blog. Wish to see fresh content next time.

air max 1 shoes US

Friday, July 23, 2010 2:44 AM

air max 1 shoes

Have you ever considered adding more videos to your blog posts to keep the readers more entertained? I mean I just read through the entire article of yours and it was quite good but since I am more of a visual learner,I found that to be more helpful well let me know how it turns out.

louis vuitton online US

Sunday, August 15, 2010 1:42 PM

louis vuitton online

I thought it was going to be some boring old post, but it really compensated for my time. I will post a link to this page on my blog. I am sure my visitors will find that very useful.

nike max 97 US

Tuesday, August 24, 2010 9:38 AM

nike max 97

This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog.

sandals on sale US

Wednesday, August 25, 2010 12:19 PM

sandals on sale

While this subject can be very touchy for most people, my opinion is that there has to be a middle or common ground that we all can find. I do appreciate that youve added relevant and intelligent commentary here though. Thank you!

gucci brand bags US

Friday, September 03, 2010 12:12 AM

gucci brand bags

Substantially, the article is in reality the sweetest on this precious topic. I harmonise with your conclusions and will thirstily look forward to your upcoming updates. Saying thanks will not just be sufficient, for the phenomenal clarity in your writing. I will directly grab your rss feed to stay abreast of any updates. Pleasant work and much success in your business efforts!

Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



Live preview

Saturday, September 04, 2010 1:39 AM