<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.windowsclient.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Ken Tucker</title><link>http://blogs.windowsclient.net/ken_tucker/default.aspx</link><description>Visual Basic MVP</description><dc:language>en</dc:language><generator>CommunityServer 2007 (Build: 20423.869)</generator><item><title>How to Dynamically add bound controls to a Data repeater</title><link>http://blogs.windowsclient.net/ken_tucker/archive/2009/01/26/how-to-dynamically-add-bound-controls-to-a-data-repeater.aspx</link><pubDate>Mon, 26 Jan 2009 11:41:00 GMT</pubDate><guid isPermaLink="false">f1c07d22-4184-4df1-9c40-8dd04b52e796:102471</guid><dc:creator>ken tucker</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.windowsclient.net/ken_tucker/rsscomments.aspx?PostID=102471</wfw:commentRss><comments>http://blogs.windowsclient.net/ken_tucker/archive/2009/01/26/how-to-dynamically-add-bound-controls-to-a-data-repeater.aspx#comments</comments><description>&lt;p&gt;In the datarepeater&amp;#39;s ItemCloning event you have the option to add bound controls to the datarepeater item.&amp;nbsp; For this example I have a datarepeater named datarepeater1.&amp;nbsp; I am using Linq to Sql to get data from the northwind database employee table&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;Public&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="COLOR:blue;"&gt;Class&lt;/span&gt; Form1&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; bs &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;New&lt;/span&gt; BindingSource&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Sub&lt;/span&gt; Form1_Load(&lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; System.Object, &lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="COLOR:blue;"&gt;Handles&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;MyBase&lt;/span&gt;.Load&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; db &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;New&lt;/span&gt; NorthwindDataContext&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; q = &lt;span style="COLOR:blue;"&gt;From&lt;/span&gt; emp &lt;span style="COLOR:blue;"&gt;In&lt;/span&gt; db.Employees &lt;span style="COLOR:blue;"&gt;Select&lt;/span&gt; emp&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bs.DataSource = q&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataRepeater1.DataSource = bs&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Sub&lt;/span&gt; DataRepeater1_ItemCloning(&lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; sender &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Object&lt;/span&gt;, &lt;span style="COLOR:blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; Microsoft.VisualBasic.PowerPacks.DataRepeaterItemCloneEventArgs) &lt;span style="COLOR:blue;"&gt;Handles&lt;/span&gt; DataRepeater1.ItemCloning&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; lbl &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;New&lt;/span&gt; Label&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; b &lt;span style="COLOR:blue;"&gt;As&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;New&lt;/span&gt; Binding(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Text&amp;quot;&lt;/span&gt;, bs, &lt;span style="COLOR:#a31515;"&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lbl.DataBindings.Add(b)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Source.Controls.Add(lbl)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;COLOR:blue;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt;End&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;"&gt; &lt;span style="COLOR:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.windowsclient.net/aggbug.aspx?PostID=102471" width="1" height="1"&gt;</description></item><item><title>Validating Data entered in a DataRepeater control </title><link>http://blogs.windowsclient.net/ken_tucker/archive/2008/05/07/validating-data-entered-in-a-datarepeater-control.aspx</link><pubDate>Wed, 07 May 2008 10:52:00 GMT</pubDate><guid isPermaLink="false">f1c07d22-4184-4df1-9c40-8dd04b52e796:26790</guid><dc:creator>ken tucker</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.windowsclient.net/ken_tucker/rsscomments.aspx?PostID=26790</wfw:commentRss><comments>http://blogs.windowsclient.net/ken_tucker/archive/2008/05/07/validating-data-entered-in-a-datarepeater-control.aspx#comments</comments><description>&lt;p&gt;In this example I will show how to validate the data entered into a datarepeater control. For this example I am added the northwind SQL compact edition database to the project and created a typed dataset for the products table.&amp;nbsp; So from the toolbox drop a datarepeater on the form.&amp;nbsp; Inside the datarepeater drag the ProductName, UnitPrice, and Units in stock fields. Your form should look something like&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.vb-tips.com/image.axd?picture=WindowsLiveWriter/ValidatingDataenteredinaDataRepeatercont_5EAF/image_2.png"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="198" alt="image" src="http://www.vb-tips.com/image.axd?picture=WindowsLiveWriter/ValidatingDataenteredinaDataRepeatercont_5EAF/image_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now in the drawitem event for the datarepeater we can add a handler to validating event.&lt;/p&gt;
&lt;p&gt;Private Sub DataRepeater1_DrawItem(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs) Handles DataRepeater1.DrawItem &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim currItem As DataRowView = DirectCast(ProductsBindingSource.Item(e.DataRepeaterItem.ItemIndex), DataRowView) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim txt As TextBox = DirectCast(e.DataRepeaterItem.Controls(&amp;quot;Unit_PriceTextBox&amp;quot;), TextBox) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddHandler txt.Validating, AddressOf TextBox_Validating &lt;br /&gt;End Sub &lt;/p&gt;
&lt;p&gt;Private Sub TextBox_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim dec As Decimal &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Decimal.TryParse(DirectCast(sender, TextBox).Text, dec) Then &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(&amp;quot;Please enter a valid number&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Cancel = True &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If &lt;br /&gt;End Sub&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The complete code&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Public Class Form1 &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub ProductsBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProductsBindingNavigatorSaveItem.Click &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Validate() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.ProductsBindingSource.EndEdit() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;TODO: This line of code loads data into the &amp;#39;NorthwindDataSet.Products&amp;#39; table. You can move, or remove it, as needed. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.ProductsTableAdapter.Fill(Me.NorthwindDataSet.Products) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub DataRepeater1_DrawItem(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs) Handles DataRepeater1.DrawItem &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim currItem As DataRowView = DirectCast(ProductsBindingSource.Item(e.DataRepeaterItem.ItemIndex), DataRowView) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim txt As TextBox = DirectCast(e.DataRepeaterItem.Controls(&amp;quot;Unit_PriceTextBox&amp;quot;), TextBox) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddHandler txt.Validating, AddressOf TextBox_Validating &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub TextBox_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim dec As Decimal &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Decimal.TryParse(DirectCast(sender, TextBox).Text, dec) Then &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(&amp;quot;Please enter a valid number&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Cancel = True &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;br /&gt;End Class&lt;/p&gt;&lt;img src="http://blogs.windowsclient.net/aggbug.aspx?PostID=26790" width="1" height="1"&gt;</description><category domain="http://blogs.windowsclient.net/ken_tucker/archive/tags/VB/default.aspx">VB</category></item><item><title>Print to PDF</title><link>http://blogs.windowsclient.net/ken_tucker/archive/2008/04/04/print-to-pdf.aspx</link><pubDate>Sat, 05 Apr 2008 02:09:00 GMT</pubDate><guid isPermaLink="false">f1c07d22-4184-4df1-9c40-8dd04b52e796:20704</guid><dc:creator>ken tucker</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.windowsclient.net/ken_tucker/rsscomments.aspx?PostID=20704</wfw:commentRss><comments>http://blogs.windowsclient.net/ken_tucker/archive/2008/04/04/print-to-pdf.aspx#comments</comments><description>&lt;p&gt;The .Net framework provides a print document class for printing.&amp;nbsp; There are times that it would be nice to redirect what you are printing to a pdf.&amp;nbsp;&amp;nbsp; In this example we are going to use the Sharp Pdf lib version 1.3.1 to print to a pdf.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;The sharp pdf lib allows you to add an image to a page in a pdf.&amp;nbsp; To make it possible to print to a pdf we are going to create a new print controller class which creates a bitmap and has the print document draw the page on the bitmap.&amp;nbsp; Then it adds the bitmap as a pdf page.&amp;nbsp; Once the document is done printing it saves the pdf to disk.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://sharppdf.sourceforge.net/"&gt;http://sharppdf.sourceforge.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Update this project is now available on CodePlex&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codeplex.com/Print2Pdf"&gt;http://www.codeplex.com/Print2Pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Imports sharpPDF &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Public Class PdfPrintController &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits Printing.PrintController &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim pdf As pdfDocument &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim bm As Image &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private _Author As String = &amp;quot;Unknown&amp;quot; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Property Author() As String &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return _Author &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set(ByVal value As String) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Author = value &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Set &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private _FileName As String = &amp;quot;Printed.pdf&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Property FileName() As String &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return _FileName &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set(ByVal value As String) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _FileName = value &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Set &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private _Title As String = &amp;quot;Unknown&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Property Title() As String &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return _Title &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set(ByVal value As String) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Title = value &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Set &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Overrides ReadOnly Property IsPreview() As Boolean &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return True &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Overrides Function OnStartPage(ByVal document As System.Drawing.Printing.PrintDocument, ByVal e As System.Drawing.Printing.PrintPageEventArgs) As System.Drawing.Graphics &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bm = New Bitmap(e.PageBounds.Width, e.PageBounds.Height) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim g As Graphics = Graphics.FromImage(bm) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.Clear(Color.White) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return g &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Overrides Sub OnStartPrint(ByVal document As System.Drawing.Printing.PrintDocument, ByVal e As System.Drawing.Printing.PrintEventArgs) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pdf = New pdfDocument(Title, Author) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnStartPrint(document, e) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Overrides Sub OnEndPage(ByVal document As System.Drawing.Printing.PrintDocument, ByVal e As System.Drawing.Printing.PrintPageEventArgs) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim p As pdfPage = pdf.addPage(e.PageBounds.Height, e.PageBounds.Width) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.addImage(bm, 0, 0) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnEndPage(document, e) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Overrides Sub OnEndPrint(ByVal document As System.Drawing.Printing.PrintDocument, ByVal e As System.Drawing.Printing.PrintEventArgs) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pdf.createPDF(FileName) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnEndPrint(document, e) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/p&gt;
&lt;p&gt;End Class&lt;/p&gt;
&lt;p&gt;Here is a sample which creates a pdf of the Northwind product list.&lt;/p&gt;
&lt;p&gt;Imports System.Data.SqlClient &lt;/p&gt;
&lt;p&gt;Public Class Form1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public WithEvents p As New Printing.PrintDocument &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim iRecord As Integer = 0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim fntPrice As New Font(&amp;quot;Arial&amp;quot;, 12) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ds As New DataSet &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strConn As String &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim conn As SqlConnection &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim da As SqlDataAdapter &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strConn = &amp;quot;Server = .\SQLEXPRESS;&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strConn &amp;amp;= &amp;quot;Database = Northwind; Integrated Security = SSPI;&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn = New SqlConnection(strConn) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; da = New SqlDataAdapter(&amp;quot;Select ProductName, UnitPrice From Products&amp;quot;, conn) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; da.Fill(ds, &amp;quot;Products&amp;quot;) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataGridView1.DataSource = ds.Tables(&amp;quot;Products&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub p_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles p.BeginPrint &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iRecord = 0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub p_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles p.PrintPage &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim g As Graphics = e.Graphics &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim iPageHeight As Integer = e.PageBounds.Height &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim iPageWidth As Integer = e.PageBounds.Width &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim iFntHeight As Integer = CInt(g.MeasureString(&amp;quot;Test&amp;quot;, fntPrice).Height) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim iLinesPerPage As Integer = iPageHeight \ iFntHeight - 15 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim yPos As Integer = 0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim iTop As Integer &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim iMax As Integer = ds.Tables(&amp;quot;Products&amp;quot;).Rows.Count &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strDescription As String &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim x As Integer &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim xPos As Integer &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strPrice As String &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim fntTitle As Font = New Font(&amp;quot;Microsoft Sans Serf&amp;quot;, 14) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim iCount As Integer = ds.Tables(&amp;quot;Products&amp;quot;).Rows.Count &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strDate As String = Trim(Now.ToLongDateString) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim sf As New StringFormat &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sf.Alignment = StringAlignment.Far &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xPos = CInt(iPageWidth - g.MeasureString(&amp;quot;Price List&amp;quot;, fntTitle).Width) \ 2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawString(&amp;quot;Price List&amp;quot;, fntTitle, Brushes.Black, xPos, 10) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yPos = 10 + CInt(g.MeasureString(&amp;quot;Price List&amp;quot;, fntTitle).Height) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xPos = CInt(iPageWidth - g.MeasureString(strDate, fntPrice).Width) \ 2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawString(strDate, fntPrice, Brushes.Black, xPos, yPos) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yPos += 2 * iFntHeight &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawString(&amp;quot;Product&amp;quot;, fntPrice, Brushes.Black, 50, yPos) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawString(&amp;quot;Price&amp;quot;, fntPrice, Brushes.Black, _ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; New Rectangle(430, yPos, 100, 2 * iFntHeight), sf) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yPos += iFntHeight &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawLine(Pens.Black, 0, yPos, iPageWidth, yPos) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.HasMorePages = True &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iTop = yPos &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For x = 0 To iLinesPerPage &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If iRecord &amp;lt; imax Then &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With ds.Tables(&amp;quot;Products&amp;quot;).Rows(iRecord) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strDescription = .Item(&amp;quot;ProductName&amp;quot;).ToString &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strPrice = Convert.ToDecimal(.Item(&amp;quot;UnitPrice&amp;quot;)).ToString(&amp;quot;c&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim rName As New Rectangle(5, yPos, 400, iFntHeight) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim rPrice As New Rectangle(430, yPos, 100, iFntHeight) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawString(strDescription, fntPrice, Brushes.Black, rName) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawString(strPrice, fntPrice, Brushes.Black, rPrice, sf) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.HasMorePages = False &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yPos += iFntHeight &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iRecord += 1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fntTitle.Dispose() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If e.HasMorePages = False Then iRecord = 0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim pc As New PdfPrintController &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pc.Title = &amp;quot;Test Pdf&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pc.Author = &amp;quot;Ken Tucker&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pc.FileName = &amp;quot;Test.pdf&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.PrintController = pc &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.Print() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;br /&gt;End Class &lt;/p&gt;&lt;img src="http://blogs.windowsclient.net/aggbug.aspx?PostID=20704" width="1" height="1"&gt;</description></item><item><title>DataGridViewCombobox AutoComplete</title><link>http://blogs.windowsclient.net/ken_tucker/archive/2008/03/26/datagridviewcombobox-autocomplete.aspx</link><pubDate>Wed, 26 Mar 2008 17:52:00 GMT</pubDate><guid isPermaLink="false">f1c07d22-4184-4df1-9c40-8dd04b52e796:19286</guid><dc:creator>ken tucker</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.windowsclient.net/ken_tucker/rsscomments.aspx?PostID=19286</wfw:commentRss><comments>http://blogs.windowsclient.net/ken_tucker/archive/2008/03/26/datagridviewcombobox-autocomplete.aspx#comments</comments><description>&lt;p&gt;&lt;span&gt;&lt;p align="left"&gt;&lt;font face="Arial" size="2"&gt;Here is a quick example on using an autocomplete combobox in the DataGridView.&amp;nbsp; In this example I load all the possible values for the combobox into a AutoCompleteStringCollection and make that the DataGridViewComboBox&amp;#39;s datasource.&amp;nbsp; In the editingControl showing event you need to set the ComboBox&amp;#39;s DropDownStyle, and the auto complete settings.&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;Imports System.Data.SqlClient&lt;/p&gt;
&lt;p align="left"&gt;Public Class Form1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim scAutoComplete As New AutoCompleteStringCollection&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strConn As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim da As SqlDataAdapter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim conn As SqlConnection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ds As New DataSet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strConn = &amp;quot;Server = .\SQLEXPRESS;Database = NorthWind; Integrated Security = SSPI;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn = New SqlConnection(strConn)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; da = New SqlDataAdapter(&amp;quot;Select * from [Orders]&amp;quot;, conn)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; da.Fill(ds, &amp;quot;Orders&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataGridView1.DataSource = ds.Tables(&amp;quot;Orders&amp;quot;)&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cmd As New SqlCommand(&amp;quot;Select CustomerID From customers&amp;quot;, conn)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim dr As SqlDataReader&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dr = cmd.ExecuteReader&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do While dr.Read&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; scAutoComplete.Add(dr.GetString(0))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Loop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Close()&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim dgvcbc As New DataGridViewComboBoxColumn&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With dgvcbc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .DataPropertyName = &amp;quot;CustomerID&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .DataSource = scAutoComplete&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .HeaderText = &amp;quot;Customer ID&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataGridView1.Columns.Remove(&amp;quot;CustomerID&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataGridView1.Columns.Insert(1, dgvcbc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub
DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewEditingControlShowingEventArgs)
Handles DataGridView1.EditingControlShowing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If DataGridView1.CurrentCell.ColumnIndex = 1 AndAlso TypeOf e.Control Is ComboBox Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With DirectCast(e.Control, ComboBox)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .DropDownStyle = ComboBoxStyle.DropDown&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AutoCompleteMode = AutoCompleteMode.SuggestAppend&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AutoCompleteSource = AutoCompleteSource.CustomSource&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AutoCompleteCustomSource = scAutoComplete&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/p&gt;
&lt;p align="left"&gt;End Class&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://blogs.windowsclient.net/aggbug.aspx?PostID=19286" width="1" height="1"&gt;</description><category domain="http://blogs.windowsclient.net/ken_tucker/archive/tags/Datagridview/default.aspx">Datagridview</category></item><item><title>Sync Services Part 2</title><link>http://blogs.windowsclient.net/ken_tucker/archive/2008/03/11/sync-services-part-2.aspx</link><pubDate>Tue, 11 Mar 2008 18:14:00 GMT</pubDate><guid isPermaLink="false">f1c07d22-4184-4df1-9c40-8dd04b52e796:17403</guid><dc:creator>ken tucker</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.windowsclient.net/ken_tucker/rsscomments.aspx?PostID=17403</wfw:commentRss><comments>http://blogs.windowsclient.net/ken_tucker/archive/2008/03/11/sync-services-part-2.aspx#comments</comments><description>&lt;p&gt;
In the second post of this series we will make it so changes we make to the local data will be sent back to the server.&amp;nbsp; Lets start by opening the project we created in the previous post. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
So lets extend the SyncAgent Partial classes to make the sync 2 way. The class contains a partial method OnInitialized which you can add code to.&amp;nbsp;&amp;nbsp; In this method we will make the Products table Sync Direction Bidirectional. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Partial Public Class NorthwindSyncAgent 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub OnInitialized()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Products.SyncDirection = SyncDirection.Bidirectional&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;br /&gt;
End Class 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Now what if there is a conflict? Let create a form to give the user the option of keeping the changes he/she made or to accept the changes on the server.&amp;nbsp; Add a form named frmConflict to the project.&amp;nbsp; On the form add 2 buttons (btnClient, and btnServer) and 2 datagridviews (dgvClient, and dgvServer).&amp;nbsp; Here is what my form looks like 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blogs.windowsclient.net/image.axd?picture=WindowsLiveWriter/SyncServicesPart2_126BF/image_2.png"&gt;&lt;img src="http://www.onteorasoftware.net/image.axd?picture=WindowsLiveWriter/SyncServicesPart2_126BF/image_thumb.png" title="image" style="border:0px none;" alt="image" border="0" height="227" width="340" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Add the following code to the buttons 
&lt;/p&gt;
&lt;p&gt;
Private Sub btnClient_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClient.Click&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.DialogResult = Windows.Forms.DialogResult.OK&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Close()&lt;br /&gt;
End Sub 
&lt;/p&gt;
&lt;p&gt;
Private Sub btnServer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnServer.Click&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.DialogResult = Windows.Forms.DialogResult.Cancel&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Close()&lt;br /&gt;
End Sub 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Now we need to extend the ServerSyncProvider to raise an event when there is a conflict. If the user presses the Keep my changes button we force the changes to be written to the database otherwise we allow the change to be made 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Partial Public Class NorthwindServerSyncProvider 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub OnInitialized()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddHandler ApplyChangeFailed, AddressOf ApplyChangesFailed&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub ApplyChangesFailed(ByVal sender As Object, ByVal e As ApplyChangeFailedEventArgs)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim frm As New frmConflict&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frm.dgvClient.DataSource = e.Conflict.ClientChange&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frm.dgvServer.DataSource = e.Conflict.ServerChange&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; frm.ShowDialog()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If frm.DialogResult = DialogResult.OK Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Action = ApplyAction.RetryWithForceWrite&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Action = ApplyAction.Continue&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub 
&lt;/p&gt;
&lt;p&gt;
End Class 
&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;


&lt;img src="http://blogs.windowsclient.net/aggbug.aspx?PostID=17403" width="1" height="1"&gt;</description></item><item><title>Sync Services Part 1</title><link>http://blogs.windowsclient.net/ken_tucker/archive/2008/03/11/sync-services-part-1.aspx</link><pubDate>Tue, 11 Mar 2008 18:12:00 GMT</pubDate><guid isPermaLink="false">f1c07d22-4184-4df1-9c40-8dd04b52e796:17402</guid><dc:creator>ken tucker</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.windowsclient.net/ken_tucker/rsscomments.aspx?PostID=17402</wfw:commentRss><comments>http://blogs.windowsclient.net/ken_tucker/archive/2008/03/11/sync-services-part-1.aspx#comments</comments><description>&lt;p&gt;
In this post we will create a local cache of the Northwind database.&amp;nbsp; To start with lets create a new visual basic windows forms project in Visual Studio 2008.&amp;nbsp; From the project menu select add a new item and select a new local database cache and name it northwind. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blogs.windowsclient.net/image.axd?picture=WindowsLiveWriter/SyncServicesPart1_11DDC/image_2.png"&gt;&lt;img src="http://www.onteorasoftware.net/image.axd?picture=WindowsLiveWriter/SyncServicesPart1_11DDC/image_thumb.png" title="image" style="border:0px none;" alt="image" border="0" height="322" width="446" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
In the server connect select a connection to the northwind database. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Press the add button and select the product table.&amp;nbsp; Press OK to close the dialog.&amp;nbsp; Go ahead and create a table adapter for the product table.&amp;nbsp; The drag the products table on to the form from the data source window.&amp;nbsp; Add a button to the binding navigator and set its text to Sync and change the display style to Text. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
In the button you added to the toolbar add this code 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Sub&lt;/font&gt;&lt;font size="2"&gt; ToolStripButton1_Click(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;ByVal&lt;/font&gt;&lt;font size="2"&gt; sender &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;As&lt;/font&gt;&lt;font size="2"&gt; System.Object, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;ByVal&lt;/font&gt;&lt;font size="2"&gt; e &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;As&lt;/font&gt;&lt;font size="2"&gt; System.EventArgs) &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Handles&lt;/font&gt;&lt;font size="2"&gt; ToolStripButton1.Click&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;
&lt;font color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; Update the database&lt;/font&gt; 
&lt;/p&gt;
&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me&lt;/font&gt;&lt;font size="2"&gt;.ProductsBindingSource.EndEdit()&lt;/font&gt;&lt;font size="2"&gt; &lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Me&lt;/font&gt;&lt;font size="2"&gt;.TableAdapterManager.UpdateAll(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Me&lt;/font&gt;&lt;font size="2"&gt;.NorthwindDataSet) &lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;
&lt;font color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; Call SyncAgent.Synchronize() to initiate the synchronization process.&lt;/font&gt; 
&lt;/p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;
&lt;font color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39; Synchronization only updates the local database, not your project’s data source.&lt;/font&gt; 
&lt;/p&gt;
&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim&lt;/font&gt;&lt;font size="2"&gt; syncAgent &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;As&lt;/font&gt;&lt;font size="2"&gt; ProductsSyncAgent = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;New&lt;/font&gt;&lt;font size="2"&gt; ProductsSyncAgent()&lt;/font&gt;&lt;font size="2"&gt; &lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim&lt;/font&gt;&lt;font size="2"&gt; syncStats &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;As&lt;/font&gt;&lt;font size="2"&gt; Microsoft.Synchronization.Data.SyncStatistics = syncAgent.Synchronize() &lt;/font&gt;&lt;font size="2"&gt;
&lt;p&gt;
&lt;font color="#008000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;&amp;nbsp;Reload the data source from the local database&lt;/font&gt; 
&lt;/p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me&lt;/font&gt;&lt;font size="2"&gt;.ProductsTableAdapter.Fill(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Me&lt;/font&gt;&lt;font size="2"&gt;.NorthwindDataSet.Products)&lt;/font&gt;&lt;font size="2"&gt; 
&lt;p&gt;
&lt;font color="#0000ff" size="2"&gt;End&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;Sub&lt;/font&gt; 
&lt;/p&gt;
&lt;/font&gt;
&lt;p&gt;
Run the app and Open up the Sql Server Management Studio Express.&amp;nbsp; Make some changes in the Northwind database&amp;#39;s Product table and Press the sync button.&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Notice the changes you made to the Products table show up in the datagridview.&amp;nbsp; The changes are also saved in the local sqlce database. 
&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://blogs.windowsclient.net/aggbug.aspx?PostID=17402" width="1" height="1"&gt;</description></item><item><title>VB Power Packs Data Repeater Control</title><link>http://blogs.windowsclient.net/ken_tucker/archive/2008/02/21/vb-power-packs-data-repeater-control.aspx</link><pubDate>Thu, 21 Feb 2008 11:40:00 GMT</pubDate><guid isPermaLink="false">f1c07d22-4184-4df1-9c40-8dd04b52e796:15296</guid><dc:creator>ken tucker</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;In Feburary 2008 the VB Power packs team released version 3 of there &lt;a href="http://msdn2.microsoft.com/en-us/vbasic/bb735936.aspx" target="_blank"&gt;VB Power Packs 2005&lt;/a&gt;.&amp;nbsp; This version included a DataRepeater control. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The DataRepeater control allows you use standard windows controls to display your data in a scrollable container.&amp;nbsp;&amp;nbsp; The included documentation shows you how to bind the DataRepeater to a typed dataset.&amp;nbsp; This article will show you how to bind to a datatable in code.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; To start off with create a new windows forms application and drop a datarepeater on the form.&amp;nbsp; In the datarepeater drop a picturebox (pbCategory) and a label (lblName).&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.windowsclient.net/blogs/ken_tucker/WindowsLiveWriter/VBPowerPacksDataRepeaterControl_5DFA/image_2.png"&gt;&lt;img style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height="241" alt="image" src="http://blogs.windowsclient.net/blogs/ken_tucker/WindowsLiveWriter/VBPowerPacksDataRepeaterControl_5DFA/image_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;In the forms load event lets add some code to connect to the database.&amp;nbsp; I am binding the datarepeater to a bindingsource because it is a good practice.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Dim bs As New BindingSource &lt;/p&gt;
&lt;p&gt;Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim conn As New SqlConnection(&amp;quot;Server = .\SQLExpress;Database = NorthWind; Integrated Security = SSPI;&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim dt As New DataTable &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim da As New SqlDataAdapter(&amp;quot;Select * from Categories&amp;quot;, conn) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; da.Fill(dt) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bs.DataSource = dt &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataRepeater1.DataSource = bs &lt;br /&gt;End Sub&lt;/p&gt;
&lt;p&gt;The DataRepeater has a DrawItem event which allows us to put the data in the controls for each item.&amp;nbsp; You can also use this event for formatting the data for display&lt;/p&gt;
&lt;p&gt;Private Function GetBitmap(ByVal Pic() As Byte) As Bitmap &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ms As New System.IO.MemoryStream &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim bm As Bitmap &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ms.Write(Pic, 78, Pic.Length - 78) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bm = New Bitmap(ms) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return bm &lt;br /&gt;End Function &lt;/p&gt;
&lt;p&gt;Private Sub DataRepeater1_DrawItem(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs) Handles DataRepeater1.DrawItem &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim currItem As DataRowView = bs.Item(e.DataRepeaterItem.ItemIndex) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DirectCast(e.DataRepeaterItem.Controls(&amp;quot;pbCategory&amp;quot;), PictureBox).Image = GetBitmap(DirectCast(currItem.Item(&amp;quot;Picture&amp;quot;), Byte())) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DirectCast(e.DataRepeaterItem.Controls(&amp;quot;lblName&amp;quot;), Label).Text = currItem.Item(&amp;quot;CategoryName&amp;quot;).ToString &lt;br /&gt;End Sub&lt;/p&gt;&lt;img src="http://blogs.windowsclient.net/aggbug.aspx?PostID=15296" width="1" height="1"&gt;</description><category domain="http://blogs.windowsclient.net/ken_tucker/archive/tags/VB/default.aspx">VB</category><category domain="http://blogs.windowsclient.net/ken_tucker/archive/tags/Windows+Forms/default.aspx">Windows Forms</category><category domain="http://blogs.windowsclient.net/ken_tucker/archive/tags/PowerPacks/default.aspx">PowerPacks</category></item></channel></rss>