<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3064139338712255342</id><updated>2011-11-28T09:24:44.063+11:00</updated><category term='gdi+'/><category term='icomparer'/><category term='event handlers'/><category term='drawing'/><category term='icomparable'/><category term='visual basic'/><category term='arrays'/><category term='raising events'/><category term='programming'/><category term='schema'/><category term='graphics'/><category term='sorting'/><category term='parameters'/><category term='messagebox.show'/><category term='events'/><category term='custom events'/><category term='declaring events'/><category term='messageboxbuttons'/><category term='drag and drop'/><category term='vb'/><category term='.net development'/><category term='c#'/><category term='defining events'/><category term='ado.net'/><category term='windows forms'/><category term='comparison delegate'/><category term='data access'/><category term='default instances'/><category term='okcancel'/><category term='.net'/><category term='yesno'/><category term='collections'/><category term='factory'/><category term='vb.net'/><category term='sort'/><category term='database'/><title type='text'>John McIlhinney's .NET Developer Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-4611975063648218835</id><published>2010-08-11T21:10:00.008+10:00</published><updated>2010-08-14T20:22:19.519+10:00</updated><title type='text'>Keyboard Events in Windows Forms</title><content type='html'>When the user presses a key on the keyboard, active WinForms controls raise multiple events.  In the order they are raised, those events are &lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;KeyPress &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt;.  Following is an explanation of when and how to use each one.&lt;br /&gt;&lt;br /&gt;The first event raised by a control is the &lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt; event.  As with all events raised by the Framework, the data for the event is provided by the &lt;span style="font-style: italic;"&gt;e&lt;/span&gt; parameter; in this case, a &lt;span style="font-style: italic;"&gt;PreviewKeyDownEventsArgs&lt;/span&gt; object.  The purpose of this event is basically the &lt;span style="font-style: italic;"&gt;IsInputKey&lt;/span&gt; property of that object.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt; event was added to the .NET Framework in version 2.0.  Prior to that, the only way to specify whether a key is a regular input key or not was to derive your own custom control and override the &lt;span style="font-style: italic;"&gt;IsInputKey&lt;/span&gt; method.  With the addition of the &lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt; event, we can now handle it for a standard control and specify whether or not the key that was depressed is a regular input key.  This way we can more easily provide one-off custom behaviour.  For more information on treating a key as a regular input key, consult the MSDN documentation for the &lt;span style="font-style: italic;"&gt;Control.IsInputKey&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;There are some similarities between the &lt;span style="font-style: italic;"&gt;PreviewKeyDownEventArgs&lt;/span&gt; received by the &lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt; event handler and the &lt;span style="font-style: italic;"&gt;KeyEventArgs&lt;/span&gt; received by the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt; event handlers, so it’s worth covering them altogether now.  The way in which you determine the key, or key combination, that was depressed (&lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt;) or released (&lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt;) is the same for all three events.&lt;br /&gt;&lt;br /&gt;The first common property of note is &lt;span style="font-style: italic;"&gt;KeyCode&lt;/span&gt;.  It returns a value from the &lt;span style="font-style: italic;"&gt;Keys&lt;/span&gt; enumeration that corresponds to the key that was just depressed or released.  The &lt;span style="font-style: italic;"&gt;KeyValue&lt;/span&gt; property is similar, but it returns an &lt;span style="font-style: italic;"&gt;Int32&lt;/span&gt; containing the numeric value of the key.  The &lt;span style="font-style: italic;"&gt;Alt&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Control&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Shift&lt;/span&gt; properties are all &lt;span style="font-style: italic;"&gt;Booleans&lt;/span&gt; and indicate whether the corresponding modifier key was down when the key contained in &lt;span style="font-style: italic;"&gt;KeyCode&lt;/span&gt; was depressed or released.  The &lt;span style="font-style: italic;"&gt;Modifiers&lt;/span&gt; property provides the state of all three modifiers together in a bitwise combination of &lt;span style="font-style: italic;"&gt;Keys.Alt&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Keys.Control&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Keys.Shift&lt;/span&gt; values, depending on which modifiers are down.  The &lt;span style="font-style: italic;"&gt;KeyData&lt;/span&gt; property is a bitwise combination of &lt;span style="font-style: italic;"&gt;KeyCode&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Modifiers&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The next event to be raised is the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event.  Note that, if the key pressed is a special key and the &lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt; event handler does not set &lt;span style="font-style: italic;"&gt;e.IsInputKey&lt;/span&gt; to &lt;span style="font-style: italic;"&gt;True&lt;/span&gt;, the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event and all subsequent events will never be raised.  When a control does raise the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event, by default, neither its parent control nor any other ancestor controls will raise a &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event.  The same is true of the &lt;span style="font-style: italic;"&gt;KeyPress&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt; events.  You can override this default behaviour by setting the &lt;span style="font-style: italic;"&gt;KeyPreview&lt;/span&gt; property of the form containing the control to &lt;span style="font-style: italic;"&gt;True&lt;/span&gt;.  The form will now raise the corresponding event before the control does.  In this case, we can set &lt;span style="font-style: italic;"&gt;e.Handled&lt;/span&gt; to &lt;span style="font-style: italic;"&gt;True&lt;/span&gt; in the form’s event handler to prevent the control from also raising the same event.&lt;br /&gt;&lt;br /&gt;The purpose of the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event is to trap specific keys, or key combinations, as they are depressed.  As mentioned earlier, the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event receives a &lt;span style="font-style: italic;"&gt;KeyEventArgs&lt;/span&gt; object as an argument, which has &lt;span style="font-style: italic;"&gt;KeyCode&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;KeyValue&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Alt&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Control&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Shift&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Modifiers&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;KeyData&lt;/span&gt; properties with which to determine which key or keys were depressed.  By way of example, here are multiple ways that you could detect the &lt;span style="font-style: italic;"&gt;Ctrl+W&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Ctrl+Shift+W&lt;/span&gt; key combinations:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Determine whether the W key was just depressed.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.KeyCode == &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.W)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Determine whether the desired modifier keys were down at the time.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.Control &amp;amp;&amp;amp; !e.Alt)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.Shift)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl+Shift+W&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl+W&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Determine whether the W key was just depressed.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.KeyCode == &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.W)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Determine whether the desired modifier keys were down at the time.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;switch&lt;/span&gt; (e.Modifiers)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control:&lt;br /&gt;            &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl+W&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control | &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift:&lt;br /&gt;            &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl+Shift+W&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Determine whether the W key was just depressed while the desired modifier keys were down.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;switch&lt;/span&gt; (e.KeyData)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control | &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.W:&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl+W&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control | &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift | &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.W:&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl+Shift+W&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Determine whether the W key was just depressed.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;If&lt;/span&gt; e.KeyCode = &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.W &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Determine whether the desired modifier keys were down at the time.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Control &lt;span style="color: blue;"&gt;AndAlso&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; e.Alt &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Shift &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;            &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl+Shift+W&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;br /&gt;            &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl+W&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Determine whether the W key was just depressed.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;If&lt;/span&gt; e.KeyCode = &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.W &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Determine whether the desired modifier keys were down at the time.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; e.Modifiers&lt;br /&gt;        &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control&lt;br /&gt;            &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl+W&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control &lt;span style="color: blue;"&gt;Or&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift&lt;br /&gt;            &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl+Shift+W&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Select&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Determine whether the W key was just depressed while the desired modifier keys were down.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; e.KeyData&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control &lt;span style="color: blue;"&gt;Or&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.W&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl+W&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control &lt;span style="color: blue;"&gt;Or&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift &lt;span style="color: blue;"&gt;Or&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.W&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl+Shift+W&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Select&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hopefully this demonstrates that, generally speaking, when you’re interested in specific key combinations, using the &lt;span style="font-style: italic;"&gt;KeyData&lt;/span&gt; property produces the most succinct code.&lt;br /&gt;&lt;br /&gt;Another important note is how to detect the &lt;span style="font-style: italic;"&gt;Ctrl&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Shift&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Alt&lt;/span&gt; keys.  The keys are treated differently when you want to detect that the key itself was just depressed compared to when you want to detect that the key was already down when another key was depressed.  The following code detects when each of the &lt;span style="font-style: italic;"&gt;Ctrl&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Shift&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Alt&lt;/span&gt; keys themselves are depressed:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;switch&lt;/span&gt; (e.KeyCode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.LControlKey:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// The left Ctrl key was just depressed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.RControlKey:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// The right Ctrl key was just depressed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.LShiftKey:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// The left Shift key was just depressed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.RShiftKey:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// The right Shift key was just depressed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.LMenu:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// The left Alt key was just depressed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.RMenu:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// The right Alt key was just depressed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;switch&lt;/span&gt; (e.KeyCode)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.ControlKey:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Either Ctrl key was just depressed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.ShiftKey:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Either Shift key was just depressed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Menu:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Either Alt key was just depressed.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; e.KeyCode&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.LControlKey&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'The left Ctrl key was just depressed.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.RControlKey&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'The right Ctrl key was just depressed.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.LShiftKey&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'The left Shift key was just depressed.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.RShiftKey&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'The right Shift key was just depressed.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.LMenu&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'The left Alt key was just depressed.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.RMenu&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'The right Alt key was just depressed.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Select&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; e.KeyCode&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.ControlKey&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Either Ctrl key was just depressed.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.ShiftKey&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Either Shift key was just depressed.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Menu&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Either Alt key was just depressed.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Select&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note that you can detect either that specifically the left or right key of the two was depressed, or just that either of them was.  Contrast the code above with that below, which detects whether the &lt;span style="font-style: italic;"&gt;Ctrl&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Shift&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;Alt&lt;/span&gt; keys were already down when some other key was depressed:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;switch&lt;/span&gt; (e.Modifiers)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Shift&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Alt:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Alt&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control | &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl+Shift&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control | &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Alt:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl+Alt&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift | &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Alt:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Shift+Alt&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control | &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift | &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Alt:&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;// Ctrl+Shift+Alt&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; e.Modifiers&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Shift&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Alt&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Alt&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control &lt;span style="color: blue;"&gt;Or&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl+Shift&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control &lt;span style="color: blue;"&gt;Or&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Alt&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl+Alt&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift &lt;span style="color: blue;"&gt;Or&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Alt&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Shift+Alt&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;Case&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Control &lt;span style="color: blue;"&gt;Or&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift &lt;span style="color: blue;"&gt;Or&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Alt&lt;br /&gt;        &lt;span style="font-family: Arial; font-size: 12px; font-style: italic; color: green;"&gt;'Ctrl+Shift+Alt&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Select&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note the difference between the &lt;span style="font-style: italic;"&gt;Keys&lt;/span&gt; values used to detect the keys themselves, i.e. &lt;span style="font-style: italic;"&gt;ControlKey&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;ShiftKey&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Menu,&lt;/span&gt; and the corresponding modifier keys, i.e. &lt;span style="font-style: italic;"&gt;Control&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Shift&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Alt&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Now that we’ve seen the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event, let’s revisit the &lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt; event for a moment with an example that involves both.  As mentioned earlier, when a special key is detected, no &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event is raised.  The example provided in the MSDN documentation for the &lt;span style="font-style: italic;"&gt;Control.IsInputKey&lt;/span&gt; method shows how create a custom &lt;span style="font-style: italic;"&gt;TextBox&lt;/span&gt; control that overrides the &lt;span style="font-style: italic;"&gt;IsInputKey&lt;/span&gt; method and treats the &lt;span style="font-style: italic;"&gt;Tab&lt;/span&gt; key as a regular input key.  This allows the &lt;span style="font-style: italic;"&gt;Tab&lt;/span&gt; key to raise a &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event, upon which the control replaces the selected text with four spaces.  Following is that example reworked using the &lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; events of a standard &lt;span style="font-style: italic;"&gt;TextBox&lt;/span&gt;, rather than the &lt;span style="font-style: italic;"&gt;IsInputKey&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;OnKeyDown&lt;/span&gt; methods of a custom control.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; textBox1_PreviewKeyDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: rgb(43, 145, 175);"&gt;PreviewKeyDownEventArgs&lt;/span&gt; e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.KeyData == &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Tab)&lt;br /&gt;    {&lt;br /&gt;        e.IsInputKey = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; textBox1_KeyDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: rgb(43, 145, 175);"&gt;KeyEventArgs&lt;/span&gt; e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.KeyData == &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Tab)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue;"&gt;this&lt;/span&gt;.textBox1.SelectedText = &lt;span style="color: rgb(163, 21, 21);"&gt;"    "&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; TextBox1_PreviewKeyDown(&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;br /&gt;                                    &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;PreviewKeyDownEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; TextBox1.PreviewKeyDown&lt;br /&gt;    &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.KeyData = &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Tab &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;        e.IsInputKey = &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; TextBox1_KeyDown(&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;br /&gt;                             &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;KeyEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; TextBox1.KeyDown&lt;br /&gt;    &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.KeyData = &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Tab &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.TextBox1.SelectedText = &lt;span style="color: rgb(163, 21, 21);"&gt;"    "&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Normally, the &lt;span style="font-style: italic;"&gt;Tab&lt;/span&gt; key would be consumed by the system, causing focus to shift to the next control and no &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event to be raised.  The code above detects the &lt;span style="font-style: italic;"&gt;Tab&lt;/span&gt; key when it is depressed in the absence of modifier keys and specifies that it should be treated as a regular input key.  As a result, focus does not shift and the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event is raised, when four spaces are entered into the &lt;span style="font-style: italic;"&gt;TextBox&lt;/span&gt; in place of the currently selected text.&lt;br /&gt;&lt;br /&gt;The other property of interest provided by the &lt;span style="font-style: italic;"&gt;KeyEventArgs&lt;/span&gt; class is &lt;span style="font-style: italic;"&gt;SupressKeyPress&lt;/span&gt;, which prevents keyboard input being passed on to the control.  The following example uses the &lt;span style="font-style: italic;"&gt;SuppressKeyPress&lt;/span&gt; property to ignore all upper case input.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; textBox1_KeyDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: rgb(43, 145, 175);"&gt;KeyEventArgs&lt;/span&gt; e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.Modifiers == &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift)&lt;br /&gt;    {&lt;br /&gt;        e.SuppressKeyPress = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; TextBox1_KeyDown(&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;br /&gt;                             &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;KeyEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; TextBox1.KeyDown&lt;br /&gt;    &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Modifiers = &lt;span style="color: rgb(43, 145, 175);"&gt;Keys&lt;/span&gt;.Shift &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;        e.SuppressKeyPress = &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That brings us to the &lt;span style="font-style: italic;"&gt;KeyPress&lt;/span&gt; event, which is raised after &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; and before &lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt; if and only if the key or key combination depressed should result in input being entered into the control.  Unlike the other events mentioned here, which are about actual keys on the keyboard, &lt;span style="font-style: italic;"&gt;KeyPress&lt;/span&gt; is about the text that those keys produce.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-style: italic;"&gt;KeyPress&lt;/span&gt; event handler receives a &lt;span style="font-style: italic;"&gt;KeyPressEventArgs&lt;/span&gt; object.  This object has a &lt;span style="font-style: italic;"&gt;Handled&lt;/span&gt; property that behaves just like the &lt;span style="font-style: italic;"&gt;KeyEventArgs.Handled&lt;/span&gt; property in the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt; event handlers.  The only other property is &lt;span style="font-style: italic;"&gt;KeyChar&lt;/span&gt;, which contains the &lt;span style="font-style: italic;"&gt;Char&lt;/span&gt; that is actually entered into the control.  Following is an example using the &lt;span style="font-style: italic;"&gt;KeyPress&lt;/span&gt; event to ignore upper case input, as the previous example does using &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; textBox1_KeyPress(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: rgb(43, 145, 175);"&gt;KeyPressEventArgs&lt;/span&gt; e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;char&lt;/span&gt;.IsUpper(e.KeyChar))&lt;br /&gt;    {&lt;br /&gt;        e.Handled = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; TextBox1_KeyPress(&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;br /&gt;                              &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;KeyPressEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; TextBox1.KeyPress&lt;br /&gt;    &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Char&lt;/span&gt;.IsUpper(e.KeyChar) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;        e.Handled = &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It’s worth noting that the &lt;span style="font-style: italic;"&gt;KeyChar&lt;/span&gt; property was read-only in early versions of .NET but, from .NET 2.0, was made read/write.  This means that you can change the input character in the &lt;span style="font-style: italic;"&gt;KeyPress&lt;/span&gt; event handler if desired.  The following example converts all upper case input to lower case.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; textBox1_KeyPress(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: rgb(43, 145, 175);"&gt;KeyPressEventArgs&lt;/span&gt; e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;char&lt;/span&gt;.IsUpper(e.KeyChar))&lt;br /&gt;    {&lt;br /&gt;        e.KeyChar = &lt;span style="color: blue;"&gt;char&lt;/span&gt;.ToLower(e.KeyChar);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; TextBox1_KeyPress(&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;br /&gt;                              &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;KeyPressEventArgs&lt;/span&gt;) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; TextBox1.KeyPress&lt;br /&gt;    &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Char&lt;/span&gt;.IsUpper(e.KeyChar) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;        e.KeyChar = &lt;span style="color: blue;"&gt;Char&lt;/span&gt;.ToLower(e.KeyChar)&lt;br /&gt;    &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The last event in the sequence is &lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt;, which is raised when a key is released.  The &lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt; event handler also receives a &lt;span style="font-style: italic;"&gt;KeyEventArgs&lt;/span&gt; object and, besides the fact that &lt;span style="font-style: italic;"&gt;SuppressKeyPress&lt;/span&gt; isn't really of use, all properties behave as they do for &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt;.  Generally speaking, the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;KeyPress&lt;/span&gt; events get used more than &lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt;, but there are times when you want to perform an action when a key is released rather than when it’s depressed.&lt;br /&gt;&lt;br /&gt;Finally, it’s worth noting how these events behave when a key is held down.  When a key is first depressed, the &lt;span style="font-style: italic;"&gt;PreviewKeyDown&lt;/span&gt; event is raised first, followed by the &lt;span style="font-style: italic;"&gt;KeyDown&lt;/span&gt; event and then, if applicable, the &lt;span style="font-style: italic;"&gt;KeyPress&lt;/span&gt; event.  If the key is held down then this sequence will be repeated over and over.  When the key is released, a single &lt;span style="font-style: italic;"&gt;KeyUp&lt;/span&gt; event is raised.&lt;br /&gt;&lt;br /&gt;Hopefully this information makes it clear how, when and why to make use the four events associated with .NET keyboard input.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3064139338712255342-4611975063648218835?l=jmcilhinney.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/4611975063648218835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3064139338712255342&amp;postID=4611975063648218835' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/4611975063648218835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/4611975063648218835'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/2010/08/keyboard-events-in-windows-forms.html' title='Keyboard Events in Windows Forms'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-1928887235274441877</id><published>2009-12-19T16:05:00.005+11:00</published><updated>2010-09-12T13:07:40.560+10:00</updated><title type='text'>Referencing Assemblies and Importing Namespaces</title><content type='html'>I often see people confused about the difference between referencing an assembly and importing a namespace, and why we need to do either.  I’ll try to address that confusion here.&lt;br /&gt;&lt;br /&gt;First, what is an assembly?  An assembly is a .NET executable file, i.e. EXE or DLL.  Whenever you build a .NET project, you are compiling your source files into an assembly.&lt;br /&gt;&lt;br /&gt;Think of an assembly as a physical collection of .NET types.  A type is a class, structure, enumeration, delegate, etc.  An assembly is a physical file that contains the definitions of one or more types.  You can move that assembly around and thereby move those types around.  I can create an assembly here and then pass you the file and you can then use the types it contains.&lt;br /&gt;&lt;br /&gt;Now, by default, each project pretty much only knows about the types for which it contains the definitions.  Such a project would be useless though.  There are certain parts of the .NET Framework that are pretty much essential to all projects.  The assemblies containing these essential types, e.g. &lt;span style="font-style: italic;"&gt;String&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Int32&lt;/span&gt;, are referenced by default in every project.&lt;br /&gt;&lt;br /&gt;To see this, create a new project in Visual Studio.  Under your preferred language in the New Project dialogue, choose Windows and then select the Empty Project template.  Once the project is created, open the Object Browser window and select My Solution in the Browse field at the top.  Each root node in the tree is an assembly that your project knows about.  You’ll see your project itself and mscorlib at least.  If you’re targeting .NET 3.5 or later you will also see System.Core and if you’re language is VB then you will also see System and Microsoft.VisualBasic.  These are the assemblies that your project references by default.  Basically, there’s a line written in a file in your project that says “mscorlib.dll exists and this is where to find it”.&lt;br /&gt;&lt;br /&gt;At this point, your project knows about ALL those assemblies and ONLY those assemblies, so it knows about ALL the types declared in those assemblies and ONLY the types declared in those assemblies.  Any type that isn’t declared in one of those assemblies is unknown to your project and therefore unusable.  Let’s say, for instance, that you wanted to connect to a SQL Server database.  For that you would need to use the &lt;span style="font-style: italic;"&gt;SqlConnection&lt;/span&gt; class.  That class is not declared in any of the assemblies your project references by default so your project doesn’t know that the class exists.  The &lt;span style="font-style: italic;"&gt;SqlConnection&lt;/span&gt; class is declared in the System.Data.dll assembly, so we must reference this assembly in our project in order to use the &lt;span style="font-style: italic;"&gt;SqlConnection&lt;/span&gt; class.  Let’s now look at how to do that and how the process differs between VB and C# projects.&lt;br /&gt;&lt;br /&gt;In C#, references are displayed in the Solution Explorer by default.  Open the Solution Explorer and expand the node for your C# project.  Try to expand the References node and notice that you can’t, which is because it contains no references.  The default references of mscorlib.dll and System.Core.dll are considered so fundamental that they are not listed with other references, so that you cannot remove them.  Right-click the References node and select Add Reference to open the Add Reference dialogue.  Alternatively, select Project -&gt; Add Reference from the main menu.&lt;br /&gt;&lt;br /&gt;In VB, references are not displayed in the Solution Explorer by default.  You must first click the Show All Files button in the Solution Explorer to reveal the References node, at which point you can right-click it as mentioned above.  VB also supports adding a reference from the Project menu, as well as a third option that is not available to C# developers.  You can first open the project properties, by double-clicking the My Project node in the Solution Explorer or any of a variety of other ways, and then select the References page.  The top half of the page lists the assemblies referenced by the project.  Click the Add button under the list to open the Add Reference dialogue.&lt;br /&gt;&lt;br /&gt;Once you have opened the Add Reference dialogue, you have several options.  The dialogue layout changed considerably between VS 2008 and 2010 but the options available are basically the same.  The most common option will be to reference an assembly installed in the Global Assembly Cache (GAC).  This includes any assemblies from the .NET Framework itself and any other .NET components that you have installed.  The GAC is a location for common assemblies, so that there is only one copy for all projects that use them.  You also have the option to browse for an assembly.  You would do this for libraries that you have previously created in other projects as well as .NET components that you have downloaded but have no installation routine.  Such assemblies will be copied into the output folder of each project that references them.  A third option is to reference other projects in the same solution.  Only projects that output a library, i.e. DLL, can be referenced.  Referencing a project is like referencing the assembly that it outputs except that it allows you to update the assembly without having to recreate the reference.&lt;br /&gt;&lt;br /&gt;That’s all there is to referencing assemblies: open the Add Reference dialogue and navigate to the desired assembly.  That’s all that’s required to use a type declared in an external assembly.  If you ever need to use a type from the .NET Framework but you don’t know where it’s declared, simply open the MSDN documentation for that type.  At the very top of every type’s overview topic is the assembly that it’s declared in.  Reference that assembly and you’re good to go.&lt;br /&gt;&lt;br /&gt;Immediately under the assembly is the namespace that the type is a member of.  You never actually need to import a namespace to use a type.  Importing namespaces is simply a convenience that makes code easier to write and read.  Let’s now look at what a namespace is, as well as how and why you might import one.&lt;br /&gt;&lt;br /&gt;Unlike an assembly, which is a physical collection of types, a namespace is a logical collection of types.  That means that, while every type is a member of a namespace, a namespace has no physical boundary.  You can point to a DLL file and say “there’s the SomeAssembly.dll assembly” but you can never point to a namespace because it doesn’t physically exist.&lt;br /&gt;&lt;br /&gt;The reason a namespace is called a namespace is because it is a logical space within which every type name is unique.  For instance, there are several classes named &lt;span style="font-style: italic;"&gt;TextBox&lt;/span&gt; in the .NET Framework alone, not to mention all those that developers around the world have created.  When you refer to the &lt;span style="font-style: italic;"&gt;TextBox&lt;/span&gt; type in code, how do you know which one you’re referring to?  You know because each type is qualified by its namespace.  For instance, there is the &lt;span style="font-style: italic;"&gt;System.Windows.Forms.TextBox&lt;/span&gt; class and there is the &lt;span style="font-style: italic;"&gt;System.Web.UI.WebControls.TextBox&lt;/span&gt; class, plus others besides.  It’s similar to there being two people named John at your work place but you know which one someone is talking about because they qualify the name, e.g. John Smith and John Williams or Big John and Little John.&lt;br /&gt;&lt;br /&gt;Now, it’s not strictly true that every type in the same namespace must be unique.  There’s nothing to stop me declaring the &lt;span style="font-style: italic;"&gt;MyControl&lt;/span&gt; class as a member of the &lt;span style="font-style: italic;"&gt;MyControls&lt;/span&gt; namespace and someone else doing the same on the other side of the world.  In fact, there’s nothing to stop me doing it in two different projects on the same machine, or even in the same solution.  What is true is that you can never have two types with the same name in the same namespace in the same project.  That will cause a compilation error.&lt;br /&gt;&lt;br /&gt;We don’t actually have to import any namespace to use its member types.  You can happily use the fully qualified name of every type in your code, e.g.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; str = ((System.Windows.Forms.&lt;span style="color: rgb(43, 145, 175);"&gt;TextBox&lt;/span&gt;) sender).Text;&lt;br /&gt;&lt;/pre&gt;VB&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; str &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;DirectCast&lt;/span&gt;(sender, System.Windows.Forms.&lt;span style="color: rgb(43, 145, 175);"&gt;TextBox&lt;/span&gt;).Text&lt;br /&gt;&lt;/pre&gt;If you do that though, your code will tend to look rather cluttered and will be less comfortable to read.  Generally speaking, you should import the namespaces containing the types you use and use the unqualified type names in your code.  So, if you import the &lt;span style="font-style: italic;"&gt;System.Windows.Forms&lt;/span&gt; namespace, the code above can be replaced with the following:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; str = ((&lt;span style="color: rgb(43, 145, 175);"&gt;TextBox&lt;/span&gt;) sender).Text;&lt;br /&gt;&lt;/pre&gt; VB&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; str &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;DirectCast&lt;/span&gt;(sender, &lt;span style="color: rgb(43, 145, 175);"&gt;TextBox&lt;/span&gt;).Text&lt;br /&gt;&lt;/pre&gt; Note that, even though the &lt;span style="font-style: italic;"&gt;String&lt;/span&gt; class is a member of the &lt;span style="font-style: italic;"&gt;System&lt;/span&gt; namespace, there’s never a need to use &lt;span style="font-style: italic;"&gt;System.String&lt;/span&gt;, even if you haven’t imported the &lt;span style="font-style: italic;"&gt;System&lt;/span&gt; namespace.  That’s because &lt;span style="font-style: italic;"&gt;string&lt;/span&gt; (C#) and &lt;span style="font-style: italic;"&gt;String&lt;/span&gt; (VB) are native data types that you can use to alias the .NET &lt;span style="font-style: italic;"&gt;System.String&lt;/span&gt; class.  The same goes for the &lt;span style="font-style: italic;"&gt;int&lt;/span&gt; (C#) and &lt;span style="font-style: italic;"&gt;Integer&lt;/span&gt; (VB) data types and the &lt;span style="font-style: italic;"&gt;System.Int32&lt;/span&gt; structure, amongst others.&lt;br /&gt;&lt;br /&gt;Getting back to namespaces, how exactly do we import one?  There is only one way in C# and that is with the &lt;span style="font-style: italic;"&gt;using&lt;/span&gt; directive.  At the top of a code file you specify a namespace preceded by the &lt;span style="font-style: italic;"&gt;using&lt;/span&gt; keyword.  For instance, to be able to use the WinForms &lt;span style="font-style: italic;"&gt;TextBox&lt;/span&gt; class unqualified, as was done above, we must import the &lt;span style="font-style: italic;"&gt;System.Windows.Forms&lt;/span&gt; namespace:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;/pre&gt;When you create a new code file in C#, you’ll normally find a few using directives added by default.  Which ones they are depends on the item template used to create the file.  When you create a form in a WinForms project, the &lt;span style="font-style: italic;"&gt;System.Windows.Forms&lt;/span&gt; namespace is one of those imported by default, because its use is expected to be very common.  Note that a &lt;span style="font-style: italic;"&gt;using&lt;/span&gt; directive applies only to the file it appears in.&lt;br /&gt;&lt;br /&gt;Importing a namespace in VB can be similar, except that you use the &lt;span style="font-style: italic;"&gt;Imports&lt;/span&gt; keyword.  The equivalent of the C# &lt;span style="font-style: italic;"&gt;using&lt;/span&gt; directive above would be:&lt;br /&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.Windows.Forms&lt;br /&gt;&lt;/pre&gt;When you create a code file in VB, notice that there are no &lt;span style="font-style: italic;"&gt;Imports&lt;/span&gt; statements added by default, yet you are still able to refer to many types unqualified.  This is because VB provides a second option for importing namespaces and it’s that method that’s used by default.  Going back to the References page of the project properties, notice that the bottom half of the page contains a list of namespaces.  That list contains all the namespaces that have members declared in your project and the assemblies referenced by your project.  You simply have to check the box next to a namespace to import it, and some are already checked by default.&lt;br /&gt;&lt;br /&gt;Importing a namespace on the References page differs from using the &lt;span style="font-style: italic;"&gt;Imports&lt;/span&gt; keyword because it is project-wide.  Just like the &lt;span style="font-style: italic;"&gt;using&lt;/span&gt; directive in C#, the VB &lt;span style="font-style: italic;"&gt;Imports&lt;/span&gt; keyword affects only the code file it appears in, while the References page imports namespaces for every code file in a project.&lt;br /&gt;&lt;br /&gt;So, what are my recommendations for importing namespaces?  I used the following rules when I was writing all my code myself:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If a type appears only once in code, use the fully-qualified name.&lt;/li&gt;&lt;li&gt;In VB, import a namespace project-wide by default.&lt;/li&gt;&lt;li&gt;In VB, choose file-level imports over project-wide imports if you want  to refer to two like-named types from different namespaces in two  different code files.&lt;/li&gt;&lt;li&gt;In the case of a name clash, i.e. using two like-named types in the same code file, use the fully qualified name of both types.&lt;/li&gt;&lt;/ol&gt;Now that I use ReSharper, those rules have changed a little bit because, when an unqualified name is typed, ReSharper will offer to create a file-level import of the appropriate namespace in both C# and VB.  Other code-generation tools may be similar.&lt;br /&gt;&lt;br /&gt;Another notable difference between VB and C# is support for partial qualifying namespaces.  For instance, let’s say that you have imported the &lt;span style="font-style: italic;"&gt;System&lt;/span&gt; namespace.  In C#, if you want to refer to a type in a child namespace, you must still use the fully-qualified name, e.g.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; field = &lt;span style="color: blue;"&gt;new&lt;/span&gt; System.Windows.Forms.&lt;span style="color: rgb(43, 145, 175);"&gt;TextBox&lt;/span&gt;();&lt;br /&gt;&lt;/pre&gt;In VB, on the other hand, you can use a partially-qualified name, omitting the imported &lt;span style="font-style: italic;"&gt;System&lt;/span&gt; namespace:&lt;br /&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; field &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; Windows.Forms.&lt;span style="color: rgb(43, 145, 175);"&gt;TextBox&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;So, in summary, you must reference an assembly, i.e. a DLL, if you want to use any type declared within it.  Importing a namespace is never necessary and simply allows you to use types that are members of that namespace without qualifying the name.  If you ever want to use a type but you don’t know what assembly it’s declared in or what namespace it’s a member of, simply consult the MSDN documentation for that type.  It will display both that the very top of the page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3064139338712255342-1928887235274441877?l=jmcilhinney.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/1928887235274441877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3064139338712255342&amp;postID=1928887235274441877' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/1928887235274441877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/1928887235274441877'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/2009/12/referencing-assemblies-and-importing.html' title='Referencing Assemblies and Importing Namespaces'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-6766813769165355715</id><published>2009-11-01T18:41:00.009+11:00</published><updated>2009-12-26T15:41:53.180+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb.net'/><category scheme='http://www.blogger.com/atom/ns#' term='declaring events'/><category scheme='http://www.blogger.com/atom/ns#' term='custom events'/><category scheme='http://www.blogger.com/atom/ns#' term='.net development'/><category scheme='http://www.blogger.com/atom/ns#' term='event handlers'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><category scheme='http://www.blogger.com/atom/ns#' term='raising events'/><category scheme='http://www.blogger.com/atom/ns#' term='defining events'/><title type='text'>Defining and Raising Custom Events</title><content type='html'>We’ve all handled events before, e.g. the &lt;span style="font-style:italic;"&gt;Load&lt;/span&gt; of a &lt;span style="font-style:italic;"&gt;Form&lt;/span&gt;, the &lt;span style="font-style:italic;"&gt;Click&lt;/span&gt; of a &lt;span style="font-style:italic;"&gt;Button&lt;/span&gt; or the &lt;span style="font-style:italic;"&gt;TextChanged&lt;/span&gt; of a &lt;span style="font-style:italic;"&gt;TextBox&lt;/span&gt;.  Many, even relatively experienced, developers aren’t too sure on how to raise events from their own classes though.&lt;br /&gt;&lt;br /&gt;The .NET Framework provides a fairly simple mechanism for events but, more than that, a convention is used throughout the Framework for employing that mechanism.  While you don’t have to, it’s a good idea to stick to that convention in your own code.  Doing so means that your interface will be consistent with the rest of the Framework, and consistency is a good thing.  Using your types will feel familiar to yourself and others because they will behave just like the types you’re used to using from the Framework.&lt;br /&gt;&lt;br /&gt;First up, let’s define exactly what an event is.  In conceptual terms, an event is a notification that something has happened.  Just like your microwave oven makes a “beep” or “ding” sound to notify you that it has finished cooking your food, so a .NET object raises an event to notify any other objects that are listening that it has done something or something has been done to it.&lt;br /&gt;&lt;br /&gt;Technically, an event is a member of a type, just like properties and methods, except its type is a delegate rather than a class or structure.  A delegate, or at least an instance of a delegate, is an object that contains a reference to a method.  In the case of an event, the method the delegate refers to is the event handler.  As an example, the &lt;span style="font-style:italic;"&gt;Button&lt;/span&gt; class has a &lt;span style="font-style:italic;"&gt;Click&lt;/span&gt; event defined as type &lt;span style="font-style:italic;"&gt;EventHandler&lt;/span&gt;.  The &lt;span style="font-style:italic;"&gt;EventHandler&lt;/span&gt; delegate is defined like so:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;delegate&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Delegate&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; EventHandler(&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; EventArgs)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;That method signature should look familiar because it looks a lot like the signature of an event handler method, e.g.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// ...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; Button1_Click(&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; EventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; Button1.Click&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;When you create a handler for the &lt;span style="font-style:italic;"&gt;Click&lt;/span&gt; event of a &lt;span style="font-style:italic;"&gt;Button&lt;/span&gt; in your form, what you’re actually doing is creating an instance of the &lt;span style="font-style:italic;"&gt;EventHandler&lt;/span&gt; delegate, providing it a reference to your method and then assigning it to the &lt;span style="font-style:italic;"&gt;Click&lt;/span&gt; member of the &lt;span style="font-style:italic;"&gt;Button&lt;/span&gt;.  When the &lt;span style="font-style:italic;"&gt;Button&lt;/span&gt; is clicked, it goes to its &lt;span style="font-style:italic;"&gt;Click&lt;/span&gt; event and invokes the delegate it finds there, which in turn invokes your method.&lt;br /&gt;&lt;br /&gt;This post isn’t about delegates though, so if you want more information on their inner workings you should look for that elsewhere.  This post is about defining and raising custom events, so let’s get on with that.  The first thing we need is a class that will raise an event.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _firstName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _lastName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FirstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; LastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; Person&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; _firstName &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; _lastName &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; FirstName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; LastName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;So, we have a class with two properties, which we can get and set.  It might be convenient for us to receive a notification from an instance of this class when those property values change.  For instance, if you are displaying the person’s name in some &lt;span style="font-style:italic;"&gt;TextBoxes&lt;/span&gt; and the name gets changed in code, you’d want to know about it so that you could update the &lt;span style="font-style:italic;"&gt;TextBoxes&lt;/span&gt;, right?  For that we need an event to be raised when the property value changes.&lt;br /&gt;&lt;br /&gt;The first thing to do is to declare the events as members in the &lt;span style="font-style:italic;"&gt;Person&lt;/span&gt; class.  Considering that these events are notifications of the &lt;span style="font-style:italic;"&gt;FirstName&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;LastName&lt;/span&gt; property values being changed, it’s most appropriate that they be named “FirstNameChanged” and “LastNameChanged”, which is convention throughout the Framework.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt; FirstNameChanged;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt; LastNameChanged;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; FirstNameChanged &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventHandler&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; LastNameChanged &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventHandler&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Once the events are declared, you’ll find that the &lt;span style="font-style:italic;"&gt;Person&lt;/span&gt; class now has events you can handle.  That doesn’t do us any good if the events are never raised though, so let’s add some basic code to raise those events when the corresponding property values change.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FirstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstNameChanged != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstNameChanged(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; LastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastNameChanged != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastNameChanged(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; FirstName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; FirstNameChanged(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; LastName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; LastNameChanged(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Note that, when the event is raised, the object passes itself as the first argument.  The first argument is passed to the &lt;span style="font-style:italic;"&gt;sender&lt;/span&gt; parameter, so the object is identifying itself as the sender, i.e. the object that raised the event.&lt;br /&gt;&lt;br /&gt;The second argument is &lt;span style="font-style:italic;"&gt;EventArgs.Empty&lt;/span&gt;, which is part of the standard pattern.  You should be fairly used to your event handlers having a &lt;span style="font-style:italic;"&gt;sender&lt;/span&gt; parameter of type &lt;span style="font-style:italic;"&gt;Object&lt;/span&gt; and an &lt;span style="font-style:italic;"&gt;e&lt;/span&gt; parameter of type &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; or something like it.  The second parameter is the event’s data.  The &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; class acts as a place-holder for events that don’t have any data and as a base class for the types used by events that do have data.  Rather than create a new &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; object each time, we use the static/Shared &lt;span style="font-style:italic;"&gt;Empty&lt;/span&gt; field, which returns an empty &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; object.&lt;br /&gt;&lt;br /&gt;Now, the code we have will do the job but we can make it better.  First of all, the event will be raised every time the corresponding property is set, whether the value actually changes or not.  We should actually test the new value and only raise the event if it’s different to the old value.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FirstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstNameChanged != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstNameChanged(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; LastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastNameChanged != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastNameChanged(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; FirstName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; value &amp;lt;&amp;gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; FirstNameChanged(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; LastName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; value &amp;lt;&amp;gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; LastNameChanged(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;The next step is to implement the common pattern that is used throughout the Framework for raising events.  That involves declaring a method whose purpose in life it is to raise the event.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnFirstNameChanged(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstNameChanged != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstNameChanged(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, e);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnLastNameChanged(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastNameChanged != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastNameChanged(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, e);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnFirstNameChanged(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; FirstNameChanged(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnLastNameChanged(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; LastNameChanged(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Such a method is used basically so that the event is only ever raised in one place.  If you ever want to raise the event you simply call this method.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FirstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnFirstNameChanged(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; LastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnLastNameChanged(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; FirstName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; value &amp;lt;&amp;gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnFirstNameChanged(EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; LastName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; value &amp;lt;&amp;gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnLastNameChanged(EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;The primary advantage of this is linked to the way the method is declared.  Notice that the methods above are declared &lt;span style="font-style:italic;"&gt;protected&lt;/span&gt;/&lt;span style="font-style:italic;"&gt;Protected&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;virtual&lt;/span&gt;/&lt;span style="font-style:italic;"&gt;Overridable&lt;/span&gt;.  This means that any derived classes can override these methods and change the type’s behaviour when the events are raised.  The derived class simply calls the base implementation to raise the event, so code can be added before that call or after it to add new behaviour.  This new behaviour will be invoked even if the method is called from the base class, such is the behaviour of overridden members.  If the event was raised directly in the property setters of the base class then derived classes wouldn’t be able to add new behaviour because the properties are not declared &lt;span style="font-style:italic;"&gt;virtual&lt;/span&gt;/&lt;span style="font-style:italic;"&gt;Overridable&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;It’s also worth noting that another part of the pattern is naming the method that raises an event the same as the event it raises, but with the “On” prefix added.  Note that in .NET there is no &lt;span style="font-style:italic;"&gt;OnLoad&lt;/span&gt; or &lt;span style="font-style:italic;"&gt;OnClick&lt;/span&gt; event.  The events are named &lt;span style="font-style:italic;"&gt;Load&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;Click&lt;/span&gt; and the methods that raise them are name &lt;span style="font-style:italic;"&gt;OnLoad&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;OnClick&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;So, we now have a full, working implementation that follows the standard .NET pattern.  We’ve declared the events, declared methods to raise them and then called those methods when the event notification is required.  But wait; there’s more!&lt;br /&gt;&lt;br /&gt;I said earlier that events may or may not have data associated with them.  In the case of our &lt;span style="font-style:italic;"&gt;FirstNameChanged&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;LastNameChanged&lt;/span&gt; events there is no data.  Listeners are simply being notified that a property value has changed.  If they want to know the new value they can simply get the property.  As such an &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; object is used as a place-holder for the event handlers.  Now let’s consider a situation where the event handlers will require some information that they cannot otherwise access themselves.&lt;br /&gt;&lt;br /&gt;In that situation the object raising the event needs to pass that data to the event handler.  It does this through the &lt;span style="font-style:italic;"&gt;e&lt;/span&gt; parameter.  In such cases the &lt;span style="font-style:italic;"&gt;e&lt;/span&gt; parameter cannot be type &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; because the &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; class has no members that can store such data.  As a result, we need to use a class that inherits &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; and then adds the required members.  The Framework already contains numerous such class, e.g. &lt;span style="font-style:italic;"&gt;MouseEventArgs&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;PaintEventArgs&lt;/span&gt;.  You should use one of those existing classes if it’s appropriate to your event, otherwise you should define your own class.&lt;br /&gt;&lt;br /&gt;For this example, let’s consider the situation where we want to notify listeners that the property value is going to change before it happens, in addition to notifying them that the property value has changed after it happens.  If the property value hasn’t actually changed yet then there’s no way an event handler can get the new value, unless that data is passed to the event handler explicitly.  For this we’ll define our own derived &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; class.  We could define one for each event but they are both notifying about a &lt;span style="font-style:italic;"&gt;String&lt;/span&gt; property changing so we can use the same class for both.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _proposedValue;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ProposedValue&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._proposedValue;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; StringPropertyChangingEventArgs(&lt;span style="color: blue;"&gt;string&lt;/span&gt; proposedValue)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._proposedValue = proposedValue;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; StringPropertyChangingEventArgs&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; EventArgs&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; _proposedValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; ProposedValue() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._proposedValue&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; proposedValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._proposedValue = proposedValue&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Note that the &lt;span style="font-style:italic;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; class inherits the &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; class and then adds a property for the new data we need: the proposed value of the property.  There’s no need to include the current value of the property because the event handler can get that itself.&lt;br /&gt;&lt;br /&gt;There are two more points to note here.  The name of the class ends with “EventArgs”, which is part of the convention.  Another is using the term “Changing” for an event related to a proposed change to a property value.  This goes along with the convention of using “Changed” for an event related to a property that has changed already.  For the events you would normally prefix the “Changing” with the name of the property.  We can’t do that for this class though, because it’s to be used by more than one property/event.&lt;br /&gt;&lt;br /&gt;Now that we have a type to pass the event data to the event handler, the next thing we need is an event.  In the case of the &lt;span style="font-style:italic;"&gt;FirstNameChanged&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;LastNameChanged&lt;/span&gt; events, we declared them as type &lt;span style="font-style:italic;"&gt;EventHandler&lt;/span&gt;.  That’s not possible for our &lt;span style="font-style:italic;"&gt;FirstNameChanging&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;LastNameChanging&lt;/span&gt; events though because they will require a &lt;span style="font-style:italic;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; parameter rather than an &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; parameter, so their signatures will not match that of the &lt;span style="font-style:italic;"&gt;EventHandler&lt;/span&gt; delegate.  We need a different delegate.  For this we have two choices.  Firstly, we could define our own delegate with a signature that matches that of our event handlers.  This is good practice if you’re exposing an event outside the current assembly.  We’ll look at that option later but, if the event is only going to be used within the current project, it’s considered good practice to use the generic &lt;span style="font-style:italic;"&gt;EventHandler(TEventArgs)&lt;/span&gt; delegate.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt;&amp;gt; FirstNameChanging;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt;&amp;gt; LastNameChanging;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; FirstNameChanging &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventHandler(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; LastNameChanging &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventHandler(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;In this case the generic type of the delegate specifies the type of the second parameter of the event handler.  Note that this type must be &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; or derived from &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The next step is to declare methods to raise the events.  They will be much as were those for the other events but with a different parameter type.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnFirstNameChanging(&lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstNameChanging != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.FirstNameChanging(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, e);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnLastNameChanging(&lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastNameChanging != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastNameChanging(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, e);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnFirstNameChanging(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; FirstNameChanging(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnLastNameChanging(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; LastNameChanging(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;All that remains is for us to call the methods to actually raise the events.  Remember that these events are intended to notify our listeners that a property value is going to change, so they must be raised before the actual value changes.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FirstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnFirstNameChanging(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt;(&lt;span style="color: blue;"&gt;value&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnFirstNameChanged(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; LastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnLastNameChanging(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt;(&lt;span style="color: blue;"&gt;value&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnLastNameChanged(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; FirstName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; value &amp;lt;&amp;gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnFirstNameChanging(&lt;span style="color: blue;"&gt;New&lt;/span&gt; StringPropertyChangingEventArgs(value))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnFirstNameChanged(EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; LastName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; value &amp;lt;&amp;gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnLastNameChanging(&lt;span style="color: blue;"&gt;New&lt;/span&gt; StringPropertyChangingEventArgs(value))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnLastNameChanged(EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;That’s done but, really, what use is that event?  It tells our listeners that the property value is about to change and what it’s about to change to, but to what use can that information be put?  Normally, the reason you want to know that a property is about to change is so that you can abort the change if the value is unacceptable for some reason.  That can’t be done in this case though, because the property value changes after the event has been handled no matter what.&lt;br /&gt;&lt;br /&gt;The ability to cancel an action from an event handler already exists in the Framework.  Consider the &lt;span style="font-style:italic;"&gt;FormClosing&lt;/span&gt; event.  You can ask the user for confirmation at that stage and, if they decide they don’t want to close the form, you simply set the &lt;span style="font-style:italic;"&gt;e.Cancel&lt;/span&gt; property to &lt;span style="font-style:italic;"&gt;True&lt;/span&gt;.  This property is available because the &lt;span style="font-style:italic;"&gt;e&lt;/span&gt; parameter is type &lt;span style="font-style:italic;"&gt;CancelEventArgs&lt;/span&gt;.  We can’t use &lt;span style="font-style:italic;"&gt;CancelEventArgs&lt;/span&gt; for our methods though, because we need to provide the extra data consisting of the proposed property value.  The solution is to have our &lt;span style="font-style:italic;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; class inherit &lt;span style="font-style:italic;"&gt;CancelEventArgs&lt;/span&gt; instead of &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt;.  That way we get the &lt;span style="font-style:italic;"&gt;Cancel&lt;/span&gt; property and we can add our own data to that.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;CancelEventArgs&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; _proposedValue;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ProposedValue&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._proposedValue;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; StringPropertyChangingEventArgs(&lt;span style="color: blue;"&gt;string&lt;/span&gt; proposedValue)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._proposedValue = proposedValue;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; StringPropertyChangingEventArgs&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; CancelEventArgs&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; _proposedValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; ProposedValue() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._proposedValue&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; proposedValue &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._proposedValue = proposedValue&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;The class name hasn’t changed so we don’t need to change any of the event and method declarations.  We do, however, have to change the code in the property to handle the situation where the listener cancels the action.  In that case the property value shouldn’t change.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FirstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; e = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt;(&lt;span style="color: blue;"&gt;value&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnFirstNameChanging(e);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!e.Cancel)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._firstName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnFirstNameChanged(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; LastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; e = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt;(&lt;span style="color: blue;"&gt;value&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnLastNameChanging(e);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!e.Cancel)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._lastName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.OnLastNameChanged(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; FirstName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; value &amp;lt;&amp;gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; StringPropertyChangingEventArgs(value)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnFirstNameChanging(e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; e.Cancel &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._firstName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnFirstNameChanged(EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; LastName() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; value &amp;lt;&amp;gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; StringPropertyChangingEventArgs(value)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnLastNameChanging(e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; e.Cancel &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._lastName = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.OnLastNameChanged(EventArgs.Empty)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;This is as much as most people will usually need to do when it comes to custom events.  There are a couple more points to consider though.  As I said earlier, if your event is only going to be handled within your own project then it’s considered good practice to use the generic &lt;span style="font-style:italic;"&gt;EventHandler(TEventArgs)&lt;/span&gt; delegate as your event’s type.  If you’re exposing your event outside your assembly though, it’s considered good practice to declare your own delegate and declare your event as that type.  This is in much the same vein as declaring properties that expose a collection.  In that case, properties that will be accessible only within the assembly can use the generic &lt;span style="font-style:italic;"&gt;List(T)&lt;/span&gt; class while, for properties exposed outside the assembly, you should declare your own custom collection type.&lt;br /&gt;&lt;br /&gt;In this case we have two choices if we want to declare our own custom delegate.  We can either declare a single delegate, just as we’ve declared a single &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; class, or declare a delegate for each event.  Good practice dictates that we choose the latter.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;delegate&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FirstNameChangingEventHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; e);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;delegate&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;LastNameChangingEventHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; e);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Delegate&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; FirstNameChangingEventHandler(&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; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Delegate&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; LastNameChangingEventHandler(&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; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Note that our delegates’ signatures match those of the methods that will be used to handle the events.  Notice, also, that the names follow convention: the name of the event with an “EventHandler” suffix.  Now we simply declare our events as these types instead of type &lt;span style="font-style:italic;"&gt;Eventhandler(TEventArgs)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FirstNameChangingEventHandler&lt;/span&gt; FirstNameChanging;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;LastNameChangingEventHandler&lt;/span&gt; LastNameChanging;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; FirstNameChanging &lt;span style="color: blue;"&gt;As&lt;/span&gt; FirstNameChangingEventHandler&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; LastNameChanging &lt;span style="color: blue;"&gt;As&lt;/span&gt; LastNameChangingEventHandler&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Finally, consider how our new cancellable event works.  The caller sets the property and the appropriate “Changing” event is raised.  The caller can either cancel the event, in which case the new property value is never committed and the corresponding “Changed” event is never raised, or else the event can be accepted, in which case the new property value is committed and the “Changed” event is raised.&lt;br /&gt;&lt;br /&gt;That’s just what we want, but consider what happens if we have two event handlers for the same “Changing” event.  Let’s say that the property is set and the “Changing” event is raised, invoking the first event handler.  If &lt;span style="font-style:italic;"&gt;e.Cancel&lt;/span&gt; is set to &lt;span style="font-style:italic;"&gt;True&lt;/span&gt; in that event handler, what should happen?  If the event has been cancelled then that should be the end of it, right?  That’s not what will happen though.  As it stands, all event handlers will be invoked no matter what.  That means that the first event handler to get invoked might set &lt;span style="font-style:italic;"&gt;e.Cancel&lt;/span&gt; to &lt;span style="font-style:italic;"&gt;True&lt;/span&gt;, but then the second event handler can set it back to &lt;span style="font-style:italic;"&gt;False&lt;/span&gt; again.  That would mean that the property value change would be committed, even though it was cancelled by the first listener.  It would depend on the circumstances but, more often than not, I would think that this would be undesirable behaviour.&lt;br /&gt;&lt;br /&gt;To remedy this we need to create truly custom events, which means providing our own implementation to handle an event handler being added, an event handler being removed and the event being raised.  The first step is to create a collection for our delegates so that we can loop through them and invoke each one individually rather than invoking them all as a group.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;FirstNameChangingEventHandler&lt;/span&gt;&amp;gt; firstNameChangingHandlers = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;FirstNameChangingEventHandler&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;LastNameChangingEventHandler&lt;/span&gt;&amp;gt; lastNameChangingHandlers = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;LastNameChangingEventHandler&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; firstNameChangingHandlers &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; List(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; FirstNameChangingEventHandler)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; lastNameChangingHandlers &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; List(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; LastNameChangingEventHandler)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Next we need to provide a custom implementation for our events that handles adding and removing event handlers.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FirstNameChangingEventHandler&lt;/span&gt; FirstNameChanging&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;add&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameChangingHandlers.Add(&lt;span style="color: blue;"&gt;value&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;remove&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameChangingHandlers.Remove(&lt;span style="color: blue;"&gt;value&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;LastNameChangingEventHandler&lt;/span&gt; LastNameChanging&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;add&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameChangingHandlers.Add(&lt;span style="color: blue;"&gt;value&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;remove&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameChangingHandlers.Remove(&lt;span style="color: blue;"&gt;value&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Custom&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; FirstNameChanging &lt;span style="color: blue;"&gt;As&lt;/span&gt; FirstNameChangingEventHandler&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; FirstNameChangingEventHandler)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameChangingHandlers.Add(value)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; FirstNameChangingEventHandler)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameChangingHandlers.Remove(value)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt;(&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; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; handler &lt;span style="color: blue;"&gt;As&lt;/span&gt; FirstNameChangingEventHandler &lt;span style="color: blue;"&gt;In&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameChangingHandlers&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; handler(sender, e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Cancel &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Exit&lt;/span&gt; &lt;span style="color: blue;"&gt;For&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Custom&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; LastNameChanging &lt;span style="color: blue;"&gt;As&lt;/span&gt; LastNameChangingEventHandler&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; LastNameChangingEventHandler)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameChangingHandlers.Add(value)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; LastNameChangingEventHandler)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameChangingHandlers.Remove(value)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt;(&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; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; handler &lt;span style="color: blue;"&gt;As&lt;/span&gt; LastNameChangingEventHandler &lt;span style="color: blue;"&gt;In&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameChangingHandlers&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; handler(sender, e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Cancel &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Exit&lt;/span&gt; &lt;span style="color: blue;"&gt;For&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Notice that now, when a handler is added for the event, we store it in our own collection.  We remove the handler from the collection when it’s removed from the event as well.  In the case of VB, we also add extra code to control what happens when we call &lt;span style="font-style:italic;"&gt;RaiseEvent&lt;/span&gt;.  That allows the VB code that raises the event to remain unchanged, while the C# code that raises the event must provide the extra functionality for allowing the event to be cancelled before all event handlers have been executed.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnFirstNameChanging(&lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;FirstNameChangingEventHandler&lt;/span&gt; handler &lt;span style="color: blue;"&gt;in&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameChangingHandlers)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; handler(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, e);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.Cancel) &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnLastNameChanging(&lt;span style="color: #2b91af;"&gt;StringPropertyChangingEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;LastNameChangingEventHandler&lt;/span&gt; handler &lt;span style="color: blue;"&gt;in&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameChangingHandlers)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; handler(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, e);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.Cancel) &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnFirstNameChanging(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; FirstNameChanging(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnLastNameChanging(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; StringPropertyChangingEventArgs)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt; LastNameChanging(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;In both cases, raising the event now consists of looping through the registered event handlers one by one.  As soon as one of the event handlers cancels the event, no more event handlers are executed.&lt;br /&gt;&lt;br /&gt;That’s everything.  We’ve covered declaring our own events that have no data, defining our own custom &lt;span style="font-style:italic;"&gt;EventArgs&lt;/span&gt; class, declaring events that use that custom class using the generic &lt;span style="font-style:italic;"&gt;EventHandler(TEventArgs)&lt;/span&gt; delegate as well as our own custom delegates, passing data to the event handler and back again and, finally, defining custom events that provide their own implementation for adding and removing event handlers as well as raising the event itself.  There’s now nothing you can’t do with events of your own.  Here’s hoping you have an eventful future. ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3064139338712255342-6766813769165355715?l=jmcilhinney.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/6766813769165355715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3064139338712255342&amp;postID=6766813769165355715' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/6766813769165355715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/6766813769165355715'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/2009/11/defining-and-raising-custom-events.html' title='Defining and Raising Custom Events'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-3336265384166086026</id><published>2009-10-18T23:01:00.007+11:00</published><updated>2009-10-24T23:09:47.056+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gdi+'/><category scheme='http://www.blogger.com/atom/ns#' term='vb.net'/><category scheme='http://www.blogger.com/atom/ns#' term='drag and drop'/><category scheme='http://www.blogger.com/atom/ns#' term='.net development'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><title type='text'>Manipulating GDI+ Drawings</title><content type='html'>I've seen many people ask how to manipulate the drawing they produce using GDI+.  This is no trivial thing because, as you'll know if you've used GDI+ much at all, your drawing is simply pixels on the screen.  There are no objects that you can get references to, set properties on or call methods of.&lt;br /&gt;&lt;br /&gt;If you want to use GDI+ to draw on your form and/or controls and you want to be able to change what's drawn at all then you really only have one course of action available.  You need to declare one or more member variables, store data in those variables that describe your drawing and then read that data on the Paint event.  If you want to be able manipulate your drawing, e.g. drag items around, then you need to use that same data to determine how the mouse state relates to your drawing and then make changes accordingly.&lt;br /&gt;&lt;br /&gt;For this example, we're going to create a simple Windows Forms application that behaves, in a rudimentary way, like the VS design window.  Just as you can draw controls onto a form, drag them around and use their right-click menu to change the z-order on a Windows Form, so our app will allow you to draw boxes by clicking and dragging, move boxes around by dragging and dropping and also to change the z-order using a right-click.&lt;br /&gt;&lt;br /&gt;The app will draw white rectangles with a black border, which will make it easy to see which is in front of which.  The boxes will have an apparent z-order, much as controls do on a form.  We will add right-click functionality that will allow us to send a box to the back, making it appear to be behind the other boxes, or to bring it to the front, making it appear to be in front of all others.  We will also add functionality to enable dragging and dropping boxes around the form.&lt;br /&gt;&lt;br /&gt;So, first things first, you'll need to open VS and create a new Windows Forms Application project.  I've tested this in VS 2008 but the code I'll provide should also work in VS 2005.  I'll also provide both C# and VB code so you can use whichever language you like.&lt;br /&gt;&lt;br /&gt;Let's start by adding a PictureBox to the form and setting its Dock property to Fill, so it fills the entire form.  We're going to need handle some events of that PictureBox so let's create those event handlers now.  We'll only consider the drawing part for now so what events will we need to handle?  The user is going to depress the left mouse button to start drawing, drag the mouse to the opposite corner of the box they want to draw, then release the mouse button.  To be able to pick up all of that activity we will need to handle the MouseDown, MouseMove and MouseUp events of the PictureBox.  Of course, we're using GDI+ to draw on the PictureBox so we'll obviously need to handle its Paint event too.&lt;br /&gt;&lt;br /&gt;As I said earlier, we need to store data that describes our drawing in one or more member variables that we can edit and then read in the Paint event handler.  In this case we will need to store the start point and the end point of the box we're currently drawing.  Two Point fields will do for that.  We'll also need to store data for each box we'vew previously drawn.  We'll use instances of the Rectangle structure to represent a box and we'll use a generic List to store a Rectangle for each box we've previosuly drawn.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; startPoint;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; endPoint;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt;&amp;gt; boxes = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; startPoint &lt;span style="color: blue;"&gt;As&lt;/span&gt; Point&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; endPoint &lt;span style="color: blue;"&gt;As&lt;/span&gt; Point&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; boxes &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; List(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; Rectangle)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;First of all, let’s think about how we want the drawing done.  That way we can implement the body of our Paint event handler and then essentially forget about it.  So, all previously drawn boxes will be recorded as a Rectangle in our generic list while, if we are currently drawing a box, it will be defined by the start point and end point values.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_Paint(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;PaintEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Graphics&lt;/span&gt; g = e.Graphics;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box &lt;span style="color: blue;"&gt;in&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.FillRectangle(&lt;span style="color: #2b91af;"&gt;Brushes&lt;/span&gt;.White, box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawRectangle(&lt;span style="color: #2b91af;"&gt;Pens&lt;/span&gt;.Black, box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Left)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.FillRectangle(&lt;span style="color: #2b91af;"&gt;Brushes&lt;/span&gt;.White, box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawRectangle(&lt;span style="color: #2b91af;"&gt;Pens&lt;/span&gt;.Black, box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_Paint(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; PaintEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.Paint&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;With&lt;/span&gt; e.Graphics&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle &lt;span style="color: blue;"&gt;In&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .FillRectangle(Brushes.White, box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .DrawRectangle(Pens.Black, box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; Control.MouseButtons = Windows.Forms.MouseButtons.Left &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .FillRectangle(Brushes.White, box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .DrawRectangle(Pens.Black, box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Let’s look at a few points of interest in that code.  First, it uses a foreach/For Each loop to enumerate the existing boxes for drawing.  As such it will draw the oldest first, thus placing newer boxes in front of older, which is the desired behaviour.  If there is a box currently being drawn it gets drawn last of all, in front of all other boxes.  Note that the test for whether or not a box is currently being drawn is that the left mouse button and only the left mouse button is depressed.  Finally, note that that code calls a GetRectangle method that takes two Point arguments and returns a Rectangle.  It’s our next job to write that method.&lt;br /&gt;&lt;br /&gt;So, if you’re given two Points, how will you create a Rectangle from them?  To create a Rectangle we need the coordinates of the top, left corner and the dimensions.  We’ll obviously assume that our two Points are diagonally opposite but we don’t which diagonal or in which order.  We don’t have to care though.  We know that, whatever combination of corners we have, the top, left corner will be defined by the lower of the two X values and the lower of the two Y values.  The dimensions will just be the difference between the X values and the Y values, although we’ll have to take the absolute value to allow for either order.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; GetRectangle(&lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; startPoint, &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; endPoint)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Math&lt;/span&gt;.Min(startPoint.X, endPoint.X),&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #2b91af;"&gt;Math&lt;/span&gt;.Min(startPoint.Y, endPoint.Y),&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #2b91af;"&gt;Math&lt;/span&gt;.Abs(startPoint.X - endPoint.X),&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #2b91af;"&gt;Math&lt;/span&gt;.Abs(startPoint.Y - endPoint.Y));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetRectangle(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; startPoint &lt;span style="color: blue;"&gt;As&lt;/span&gt; Point, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; endPoint &lt;span style="color: blue;"&gt;As&lt;/span&gt; Point) &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; Rectangle(Math.Min(startPoint.X, endPoint.X), _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; Math.Min(startPoint.Y, endPoint.Y), _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; Math.Abs(startPoint.X - endPoint.X), _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; Math.Abs(startPoint.Y - endPoint.Y))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Next we need to look at what we’re going to do when the user depresses the mouse button.  That location will become the start point for the new box, and it will also be the initial value for the end point, given that the mouse hasn’t moved from the start point yet.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_MouseDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Left)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; location = e.Location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint = location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint = location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_MouseDown(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; MouseEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.MouseDown&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; Control.MouseButtons = Windows.Forms.MouseButtons.Left &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; location &lt;span style="color: blue;"&gt;As&lt;/span&gt; Point = e.Location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint = location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint = location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Note that the value tested is Control.MouseButtons rather than e.Button.  This because we want to start drawing if the left mouse button and only the left button is depressed.  If the user has already depressed the right mouse button and then depresses the left, e.Button would still have the value Left, while Control.MouseButtons would not.&lt;br /&gt;&lt;br /&gt;Next, let’s consider what we want to do when the user releases the mouse button.  Let’s keep it simple to begin with.  We first need to create a Rectangle from the start point and end point.  We can do that courtesy of our GetRectangle method.  We then need to add that to our List of Rectangles so that it gets drawn.  Finally, we need to invalidate the area occupied by that Rectagle and then tell the PictureBox to repaint it.  We invalidate only the area that has changed, for efficiency.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_MouseUp(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.Button == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Left &amp;amp;&amp;amp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.None)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint = e.Location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes.Add(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1.Invalidate(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1.Update();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_MouseUp(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; MouseEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.MouseUp&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Button = Windows.Forms.MouseButtons.Left &lt;span style="color: blue;"&gt;AndAlso&lt;/span&gt; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; Control.MouseButtons = Windows.Forms.MouseButtons.None &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint = e.Location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes.Add(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1.Invalidate(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1.Update()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;We’re actually at the point where our application can do something useful, so let’s give it a try.  Run your project and try creating a few boxes.  Just push the left mouse button, drag the mouse and then release.  You’ll see that nothing gets drawn while we’re dragging yet, but a box appears when we release the mouse.&lt;br /&gt;&lt;br /&gt;There’s a bit of a problem though.  Notice that the black border only gets drawn on the top and left sides, not on the right and bottom.  That’s actually not an issue with the drawing itself but rather an issue with the invalidation.  When you call Invalidate and pass a Rectangle, the right and bottom edges are exclusive.  As such, if we want that last row and column of pixels to be drawn when we call Update, we need to enlarge the area we invalidate at least one pixel further right and one pixel further down.  This is something that we’ll need to do again so let’s put it into its own method.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; InvalidateRectangle(&lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; box.Inflate(1, 1);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1.Invalidate(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; InvalidateRectangle(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; box.Inflate(1, 1)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1.Invalidate(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;The Inflate method will increase the width and the height of the Rectangle by the specified amounts in both directions.  As such, we’ll end up invalidating one row of pixels above and one column of pixels to the left that haven’t actually changed.  That’s only a small number though and this code is more succinct than what we would write to get the size increase just to the right and down.  It’s not a big deal though so, by all means, write that extra bit of code if want to be as efficient as possible.  Note also that it’s safe to inflate the parameter directly because it’s just a copy of the Rectangle in the List, owing to Rectangle being a value type.&lt;br /&gt;&lt;br /&gt;We can now call our InvalidateRectangle method from our MouseUp event handler.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_MouseUp(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.Button == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Left &amp;amp;&amp;amp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.None)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint = e.Location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes.Add(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.InvalidateRectangle(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1.Update();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_MouseUp(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; MouseEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.MouseUp&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Button = Windows.Forms.MouseButtons.Left &lt;span style="color: blue;"&gt;AndAlso&lt;/span&gt; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; Control.MouseButtons = Windows.Forms.MouseButtons.None &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint = e.Location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes.Add(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.InvalidateRectangle(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1.Update()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Now let’s try running our project again.  This time notice that the black border is drawn on all four sides.  Try drawing boxes from using both diagonals in both directions and you’ll see it works correctly for all four cases.  Also notice that new boxes are drawn in front of old ones.&lt;br /&gt;&lt;br /&gt;The next order of business is getting the boxes to draw as we drag the mouse, rather than just appearing when we release the mouse button.  For that to happen we need to tell the PictureBox to repaint from the MouseMove event handler.  In this case we want to, again, check that the left mouse button and only the left mouse button is depressed.  We’ll need to invalidate the area previously occupied by the box being drawn, in case it has shrunk, then invalidate the new area occupied by the box, then force a repaint.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_MouseMove(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Left)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.InvalidateRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint = e.Location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.InvalidateRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1.Update();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_MouseMove(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; MouseEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.MouseMove&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; Control.MouseButtons = Windows.Forms.MouseButtons.Left &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.InvalidateRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint = e.Location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.InvalidateRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1.Update()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Try running the project and drawing some boxes again.  You’ll see that now the box gets drawn on the form as we’re dragging the mouse.  Try dragging the mouse in a circle around the start point and see how it gets drawn correctly in all four directions.  Try doing the same when drawing a box over some others and see how those underneath get redrawn correctly as they reappear, thanks to our invalidating the old area of the box as well as the new.&lt;br /&gt;&lt;br /&gt;That’s the end of the first stage of the project: drawing the boxes.  The next stage is to be able to right-click a box and select an option to send it to the back of the z-order or bring it to the front.  In order to do that, we’re obviously going to have to add a ContextMenuStrip to the form.  We won’t be able to just assign it to the PictureBox’s ContextMenuStrip property though, because we’ll only want to show it when the user right-clicks on a box.&lt;br /&gt;&lt;br /&gt;Go ahead and add a ContextMenuStrip to your form.  Add two items to the menu with text “Bring to Front” and “Send to Back”.  You might as well create handlers for their Click events now, although we won’t add any code to them just yet.  Before we do that we need to add a handler for the PictureBox’s MouseClick event, to detect tight-clicks.  In order to determine whether the mouse pointer was in a box when the right-click occurred, we will need to loop through our List of Rectangles and check whether each one contains the mouse pointer.  This is something we’ll have to do again so let’s put it into its own method.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; GetRectangleIndexAtPoint(&lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; location)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; result = -1;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt; index = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes.Count - 1; index &amp;gt;= 0; index--)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; box = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes[index];&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (box.Contains(location))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = index;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetRectangleIndexAtPoint(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; location &lt;span style="color: blue;"&gt;As&lt;/span&gt; Point) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; result &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt; = -1&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; index &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt; = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes.Count - 1 &lt;span style="color: blue;"&gt;To&lt;/span&gt; 0 &lt;span style="color: blue;"&gt;Step&lt;/span&gt; -1&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; box = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes(index)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; box.Contains(location) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = index&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Exit&lt;/span&gt; &lt;span style="color: blue;"&gt;For&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; result&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Notice that that code loops through the List backwards.  That’s because, if two boxes overlap, we want to detect the front-most one, which will have a higher index.&lt;br /&gt;&lt;br /&gt;Now let’s use that method to detect whether or not we should display the ContextMenuStrip on a right-click.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_MouseClick(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e.Button == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Right &amp;amp;&amp;amp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.None)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; location = e.Location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.selectedBoxIndex = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangleIndexAtPoint(location);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.selectedBoxIndex != -1)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.contextMenuStrip1.Show(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1, location);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_MouseClick(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; MouseEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.MouseClick&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; e.Button = Windows.Forms.MouseButtons.Right &lt;span style="color: blue;"&gt;AndAlso&lt;/span&gt; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; Control.MouseButtons = Windows.Forms.MouseButtons.None &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; location &lt;span style="color: blue;"&gt;As&lt;/span&gt; Point = e.Location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.selectedBoxIndex = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangleIndexAtPoint(location)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.selectedBoxIndex &amp;lt;&amp;gt; -1 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ContextMenuStrip1.Show(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1, location)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Notice that the result of the GetRectangleIndexAtPoint method is assigned to a field that we are yet to declare.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; selectedBoxIndex;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; selectedBoxIndex &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;That field is required because we’ll need to its value in order to identify which box to manipulate when the user selects a menu item.&lt;br /&gt;&lt;br /&gt;The code first checks that the right mouse button was released and there are no other buttons currently depressed.  In that case it gets the index of the front-most box that contains the mouse pointer.  If there is such a box the menu is displayed at the mouse pointer location.&lt;br /&gt;&lt;br /&gt;Now it’s time to implement the actions associated with the menu items.  If you haven’t already, you should add Click event handlers for both menu items now.  In each case we will want to move the box that was right-clicked, which is identified by the selectedBoxIndex field, from its current position to one end or the other.  If we’re bringing the box to the front then it needs to be drawn last, so it should be placed at the end of the List, while if we’re sending it to the back it should be at the beginning of the List, to get drawn first.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; bringToFrontToolStripMenuItem_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.ChangeRectangleIndex(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.selectedBoxIndex, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes.Count);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; sendToBackToolStripMenuItem_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.ChangeRectangleIndex(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.selectedBoxIndex, 0);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ChangeRectangleIndex(&lt;span style="color: blue;"&gt;int&lt;/span&gt; oldIndex, &lt;span style="color: blue;"&gt;int&lt;/span&gt; newIndex)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes[oldIndex];&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (oldIndex &amp;lt; newIndex)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; newIndex--;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes.RemoveAt(oldIndex);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes.Insert(newIndex, box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.InvalidateRectangle(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1.Update();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; BringToFrontToolStripMenuItem_Click(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&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; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; BringToFrontToolStripMenuItem.Click&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ChangeRectangleIndex(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.selectedBoxIndex, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes.Count)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; SendToBackToolStripMenuItem_Click(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&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; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; SendToBackToolStripMenuItem.Click&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ChangeRectangleIndex(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.selectedBoxIndex, 0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; ChangeRectangleIndex(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; oldIndex &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;, &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; newIndex &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes(oldIndex)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; oldIndex &amp;lt; newIndex &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; newIndex -= 1&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes.RemoveAt(oldIndex)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes.Insert(newIndex, box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.InvalidateRectangle(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1.Update()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;While it would be possible for the bring-to-front functionality to use Add instead of Insert, I’ve used Insert in both cases for the sake of code reuse.  The ChangeRectangleIndex function first gets the box that selected by the right-click.  It then adjusts the new index if necessary, because removing an item will decrement the index of all subsequent items.  The box is then removed from the list and re-inserted at the new index.  Finally, the area occupied by the box in question is invalidated and a repaint is forced.&lt;br /&gt;&lt;br /&gt;Try running the project again and drawing a few boxes.  Now try right-clicking in various places, some on a box and some not.  You’ll see that the menu is only displayed when the click is on a box, as it should be.  Now try selecting the two menu options and see the apparent z-order of the boxes change accordingly.  Also note that, if you right-click on an area where two boxes overlap, it’s always the one in front that receives the command from the menu item.&lt;br /&gt;&lt;br /&gt;OK, that’s the setup over.  Now let’s get down to the business at hand: implementing drag-and-drop functionality for our boxes.  First of all, let’s add a ToolStrip to our form and then add one button.  That button will be used for switching our app from drawing mode to dragging mode.  Set the Text of the button to “Click to Drag” and set its DisplayStyle to “Text”.  Now, at this point you’ll want to right-click on your PictureBox and select “Bring to Front”, to prevent it filling the entire form and going behind the ToolStrip.  Finally, double-click the button to create a handler for its Click event.  We now want to add a flag that will indicate to the app whether it is in drawing mode or dragging mode and have that flag toggled when the tool bar button is clicked.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; drawMode = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; toolStripButton1_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.drawMode = !&lt;span style="color: blue;"&gt;this&lt;/span&gt;.drawMode;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.drawMode)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.toolStripButton1.Text = &lt;span style="color: #a31515;"&gt;&amp;quot;Click to Drag&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.toolStripButton1.Text = &lt;span style="color: #a31515;"&gt;&amp;quot;Click to Draw&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; drawMode &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt; = &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; ToolStripButton1_Click(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; ToolStripButton1.Click&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.drawMode = &lt;span style="color: blue;"&gt;Not&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.drawMode&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.drawMode &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ToolStripButton1.Text = &lt;span style="color: #a31515;"&gt;&amp;quot;Click to Drag&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ToolStripButton1.Text = &lt;span style="color: #a31515;"&gt;&amp;quot;Click to Draw&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Note that the flag is true by default, indicating that we are in draw mode to begin with.  The text displayed on the button indicates what the next click will do, which is why we set the Text to “Click to Drag” in the designer.&lt;br /&gt;&lt;br /&gt;At the moment, all the PictureBox’s event handlers assume that we are drawing a new box if the left mouse button is depressed.  We’re going to have to go through all of them and change that behaviour so that the code will only draw a new box if we are in draw mode.  In drag mode something new will happen.&lt;br /&gt;&lt;br /&gt;Let’s start with the Paint event handler.  At the moment the code is drawing all the boxes in the list and then, if the left mouse button is down, it draws the new box.  Now, we will only want to draw the new box if the left mouse button is down AND we are in draw mode.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_Paint(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;PaintEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Graphics&lt;/span&gt; g = e.Graphics;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box &lt;span style="color: blue;"&gt;in&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.FillRectangle(&lt;span style="color: #2b91af;"&gt;Brushes&lt;/span&gt;.White, box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawRectangle(&lt;span style="color: #2b91af;"&gt;Pens&lt;/span&gt;.Black, box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.drawMode &amp;amp;&amp;amp; &lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Left)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.FillRectangle(&lt;span style="color: #2b91af;"&gt;Brushes&lt;/span&gt;.White, box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; g.DrawRectangle(&lt;span style="color: #2b91af;"&gt;Pens&lt;/span&gt;.Black, box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_Paint(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; PaintEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.Paint&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;With&lt;/span&gt; e.Graphics&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle &lt;span style="color: blue;"&gt;In&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .FillRectangle(Brushes.White, box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .DrawRectangle(Pens.Black, box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.drawMode &lt;span style="color: blue;"&gt;AndAlso&lt;/span&gt; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; Control.MouseButtons = Windows.Forms.MouseButtons.Left &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .FillRectangle(Brushes.White, box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .DrawRectangle(Pens.Black, box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Next, let’s look at the MouseDown event.  At the moment the code will store the drawing start point and the current drawing end point.  If we’re dragging we are still going to want to remember the start point because we need to know where we’re dragging from, but the end point isn’t really relevant.  What will need to remember though is which box, if any, we are dragging.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_MouseDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Left)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; location = e.Location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint = location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.drawMode)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint = location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.selectedBoxIndex = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangleIndexAtPoint(location);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_MouseDown(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; MouseEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.MouseDown&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; Control.MouseButtons = Windows.Forms.MouseButtons.Left &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; location &lt;span style="color: blue;"&gt;As&lt;/span&gt; Point = e.Location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint = location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.drawMode &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint = location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.selectedBoxIndex = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangleIndexAtPoint(location)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;When the mouse moves, we need to determine whether we’re dragging a box and, if we are, how far we’ve dragged it.  We then need to move the box that distance and set the current location as the new starting point for the next drag.  Because the box will have moved we need to tell the PictureBox to repaint.  We’ll need to invalidate the area the box occupied before the move and the area it occupies afterwards.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_MouseMove(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Left)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.drawMode)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.InvalidateRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint = e.Location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.InvalidateRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1.Update();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.selectedBoxIndex != -1)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes[&lt;span style="color: blue;"&gt;this&lt;/span&gt;.selectedBoxIndex];&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Point&lt;/span&gt; location = e.Location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.InvalidateRectangle(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; box.Offset(location.X - &lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint.X,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; location.Y - &lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint.Y);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes[&lt;span style="color: blue;"&gt;this&lt;/span&gt;.selectedBoxIndex] = box;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint = location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.InvalidateRectangle(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1.Update();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_MouseMove(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; MouseEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.MouseMove&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; Control.MouseButtons = Windows.Forms.MouseButtons.Left &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.drawMode &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.InvalidateRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint = e.Location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.InvalidateRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1.Update()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ElseIf&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.selectedBoxIndex &amp;lt;&amp;gt; -1 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.selectedBoxIndex)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; location &lt;span style="color: blue;"&gt;As&lt;/span&gt; Point = e.Location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.InvalidateRectangle(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; box.Offset(location.X - &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint.X, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; location.Y - &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint.Y)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.selectedBoxIndex) = box&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint = location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.InvalidateRectangle(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1.Update()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Notice that, after offsetting the box the distance that the mouse pointer has moved, the box is assigned box to the List item.  That’s because, again, Rectangle is a value type so the code retrieves and edits a copy of the Rectangle in the list.  After making changes we must overwrite the original with that copy so the changes are persisted.&lt;br /&gt;&lt;br /&gt;Nothing needs to happen on the MouseUp event when dragging so the only change we need to make to that handler is a check for draw mode.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; pictureBox1_MouseUp(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;MouseEventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.drawMode &amp;amp;&amp;amp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.Button == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.Left &amp;amp;&amp;amp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;.MouseButtons == &lt;span style="color: #2b91af;"&gt;MouseButtons&lt;/span&gt;.None)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint = e.Location;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Rectangle&lt;/span&gt; box = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.endPoint);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.boxes.Add(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.InvalidateRectangle(box);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.pictureBox1.Update();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; PictureBox1_MouseUp(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; MouseEventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; PictureBox1.MouseUp&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.drawMode &lt;span style="color: blue;"&gt;AndAlso&lt;/span&gt; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; e.Button = Windows.Forms.MouseButtons.Left &lt;span style="color: blue;"&gt;AndAlso&lt;/span&gt; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; Control.MouseButtons = Windows.Forms.MouseButtons.None &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint = e.Location&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; box &lt;span style="color: blue;"&gt;As&lt;/span&gt; Rectangle = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetRectangle(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.startPoint, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.endPoint)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.boxes.Add(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.InvalidateRectangle(box)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.PictureBox1.Update()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Believe it or not, that’s it!  Run the project and draw a few boxes, as you did before, and then click the button on the tool bar to switch to drag mode.  Try clicking and dragging in some empty space and notice that no new box gets drawn.  Now try clicking and dragging on a box and notice that the box follows the mouse pointer.  You should also note that the z-order is always maintained during drag operations.  You can still use the context menu to change the z-order while in drag mode so you might like to play around with that to confirm that it works with dragging too.  If you want to draw a few more boxes then just click the tool button again to switch back to draw mode.&lt;br /&gt;&lt;br /&gt;So, that’s all there is to it.  There may not be any actual objects on-screen to manipulate directly, but there are always objects.  With GDI+ we must have data stored somewhere that represents the drawing in some way, so we can simply manipulate those objects appropriately and force the UI to repaint to see the new drawing.  We just need to do a little bit more work to calculate where we are and what we’re moving.  We’re developers though: we love that stuff!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3064139338712255342-3336265384166086026?l=jmcilhinney.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/3336265384166086026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3064139338712255342&amp;postID=3336265384166086026' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/3336265384166086026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/3336265384166086026'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/2009/10/manipulating-gdi-drawings.html' title='Manipulating GDI+ Drawings'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-5445418881470095389</id><published>2009-08-12T23:54:00.017+10:00</published><updated>2010-04-03T21:17:03.809+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parameters'/><category scheme='http://www.blogger.com/atom/ns#' term='vb.net'/><category scheme='http://www.blogger.com/atom/ns#' term='ado.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='data access'/><title type='text'>Using Parameters in ADO.NET</title><content type='html'>&lt;p&gt;As a general rule, parameters should always be used when inserting values into SQL statements.  Many people, generally new developers, don't follow this rule because they either don't realise that parameters exist or they don't understand the issues that their use helps to avoid.  When I was new to .NET programming, I fell into the former category.  Not having read extensively on ADO.NET at the time, I didn't know that parameters could be used to insert field values into SQL code.  I started out writing code like this:&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES ('&amp;quot;&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameField.Text +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;', '&amp;quot;&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameField.Text +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;', '&amp;quot;&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dateOfBirthPicker.Value.ToString(&lt;span style="color: #a31515;"&gt;&amp;quot;yyyy-MM-dd&amp;quot;&lt;/span&gt;) +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;', &amp;quot;&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.childrenSpinner.Value + &lt;span style="color: #a31515;"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt; myCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt;(sql);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES ('&amp;quot;&lt;/span&gt; &amp;amp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameField.Text &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;', '&amp;quot;&lt;/span&gt; &amp;amp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameField.Text &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;', '&amp;quot;&lt;/span&gt; &amp;amp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.dateOfBirthPicker.Value.ToString(&lt;span style="color: #a31515;"&gt;&amp;quot;yyyy-MM-dd&amp;quot;&lt;/span&gt;) &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;', &amp;quot;&lt;/span&gt; &amp;amp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.childrenSpinner.Value &amp;amp; &lt;span style="color: #a31515;"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myCommand &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlCommand(sql)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;N.B. I will initially write all examples using the SqlClient ADO.NET provider for SQL Server and later I will discuss the adjustments required when using other providers and other data sources.&lt;/p&gt;&lt;p&gt;The previous example demonstrates various issues associated with this type of code but let’s start with the most obvious: it’s hard to read.  With all the various literals and property values being concatenated it’s a bit hard to immediately pick out what’s what.  As a result, it’s very easy to make mistakes in such code.  It’s very easy to miss a single quote here or a comma there.  Of course, it’s not too hard to actually view the end result to see if it is what you intended it to be.  I’m constantly surprised, though, by the number of people who build such strings and still don’t actually look at their contents, even when an error occurs.&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES ('&amp;quot;&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameField.Text +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;', '&amp;quot;&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameField.Text +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;', '&amp;quot;&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dateOfBirthPicker.Value.ToString(&lt;span style="color: #a31515;"&gt;&amp;quot;yyyy-MM-dd&amp;quot;&lt;/span&gt;) +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;', &amp;quot;&lt;/span&gt; + &lt;span style="color: blue;"&gt;this&lt;/span&gt;.childrenSpinner.Value + &lt;span style="color: #a31515;"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;MessageBox&lt;/span&gt;.Show(sql);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES ('&amp;quot;&lt;/span&gt; &amp;amp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameField.Text &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;', '&amp;quot;&lt;/span&gt; &amp;amp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameField.Text &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;', '&amp;quot;&lt;/span&gt; &amp;amp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.dateOfBirthPicker.Value.ToString(&lt;span style="color: #a31515;"&gt;&amp;quot;yyyy-MM-dd&amp;quot;&lt;/span&gt;) &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;', &amp;quot;&lt;/span&gt; &amp;amp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.childrenSpinner.Value &amp;amp; &lt;span style="color: #a31515;"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;MessageBox.Show(sql)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;While there are other, possibly better ways, this is the first thing that should occur to a new developer: a simple message box to display the string that was constructed.  This will make it much easier to see if you’ve simply missed some punctuation.  This is a lesson that should be taken into all development: always view your data and don’t just assume that it is what it’s supposed to be.  If an error occurs then you’ve done something wrong and invalid or incorrect data is always a likely candidate.&lt;/p&gt;&lt;p&gt;Now, I’ve always been a big fan of the String.Format method in preference to straight string concatenation when I need to join more than two or three substrings together.  Building SQL statements was one of the first scenarios in which I put it to work.  It makes such code easier to read and, therefore, less error-prone.&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES ('{0}', '{1}', '{2:yyyy-MM-dd}', {3})&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameField.Text,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameField.Text,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dateOfBirthPicker.Value,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.childrenSpinner.Value);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt; myCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt;(sql);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES ('{0}', '{1}', '{2:yyyy-MM-dd}', {3})&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameField.Text, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameField.Text, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.dateOfBirthPicker.Value, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.childrenSpinner.Value)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myCommand &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlCommand(sql)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;As you can see, it’s much easier to tell where each single quote and comma is and, therefore, whether any are missing.  It also makes formatting values such as dates a bit neater.&lt;/p&gt;&lt;p&gt;I thought that this was an improvement, and it was, but it brings me to the next issue: inserting dates and times into SQL code.  As you can see in the last two examples, I’ve had to explicitly format the date of birth.  That’s because you cannot simply rely on a date and/or time value to be formatted by the .NET Framework in a way that is valid for your database.  Even if the format is valid you may end up using a different value to the one you expected because of regional settings.  If your month and day values get transposed between your application and your database then you may end up saving incorrect data, which is even worse than your application failing with an error message.  We can always do as I’ve done above and use a format that will always work.  It’s not a big deal to find out how each database you use formats date literals and then explicitly create that format, but wouldn’t it be better to not have to worry about format at all?  When you use parameters you don’t have to.&lt;/p&gt;&lt;p&gt;Before I provide a code example that does use parameters I will touch on another common issue: strings containing apostrophes.  This is a very common problem which, again, can be diagnosed by actually viewing the string you build.  Doing so should make it obvious that you end up with mismatched single quotes.  The question is, how do you prevent the issue.  To include a single quote in a text literal you escape it with another single quote.  As string concatenation is creating a SQL statement containing literals, that’s what needs to be done:&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES ('{0}', '{1}', '{2:yyyy-MM-dd}', {3})&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameField.Text.Replace(&lt;span style="color: #a31515;"&gt;&amp;quot;'&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;''&amp;quot;&lt;/span&gt;),&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameField.Text.Replace(&lt;span style="color: #a31515;"&gt;&amp;quot;'&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;''&amp;quot;&lt;/span&gt;),&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dateOfBirthPicker.Value,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.childrenSpinner.Value);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt; myCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt;(sql);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES ('{0}', '{1}', '{2:yyyy-MM-dd}', {3})&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameField.Text.Replace(&lt;span style="color: #a31515;"&gt;&amp;quot;'&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;''&amp;quot;&lt;/span&gt;), _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameField.Text.Replace(&lt;span style="color: #a31515;"&gt;&amp;quot;'&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;''&amp;quot;&lt;/span&gt;), _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.dateOfBirthPicker.Value, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.childrenSpinner.Value)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myCommand &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlCommand(sql)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Now, that’s not a big deal but why do it if it’s not necessary?  Also, what about other unusual characters like line breaks?  The simple fact is that, if you use parameters, all these considerations go away.  The values never become part of the literal string so there’s no need to escape single quotes.  Values remain in binary form rather than being converted to strings, so there’s no need to worry about format.  There’s no need to worry about what values need to be wrapped in single quotes or other delimiters and which don’t.  None of that is a concern.&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (@FirstName, @LastName, @DateOfBirth, @ChildCount)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt; myCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt;(sql);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlParameterCollection&lt;/span&gt; parameters = myCommand.Parameters;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameField.Text);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameField.Text);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dateOfBirthPicker.Value.Date);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.childrenSpinner.Value));&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (@FirstName, @LastName, @DateOfBirth, @ChildCount)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myCommand &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlCommand(sql)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;With&lt;/span&gt; myCommand.Parameters&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameField.Text)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameField.Text)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.dateOfBirthPicker.Value.Date)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;CInt&lt;/span&gt;(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.childrenSpinner.Value))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;The first point to note here is how much easier the SQL code is to read.  There’s no need for any string concatenation (other than what I’ve used to fit the code within the width of this page), punctuation or formatting, so the opportunity for errors is greatly reduced.  In this case (but not all), each value has a name that makes its purpose obvious.  Those names match up with the names of the parameters that are added to the command, so it’s easy to trace exactly what’s happening.&lt;/p&gt;&lt;p&gt;Now, let’s examine how the parameters are added to the command.  In cases where the SQL code will be executed only once the parameters will only ever have one value.  In such cases it’s advisable to call the AddWithValue method as it’s the simplest way to add a parameter and set its value.&lt;/p&gt;&lt;/p&gt;The SqlClient ADO.NET provider supports named parameters, so notice that the parameter names in the SQL code match the parameter names passed to AddWithValue.  We’ll look at positional parameters later but, in this case, the names must match or you’ll either send the wrong data to the wrong place or an exception will be thrown, which are obviously both poor outcomes.&lt;/p&gt;&lt;p&gt;When calling AddWithValue, the data type of the parameter is inferred from the type of the specified value.  That’s why, in the case of the parameter named @ChildCount, the Value property of the NumericUpDown control is converted to an Int32 before being assigned.  If the Value property was used as is then the type of the parameter would be inferred from a Decimal instead of an Int32 and a data type mismatch would occur at the database.&lt;/p&gt;&lt;p&gt;Note also that, in the case of the parameter named @DateOfBirth, a DateTime is retrieved from the DateTimePicker’s Value property and then the Date property of that value is used.  Because the code is not using formatting to create a date-only string, if we want only the date and not the time then we must explicitly assign only the date and not the time.&lt;/p&gt;&lt;p&gt;As mentioned previously, if the SQL code is being executed only once then the value of each parameter doesn’t need to change.  In such cases it is easiest to specify the value when creating the parameter and let the data type be inferred.  In cases where the SQL code will be executed multiple times with different parameter values each time we need to take a different approach.  In such cases we need to specify the data type when creating the parameters, then set their Value properties each time we want to use new data.&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (@FirstName, @LastName, @DateOfBirth, @ChildCount)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt; myCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt;(sql, myConnection);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlParameterCollection&lt;/span&gt; parameters = myCommand.Parameters;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;SqlDbType&lt;/span&gt;.VarChar, 50);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;SqlDbType&lt;/span&gt;.VarChar, 50);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;SqlDbType&lt;/span&gt;.DateTime);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;SqlDbType&lt;/span&gt;.Int);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (ListItem item &lt;span style="color: blue;"&gt;in&lt;/span&gt; myList)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters[&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;].Value = item.FirstName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters[&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;].Value = item.LastName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters[&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;].Value = item.DateOfBirth;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters[&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;].Value = item.ChildCount;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCommand.ExecuteNonQuery();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (@FirstName, @LastName, @DateOfBirth, @ChildCount)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myCommand &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlCommand(sql, myConnection)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;With&lt;/span&gt; myCommand.Parameters&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;, SqlDbType.VarChar, 50)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;, SqlDbType.VarChar, 50)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;, SqlDbType.DateTime)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;, SqlDbType.Int)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; item &lt;span style="color: blue;"&gt;As&lt;/span&gt; ListItem &lt;span style="color: blue;"&gt;In&lt;/span&gt; myList&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Item(&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;).Value = item.FirstName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Item(&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;).Value = item.LastName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Item(&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;).Value = item.DateOfBirth&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Item(&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;).Value = item.ChildCount&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; myCommand.ExecuteNonQuery()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The parameters are created and added to the command once only and then their Value properties are set each time new values are needed.  The data source-specific data types of the parameters are specified when they are created because they cannot be inferred.  Finally, the size is also specified for those parameters whose type requires it.  Scale and precision can also be set if required.&lt;/p&gt;&lt;p&gt;There is another way to set parameter values also.  Using a DataAdapter you might save data directly from a DataTable.  In that case you won’t be looping through the records and setting parameter values yourself.  It still needs to be done but the DataAdapter will do it for you.  In that case though, you need to tell it exactly where to get the value for each parameter.  You do this by specifying the SourceColumn of each parameter, which is the name of the column from which the parameter’s Value will be taken for each DataRow.&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (@FirstName, @LastName, @DateOfBirth, @ChildCount)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt; myCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt;(sql);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlParameterCollection&lt;/span&gt; parameters = myCommand.Parameters;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;SqlDbType&lt;/span&gt;.VarChar, 50, &lt;span style="color: #a31515;"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;SqlDbType&lt;/span&gt;.VarChar, 50, &lt;span style="color: #a31515;"&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;SqlDbType&lt;/span&gt;.DateTime, 0, &lt;span style="color: #a31515;"&gt;&amp;quot;DateOfBirth&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;SqlDbType&lt;/span&gt;.Int, 0, &lt;span style="color: #a31515;"&gt;&amp;quot;ChildCount&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;SqlDataAdapter&lt;/span&gt; myAdapter = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlDataAdapter&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;myAdapter.InsertCommand = myCommand;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (@FirstName, @LastName, @DateOfBirth, @ChildCount)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myCommand &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlCommand(sql)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;With&lt;/span&gt; myCommand.Parameters&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;, SqlDbType.VarChar, 50, &lt;span style="color: #a31515;"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;, SqlDbType.VarChar, 50, &lt;span style="color: #a31515;"&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;, SqlDbType.DateTime, 0, &lt;span style="color: #a31515;"&gt;&amp;quot;DateOfBirth&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .Add(&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;, SqlDbType.Int, 0, &lt;span style="color: #a31515;"&gt;&amp;quot;ChildCount&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myAdapter &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlDataAdapter&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;myAdapter.InsertCommand = myCommand&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;In this case the fourth parameter of the Add method is the parameter’s SourceColumn.  Note that this is the name of a DataColumn in the DataTable that will be passed to the DataAdapter’s Update method, i.e. it is the name of the column the data is coming from, not the name of the column in the database the data is going to.  In the majority of cases those two column names will be the same but certainly not in all.&lt;/p&gt;&lt;p&gt;It’s also important to note that, if we are passing a fourth argument to the Add method, we must be passing a third argument too.  That third argument is the maximum size of the data.  For variable-size data types, like VarChar, this value is important but for fixed-size data types, like Int, it is not.  If you know the specific size of a fixed-size data type, e.g. 4 bytes for type Int, then you can specify that value but there’s really no need.  All values of a fixed-size data type will be the same size so there’s no need to specify the maximum size.  As such you can just pass zero for fixed-size data types.&lt;/p&gt;&lt;p&gt;Now, let’s look at how using parameters differs amongst ADO.NET providers and data sources.  First up, let’s look using OleDb and an Access database.  The code should look almost exactly the same, except using OleDb classes instead of SqlClient classes.&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (@FirstName, @LastName, @DateOfBirth, @ChildCount)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;OleDbCommand&lt;/span&gt; myCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OleDbCommand&lt;/span&gt;(sql);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;OleDbParameterCollection&lt;/span&gt; parameters = myCommand.Parameters;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameField.Text);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameField.Text);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dateOfBirthPicker.Value.Date);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.childrenSpinner.Value));&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (@FirstName, @LastName, @DateOfBirth, @ChildCount)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myCommand &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; OleDbCommand(sql)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;With&lt;/span&gt; myCommand.Parameters&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameField.Text)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameField.Text)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.dateOfBirthPicker.Value.Date)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;@ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;CInt&lt;/span&gt;(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.childrenSpinner.Value))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;It’s important to understand that there’s a subtle difference in the way the code behaves though.  As I said earlier, SqlClient supports named parameters.  That is to say that when you add each parameter to a SqlCommand its name is used as a key to identify it.  When it comes time to insert the values into the SQL code, every instance of that name is replaced with the value of the parameter with that name.  Even though the code in the preceding example uses the same parameter names in the SQL code and the same names when adding the parameters, those names are not actually related.&lt;/p&gt;&lt;p&gt;The Jet OLEDB provider uses the position of each parameter to decide what values to substitute into the SQL code.  All the parameter names in the SQL code are numbered and all the parameters added to the OleDbCommand are numbered.  Values are then substituted based on those positions, whether or not the names match.  This leads to two important considerations when using OleDb and Access.  Firstly, while it makes no difference what order the parameters are added to a SqlCommand, you must ensure that parameters are added to an OleDbCommand in the order they appear in the SQL code.  Secondly, while the value of a single SqlParameter can be substituted into SQL code as many times as required, even if the same value is to be used more than once in an OleDbCommand, you must add a discrete parameter for each place it will be used.&lt;/p&gt;&lt;p&gt;Next, let’s look at using OleDb with a SQL Server database.  This should rarely be done, given that SqlClient provides more features and better performance, but there may be occasions where it’s necessary.  Like the Jet OLEDB provider, the SQL Server OLEDB provider supports only positional parameters.  Unlike the Jet provider though, it also doesn’t support pseudo-names for the parameters in the SQL code.  In this case you must use “?” symbols in the code to represent a parameter.&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (?, ?, ?, ?)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;OleDbCommand&lt;/span&gt; myCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OleDbCommand&lt;/span&gt;(sql);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;OleDbParameterCollection&lt;/span&gt; parameters = myCommand.Parameters;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameField.Text);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameField.Text);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dateOfBirthPicker.Value.Date);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.childrenSpinner.Value));&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (?, ?, ?, ?)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myCommand &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; OleDbCommand(sql)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;With&lt;/span&gt; myCommand.Parameters&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameField.Text)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameField.Text)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.dateOfBirthPicker.Value.Date)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;CInt&lt;/span&gt;(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.childrenSpinner.Value))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The Jet OLEDB provider also supports this notation, as do many others.&lt;/p&gt;&lt;p&gt;There are various other ADO.NET providers that support named parameters however.  One such example is the Connector/Net provider available for MySQL.  It supports a similar notation to the SqlClient provider except that parameter names must be prefixed with “?” instead of “@”.&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (?FirstName, ?LastName, ?DateOfBirth, ?ChildCount)&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;MySqlCommand&lt;/span&gt; myCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MySqlCommand&lt;/span&gt;(sql);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;MySqlParameterCollection&lt;/span&gt; parameters = myCommand.Parameters;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;?FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.firstNameField.Text);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;?LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.lastNameField.Text);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;?DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dateOfBirthPicker.Value.Date);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;parameters.AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;?ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.childrenSpinner.Value));&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;&amp;quot;INSERT INTO User (FirstName, LastName, DateOfBirth, ChildCount) &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;VALUES (?FirstName, ?LastName, ?DateOfBirth, ?ChildCount)&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myCommand &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; MySqlCommand(sql)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;With&lt;/span&gt; myCommand.Parameters&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;?FirstName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.firstNameField.Text)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;?LastName&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.lastNameField.Text)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;?DateOfBirth&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.dateOfBirthPicker.Value.Date)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; .AddWithValue(&lt;span style="color: #a31515;"&gt;&amp;quot;?ChildCount&amp;quot;&lt;/span&gt;, &lt;span style="color: blue;"&gt;CInt&lt;/span&gt;(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.childrenSpinner.Value))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;You should check the documentation for other providers and data sources to see what notation they support.&lt;/p&gt;&lt;p&gt;I should also point out that the use of parameters is no different when using stored procedures.  Whether your CommandType is Text or StoredProcedure, if your SQL code contains parameters then you add them to your command in exactly the same way.&lt;/p&gt;&lt;p&gt;Finally, let’s look at one of the most important reasons to use parameters in the first place: security.  When you use string concatenation to build SQL statements you can insert anything into the code at any position.  You may intend to insert just a single value but, if the data is provided by the user, it’s often difficult or impossible to ensure that that’s all you’re getting.  This can allow malicious users to perform what’s called “SQL injection”, where they inject a chunk of SQL code into your statement where you intended to use only a value.  For example, let’s consider a situation where you want to allow the user to search for an employee record by payroll number:&lt;/p&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #a31515;"&gt;&amp;quot;SELECT * &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;FROM Employee &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;WHERE PayrollNumber = '&amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.payrollNumberField.Text +&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;'&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; sql &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;&amp;quot;SELECT * &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;FROM Employee &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;WHERE PayrollNumber = '&amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.payrollNumberField.Text &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;In that case you expect the user to enter a payroll number and the system will find the matching record if such a record exists.  For instance, if the user enters the value “12345” then the SQL statement that will eventually be executed will be:&lt;/p&gt;&lt;pre&gt;SELECT * FROM Employee WHERE PayrollNumber = ‘12345’&lt;/pre&gt;&lt;p&gt;That’s exactly as you intended, but what happens if a malicious user enters the value “12345’; DELETE FROM Employee; SELECT * FROM Employee WHERE PayrollNumber = ‘12345”?  The actual SQL code that eventually gets executed will be:&lt;/p&gt;&lt;pre&gt;SELECT * FROM Employee WHERE PayrollNumber = ‘12345’&lt;br /&gt;DELETE FROM Employee&lt;br /&gt;SELECT * FROM Employee WHERE PayrollNumber = ‘12345’&lt;/pre&gt;&lt;p&gt;Congratulations, you just deleted the entire contents of your Employee table.  By using a parameter to insert the payroll number you ensure that whatever the user enters gets treated as a value and cannot be interpreted as SQL code.&lt;/p&gt;&lt;p&gt;There will be situations where SQL injection will not be possible but you should still use parameters all the time.  Doing so helps you to avoid various issues and is just a good habit to get into.  If you always use parameters then you never have to decide whether you should or not and you can never make the wrong choice.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3064139338712255342-5445418881470095389?l=jmcilhinney.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/5445418881470095389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3064139338712255342&amp;postID=5445418881470095389' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/5445418881470095389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/5445418881470095389'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/2009/08/using-parameters-in-adonet.html' title='Using Parameters in ADO.NET'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-8327362076681187195</id><published>2009-08-07T23:51:00.006+10:00</published><updated>2010-04-02T18:56:43.630+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb.net'/><category scheme='http://www.blogger.com/atom/ns#' term='schema'/><category scheme='http://www.blogger.com/atom/ns#' term='ado.net'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='data access'/><title type='text'>Retrieving Database Schema Information</title><content type='html'>ADO.NET allows you to retrieve a great deal of schema information from a database without resorting to writing your own queries to access system tables.  There will be times you still need to write your own queries but the majority of commonly used schema information can be retrieved using the &lt;span style="font-style: italic;"&gt;GetSchema &lt;/span&gt;method of your connection object.&lt;br /&gt;&lt;br /&gt;Exactly what's available and the details of how to retrieve it may vary from database to database but the code pattern remains the same.  Note that &lt;span style="font-style: italic;"&gt;GetSchema &lt;/span&gt;is a member of the &lt;span style="font-style: italic;"&gt;DbConnection&lt;/span&gt; class, thus it is inherited and overridden in each class that is derived from &lt;span style="font-style: italic;"&gt;DbConnection&lt;/span&gt;, e.g. &lt;span style="font-style: italic;"&gt;SqlConnection &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;OleDbConnection&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;So, the first step to using the &lt;span style="font-style: italic;"&gt;GetSchema &lt;/span&gt;method is to determine what information your database and ADO.NET provider expose.  To do that you call the overload of &lt;span style="font-style: italic;"&gt;GetSchema &lt;/span&gt;that takes no arguments.  I’ll use the &lt;span style="font-style: italic;"&gt;SqlClient &lt;/span&gt;provider for these examples but, as I said, the pattern is the same no matter the provider and no matter the database.  Start by creating a new Windows Forms Application project and adding a &lt;span style="font-style: italic;"&gt;DataGridView &lt;/span&gt;to your form.  In the form’s &lt;span style="font-style: italic;"&gt;Load &lt;/span&gt;event handler, add the following code:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt; connection = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt;(connectionString))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dataGridView1.DataSource = connection.GetSchema();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Using&lt;/span&gt; connection &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlConnection(connectionString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = connection.GetSchema()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Using&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Note that you’ll have to provide your own connection string as appropriate for your database.  When you run that project you should see your grid populated with information about the schema collections available.  Let’s look at each column of that grid.&lt;br /&gt;&lt;br /&gt;The first column is named “CollectionName” and it contains values such as “Tables”, “Views” and “Procedures”.  Not surprisingly, those collections provide information about the tables, views and procedures in the database.  When calling one of the overloads of &lt;span style="font-style: italic;"&gt;GetSchema &lt;/span&gt;with parameters, the first argument must be one of the collection names from that column.&lt;br /&gt;&lt;br /&gt;The second column is named “NumberOfRestrictions”.  A restriction is basically a filter for a collection that you can specify to reduce the amount of information returned.  For instance, many collections can be filtered by name of the schema they belong to, e.g. “dbo”.  Note that one of the collections you can query is named “Restrictions” and it will give you information about the restrictions available for each collection.  When calling the overload of &lt;span style="font-style: italic;"&gt;GetSchema &lt;/span&gt;with two parameters, the second parameter must be an array of restriction values.  We’ll look at restrictions more closely later.&lt;br /&gt;&lt;br /&gt;The third column is named “NumberOfIdentifierParts”.  It contains the number of columns required to uniquely identify a record in each collection.&lt;br /&gt;&lt;br /&gt;Let’s look at getting information from a specific collection.  One of the most commonly queried collections is Tables, so let’s take a look at that.  Viewing the data in our grid after executing the previous code, we can see that the Tables collection has 4 restrictions and 3 identifier parts.  Store that information away for future use.  For now, edit the code in your form to get the schema for the Tables collection specifically:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt; connection = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt;(connectionString))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Using&lt;/span&gt; connection &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlConnection(connectionString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Using&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Note that, as mentioned earlier, the first argument to &lt;span style="font-style: italic;"&gt;GetSchema &lt;/span&gt;is the name of the collection you want to query.  Executing that code populates our grid with information about all the tables in the database we’re connected to.  The columns are named “TABLE_CATALOG”, “TABLE_SCHEMA”, “TABLE_NAME” and “TABLE_TYPE” and they contain the name of the database containing the table, the name of the schema that owns the table, the name of the table and the type of the table respectively.&lt;br /&gt;&lt;br /&gt;Looking at the data, consider what would be required to uniquely identify a record.  Recall that the NumberOfIdentifierParts for the Tables collection was 3.  Those three identifier parts are the TABLE_CATALOG, TABLE_SCHEMA and TABLE_NAME, all required to uniquely identify a table within a server instance.&lt;br /&gt;&lt;br /&gt;Now let’s look at the Restrictions collection, the contents of which are important when querying many other collections.  Edit your code once again to query the Restrictions collection:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt; connection = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt;(connectionString))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Restrictions&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Using&lt;/span&gt; connection &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlConnection(connectionString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Restrictions&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Using&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Having executed that code, we see our grid populated with information about all the restrictions that can be applied to schema queries.  The first column is named “CollectionName” and contains the name of the collection that the restriction applies to.  Note that there are four rows containing the collection name “Tables” and recall that the NumberOfRestrictions for the Tables collection was 4.&lt;br /&gt;&lt;br /&gt;The restrictions for the Tables collection are named “Catalog”, “Owner”, “Table” and “TableType” with RestrictionOrder values of 1, 2, 3 and 4 respectively.  Those restrictions relate to the TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME and TABLE_TYPE columns of the Tables collection respectively.&lt;br /&gt;&lt;br /&gt;Let’s say that we want to filter the Tables collection by database.  When viewing the contents of the Restrictions collection you should have noticed that the restriction named “Catalog” had a RestrictionOrder of 1, meaning that that must be the first filter value we provide.  Try changing the previous code to specify the Tables collection and an array of strings containing the name of the database you’re connected to as the value for the first restriction.  For instance, if you don’t specify an Initial Catalog in your &lt;span style="font-style: italic;"&gt;SqlClient &lt;/span&gt;connection string then you’ll be connected to the “master” database.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt; connection = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt;(connectionString))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;[]&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;master&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;null&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;null&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Using&lt;/span&gt; connection &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlConnection(connectionString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;() {&lt;span style="color: #a31515;"&gt;&amp;quot;master&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&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; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&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; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&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; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;})&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Using&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Note that a null reference is passed for each restriction that is not to be used.  Restriction values must be provided in the order specified by the Restrictions collection.  As such, a value must be specified for each restriction up to and including the last one you want to use.  Any after that can be omitted if desired though.  That means that the above code could be rewritten as:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt; connection = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt;(connectionString))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;[] {&lt;span style="color: #a31515;"&gt;&amp;quot;master&amp;quot;&lt;/span&gt;});&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Using&lt;/span&gt; connection &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlConnection(connectionString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;() {&lt;span style="color: #a31515;"&gt;&amp;quot;master&amp;quot;&lt;/span&gt;})&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Using&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Now, let’s say that we wanted to filter the Tables collection by TABLE_NAME, perhaps to check whether a specific table exists.  The Table restriction has a RestrictionOrder of 3 so, to filter by TABLE_NAME, we must provide at least three restriction values.  If we don’t want to filter by TABLE_CATALOG and TABLE_SCHEMA then we simply provide null references for those restrictions.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt; connection = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt;(connectionString))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.dataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;[]&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;null&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;null&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;SomeTable&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Using&lt;/span&gt; connection &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlConnection(connectionString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;New&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;() {&lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&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; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&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; &lt;span style="color: #a31515;"&gt;&amp;quot;SomeTable&amp;quot;&lt;/span&gt;})&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Using&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Run that code and the grid will contain only information about the table with the specified name.&lt;br /&gt;&lt;br /&gt;Because the &lt;span style="font-style: italic;"&gt;GetSchema &lt;/span&gt;method returns a &lt;span style="font-style: italic;"&gt;DataTable&lt;/span&gt;, as I’ve shown, the result can be bound very simply, just like any other &lt;span style="font-style: italic;"&gt;DataTable&lt;/span&gt;.  An example of how it might be commonly used is to display a list of tables in a &lt;span style="font-style: italic;"&gt;ComboBox&lt;/span&gt;.  You could query the Tables collection using the &lt;span style="font-style: italic;"&gt;GetSchema &lt;/span&gt;method and then display the TABLE_NAME values in the drop-down list.&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt; connection = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt;(connectionString))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.comboBox1.ValueMember = &lt;span style="color: #a31515;"&gt;&amp;quot;TABLE_NAME&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.comboBox1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Using&lt;/span&gt; connection &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SqlConnection(connectionString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ComboBox1.ValueMember = &lt;span style="color: #a31515;"&gt;&amp;quot;TABLE_NAME&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ComboBox1.DataSource = connection.GetSchema(&lt;span style="color: #a31515;"&gt;&amp;quot;Tables&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Using&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;I’m sure that, given time, you’ll be able to find other uses for the &lt;span style="font-style: italic;"&gt;GetSchema&lt;/span&gt; method too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3064139338712255342-8327362076681187195?l=jmcilhinney.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/8327362076681187195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3064139338712255342&amp;postID=8327362076681187195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/8327362076681187195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/8327362076681187195'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/2009/08/retrieving-database-schema-information.html' title='Retrieving Database Schema Information'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-4401155866531728856</id><published>2009-08-03T17:19:00.009+10:00</published><updated>2009-11-29T19:24:38.935+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb.net'/><category scheme='http://www.blogger.com/atom/ns#' term='messagebox.show'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='yesno'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><category scheme='http://www.blogger.com/atom/ns#' term='okcancel'/><category scheme='http://www.blogger.com/atom/ns#' term='messageboxbuttons'/><title type='text'>Using Yes/No or OK/Cancel Buttons</title><content type='html'>I see a great many people mistakenly using MessageBoxButtons.YesNo buttons when they are prompting the user for confirmation.  In that case you should be using MessageBoxButtons.OKCancel buttons.  Think of it like this: if the user asked you to do something and you're asking for confirmation then you should always use OKCancel.&lt;br /&gt;&lt;br /&gt;To show the difference, consider the situation where the user closes a form with unsaved changes pending.  You might use the following code to prompt the user to either close the form and lose the changes or keep the form open:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515;"&gt;&amp;quot;Are you sure you want to close?&amp;nbsp; &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;If you do so will lose any pending changes&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;Confirm Close&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #2b91af;"&gt;MessageBoxButtons&lt;/span&gt;.YesNo,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #2b91af;"&gt;MessageBoxIcon&lt;/span&gt;.Warning) == &lt;span style="color: #2b91af;"&gt;DialogResult&lt;/span&gt;.No)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Cancel close here.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;If&lt;/span&gt; MessageBox.Show(&lt;span style="color: #a31515;"&gt;&amp;quot;Are you sure you want to close?&amp;nbsp; &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;If you do so you will lose any pending changes&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;Confirm Close&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; MessageBoxButtons.YesNo, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; MessageBoxIcon.Warning) = Windows.Forms.DialogResult.No &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Cancel close here.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;That would be incorrect though.  The correct code would be:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515;"&gt;&amp;quot;Are you sure you want to close?&amp;nbsp; &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;If you do so will lose any pending changes&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;Confirm Close&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #2b91af;"&gt;MessageBoxButtons&lt;/span&gt;.OKCancel,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #2b91af;"&gt;MessageBoxIcon&lt;/span&gt;.Warning) == &lt;span style="color: #2b91af;"&gt;DialogResult&lt;/span&gt;.Cancel)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Cancel close here.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;If&lt;/span&gt; MessageBox.Show(&lt;span style="color: #a31515;"&gt;&amp;quot;Are you sure you want to close?&amp;nbsp; &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;If you do so you will lose any pending changes&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;Confirm Close&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; MessageBoxButtons.OKCancel, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Cancel &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Cancel close here.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;To see why, consider what would happen if you wanted to expand the choices and prompt the user to either save and close, close without saving or not close at all.  In that case you'd use this code:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;switch&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515;"&gt;&amp;quot;Are you sure you want to close?&amp;nbsp; &amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;If you do so will lose any pending changes&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #a31515;"&gt;&amp;quot;Confirm Close&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #2b91af;"&gt;MessageBoxButtons&lt;/span&gt;.YesNoCancel,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: #2b91af;"&gt;MessageBoxIcon&lt;/span&gt;.Warning))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DialogResult&lt;/span&gt;.Yes:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Save changes and allow close.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DialogResult&lt;/span&gt;.No:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Allow close.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DialogResult&lt;/span&gt;.Cancel:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Cancel close here.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Select&lt;/span&gt; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; MessageBox.Show(&lt;span style="color: #a31515;"&gt;&amp;quot;Are you sure you want to close?&amp;nbsp; &amp;quot;&lt;/span&gt; &amp;amp; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;If you do so you will lose any pending changes&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;&amp;quot;Confirm Close&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; MessageBoxButtons.YesNoCancel, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; MessageBoxIcon.Warning)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; Windows.Forms.DialogResult.Yes&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Save changes and allow close.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; Windows.Forms.DialogResult.No&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Allow close.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Case&lt;/span&gt; Windows.Forms.DialogResult.Cancel&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Cancel close here.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Select&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;Comparing that to the first code example, notice that the meanings of the Yes and No buttons have now changed.  Previously Yes meant close without saving and now it means save and close.  Previously No meant don't close and now it means close without saving, which is what Yes meant before.  Now Cancel means don't close, which is what No meant before.  Do you see the inconsistency?&lt;br /&gt;&lt;br /&gt;Now, consider the third case compared to the second.  Previously Cancel meant don't close and it still does.  Previously the OK option meant close and now it has been replaced by two new options, Yes and No, both of which still  mean close but add the option of either saving first or not saving.&lt;br /&gt;&lt;br /&gt;To generalise, if you are asking the user "do you really want to do what you just asked for" then you use an OK button and if you're asking "would you rather not do what you just asked for" then you use a Cancel button, hence MessageBoxButtons.OKCancel is the correct choice when asking for straight confirmation.  When you want to break that first question into two: "do you want to do what you asked for and do this extra thing as well" and "do you want to do just what you asked and not anything extra", then you would use MessageBoxButtons.YesNoCancel.  There are plenty of situations where the use of MessageBoxButtons.YesNo is appropriate but confirming an action is not one of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3064139338712255342-4401155866531728856?l=jmcilhinney.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/4401155866531728856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3064139338712255342&amp;postID=4401155866531728856' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/4401155866531728856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/4401155866531728856'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/2009/08/using-yesno-or-okcancel-buttons.html' title='Using Yes/No or OK/Cancel Buttons'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-6770690694916798745</id><published>2009-07-26T01:58:00.010+10:00</published><updated>2010-04-02T18:34:53.280+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb.net'/><category scheme='http://www.blogger.com/atom/ns#' term='default instances'/><category scheme='http://www.blogger.com/atom/ns#' term='windows forms'/><category scheme='http://www.blogger.com/atom/ns#' term='.net development'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><title type='text'>VB.NET Default Form Instances</title><content type='html'>&lt;span style="font-weight: bold;"&gt;What is a default form instance?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;VB.NET is a fully object oriented language so, as such, basically everything you use is an object.  Each object is an instance of its type, e.g. a &lt;span style="font-style: italic;"&gt;String&lt;/span&gt; object is an instance of the &lt;span style="font-style: italic;"&gt;String&lt;/span&gt; class.  Creating an instance of a type is also known as instantiating that type.  When dealing with classes, with the exception of the &lt;span style="font-style: italic;"&gt;String &lt;/span&gt;class, the only way to instatntiate a type is to invoke a constructor, which is done with the &lt;span style="font-style: italic;"&gt;New &lt;/span&gt;keyword:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; someVariable &lt;span style="color: blue;"&gt;As&lt;/span&gt; SomeType = &lt;span style="color: blue;"&gt;New&lt;/span&gt; SomeType&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;That code declares a variable whose type is &lt;span style="font-style: italic;"&gt;SomeType&lt;/span&gt;, creates an instance of the &lt;span style="font-style: italic;"&gt;SomeType&lt;/span&gt; type and then assigns the object to the variable.  VB.NET also supports the following abbreviated syntax, which is functionally equivalent:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; someVariable &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SomeType&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;In your code, you may use various means to get new objects, e.g. some classes may have a &lt;span style="font-style: italic;"&gt;Create &lt;/span&gt;method that returns a new instance, but all such methods will be using constructors internally.  Forms are a special case in VB.NET as of VB 2005, which introduced the concept of default instances.&lt;br /&gt;&lt;br /&gt;Every time you add a new form to your project you are creating a new class that inherits the &lt;span style="font-style: italic;"&gt;System.Windows.Forms.Form&lt;/span&gt; class.  Like other classes, forms have constructors and you can create an instance by invoking a constructor, but you can also use the class’s default instance.  The default instance is an object of that type that the VB application framework creates and manages for you.  For instance, conventionally you would do this to show a form:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myForm &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SomeForm&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;myForm.Show()&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;If you use the default instance then you don’t need to invoke a constructor explicitly.  You simply access the default instance directly via the My.Forms object:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;My&lt;/span&gt;.Forms.SomeForm.Show()&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;or just using the class name:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;SomeForm.Show()&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;It should be noted that, once compiled, this code will still cause a constructor to be invoked in order to create the default instance.  The significance of this will be explained later.&lt;br /&gt;&lt;br /&gt;One of the main goals of VB has always been to provide power while make programming as easy as possible for as many people as possible.  The introduction of default form instances is in furtherance of that goal.  Many people new to OOP use objects in VB.NET but they don’t really comprehend them properly.  As such, they can have a great deal of difficulty dealing with forms as objects and making forms interact with each other.  This is also true of some more-experienced VB6 developers who have made the move to VB.NET. VB.NET default instances behave like VB6 default instances so they feel familiar to VB6 developers making the move to VB.NET.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;When should you use default instances?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you’re going to use default instances at all then you should use them pretty much all the time.  I’ll qualify that statement later but, for the moment, let’s say that you should use them all the time or not at all.&lt;br /&gt;&lt;br /&gt;One important point to note is that, if you leave the application framework enabled when you create a Windows Forms Application project, your startup form is the default instance of its type.  If you don’t know what the application framework is then you can safely assume that it’s enabled and not worry about it.&lt;br /&gt;&lt;br /&gt;The fact that your startup form is a default instance is quite useful.  For instance, let’s say that you are displaying multiple records in a &lt;span style="font-style: italic;"&gt;DataGridView &lt;/span&gt;in the main form and you open a new form for the user to edit one of those records.  Once the editing is done, you want to update the main form with the new data before closing the dialogue.  How do you do it?  This is the sort of thing that causes great confusion to those new to OOP and VB.NET.  In .NET OO terms, the dialogue needs a reference to the main form in order to update it.  Providing that reference is actually not too difficult but the mechanism is not immediately obvious to many.  With default instances it’s easy.  The dialogue form can access the default instance of the main form’s type using the class name, so it can access the main form, e.g.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; okButton_Click(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventArgs) &lt;span style="color: blue;"&gt;Handles&lt;/span&gt; okButton.Click&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;With&lt;/span&gt; Form1.DataGridView1.CurrentRow.Cells&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Item(0).Value = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.TextBox1.Text&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .Item(1).Value = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.TextBox2.Text&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;With&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.Close()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;In this case, when the user clicks the OK button, the dialogue will directly access the grid on the main form and update the cells of the current row.&lt;br /&gt;&lt;br /&gt;Another example of where default instances are helpful is in a multiple-document interface (MDI) application.  The child forms in an MDI application are not inherently aware of each other.  Let’s say that your MDI application consists of a parent form and two child forms.  Let’s say that making a change on one child form needs to cause a change on the other child form.  If the children don’t inherently know about each other, how can this be done?  The answer is, again, that the first child form simply references the default instance of the second child form’s type via the class name.  This will allow changes to be made to the second child form, assuming that it is the default instance of its type.&lt;br /&gt;&lt;br /&gt;That last sentence touches on an important point and a source of confusion for some.  There’s no point updating the default instance of a form class if you haven’t actually displayed the default instance of that class in the first place.  This is one of the reasons I say that, if you’re going to use default instances at all, you should use them all the time.  For instance, if you create a form and display it like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; myForm &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; SomeForm&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;myForm.Show()&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;then you can’t then refer to the default instance of the &lt;span style="font-style: italic;"&gt;SomeForm &lt;/span&gt;class and expect the form on your screen to be affected.  You’ve created one instance and displayed that, then the system creates the default instance.  They are two different objects so making changes to one will not affect the other.  If you’re going to make changes by referring to the default instance then you need to have displayed the default instance in the first place:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;SomeForm.Show()&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Now, default instances don’t hold much appeal for the experienced VB.NET developer.  The situations I’ve used as examples up to now should never occur in a well-designed application.  For instance, the first example involves a dialogue updating a &lt;span style="font-style: italic;"&gt;DataGridView &lt;/span&gt;on the main form.  In a well-designed application the dialogue shouldn’t have to even know that the main form exists.  The dialogue should simply make the new data available via public properties and close.  The main form would then retrieve the data itself and update its own UI.  In the second example, where a change on one MDI child form causes a change in another child form, the child forms should, again, not have to have knowledge of each other.  In a well-designed application the first child would raise an event that can be handled by the parent form, which can then update the other child.  The parent form created both the children so it has to have knowledge of both, so it should have no problem accessing both.&lt;br /&gt;&lt;br /&gt;There is one situation though, where using the default instance can provide a small benefit to the experienced developer.  Because there is always one and only one default instance, they can be useful where you want your form to exhibit singleton-like behaviour.  For instance, let’s say that you have a menu item that is supposed to display a form.  If the form isn’t already open you want it to be displayed but, if it is already open, you want the existing form to receive focus.  Normally you would have to retain a reference to the form when you open it and then, when the menu items is clicked, you need to check whether there is an existing form and, if there is, whether it has already been disposed:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; toolWindow &lt;span style="color: blue;"&gt;As&lt;/span&gt; SomeForm&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OpenToolWindowToolStripMenuItem_Click(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&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; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventArgs) _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Handles&lt;/span&gt; OpenToolWindowToolStripMenuItem.Click&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.toolWindow &lt;span style="color: blue;"&gt;Is&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;OrElse&lt;/span&gt; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.toolWindow.IsDisposed &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'The tool window has not been opened or it has been opened and closed.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.toolWindow = &lt;span style="color: blue;"&gt;New&lt;/span&gt; SomeForm&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.toolWindow.Show()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Else&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'A Tool window is currently open.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.toolWindow.Activate()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Using the default instance, that code simplifies to this:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OpenToolWindowToolStripMenuItem_Click(&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;/pre&gt;&lt;pre style="margin: 0px;"&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;&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; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; EventArgs) _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Handles&lt;/span&gt; OpenToolWindowToolStripMenuItem.Click&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Make sure the tool window is displayed.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SomeForm.Show()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Make sure the tool window has focus.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SomeForm.Activate()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;That does neaten the code a bit, although it’s not a huge improvement, especially if you need to handle events of the form and/or access its methods and/or properties.  Personally, I’d just stick with the first style of code but it’s good to know your options.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;When can’t you use default instances?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I said earlier that, if you’re going to use default instances at all, you should use them all the time.  That is generally true but there are certain situations where you can’t use them.  For less experienced developers particularly, these situations will be very much in the minority and may not even be encountered at all in many projects, but it’s important to be aware of them.&lt;br /&gt;&lt;br /&gt;1.    You need to display multiple instances of the same form class simultaneously.&lt;br /&gt;&lt;br /&gt;An example of this would be an MDI application where multiple documents are opened at the same time, all using the same form class.  I said earlier that there is always one and only one default instance so, obviously, that presents a problem if you need multiple instances open simultaneously.  If you’re going to have to create one or more instances explicitly then you should create them all explicitly.  Consistency is a good thing and, if all instances are equivalent, they should be treated in exactly the same way.&lt;br /&gt;&lt;br /&gt;2.    You need to pass data to the form when you create it.&lt;br /&gt;&lt;br /&gt;When you access the default instance for the first time the system must create it and to do that it must invoke a constructor.  Specifically, it invokes the constructor that has no parameters.  If you want to create a form by invoking a constructor with parameters then you must do so explicitly.  It’s also worth noting that if you remove the parameterless constructor and leave only one or more constructors with parameters then your form class will have no default instance.  Trying to access it in that case will cause a compilation error.&lt;br /&gt;&lt;br /&gt;3.    You need to access a form from a secondary thread.&lt;br /&gt;&lt;br /&gt;In order to access a form from a secondary thread you generally need to test its InvokeRequired property and then call its Invoke method.  I said earlier that there is only ever one default instance of a form class.  That’s not strictly true.  In fact, default instances are thread-specific, so there is only ever one default instance per thread.  As such, if you test the InvokeRequired property of the default instance you will always be accessing the default instance for the current thread, not the one that was displayed on the main thread.&lt;br /&gt;&lt;br /&gt;While experienced .NET developers will probably never feel the need to use default instances, those new to OOP or VB.NET may find them useful.  They do have their pitfalls though so, like anything, it’s good to understand what you’re dealing with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3064139338712255342-6770690694916798745?l=jmcilhinney.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/6770690694916798745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3064139338712255342&amp;postID=6770690694916798745' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/6770690694916798745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/6770690694916798745'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/2009/07/vbnet-default-form-instances.html' title='VB.NET Default Form Instances'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-8391946589967134844</id><published>2009-07-06T22:09:00.005+10:00</published><updated>2010-04-02T18:07:50.020+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='factory'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='data access'/><title type='text'>Database-independent Data Access Layer</title><content type='html'>We all know that well-written applications separate the various areas of responsibility into multiple layers, right?  Generally speaking, the less each of those layers depend on specific functionality of the others the better.  One of those areas of responsibility that warrants separation is data access.  There are numerous tools about to generate data access code for you these days but, even if you're more of a roll-your-own kinda person, there's still help at hand.  ADO.NET provides the tools to write data access code that is independent of the underlying data source and it has done since version 2.0.&lt;br /&gt;&lt;br /&gt;The lynchpin of this functionality is the DbProviderFactory class.  It provides methods to generate instances of all the usual ADO.NET objects, e.g. connections, commands and data adapters, for any specific ADO.NET provider.&lt;br /&gt;&lt;br /&gt;Let’s start with a whirlwind tour of the System.Data and System.Data.Common namespaces.  Amongst other things, the System.Data namespace contains the interfaces that declare the set of functionality required by ADO.NET data access objects, e.g. IDataReader for all data readers and IDbConnection for all connections.  The System.Data.Common namespace contains classes that provide a basic concrete implementation of these interfaces, e.g. DbDataReader implements IDataReader and DbConnection implements IDbConnection.  Each data source-specific ADO.NET provider will then declare a set of classes that inherit those from System.Data.Common to provide a data source-specific set of functionality, e.g. SqlClient.SqlDataReader inherits DbDataReader and OleDb.OleDbConnection inherits DbConnection.&lt;br /&gt;&lt;br /&gt;The System.Data.Common namespace also includes the DbProviderFactory class, which provides an abstract implementation of an ADO.NET object factory.  Each data source-specific ADO.NET provider should inherit this class and provide its own data source-specific implementation, e.g. SqlClientFactory and OleDbFactory.  Third party ADO.NET providers can and should do the same thing, e.g. MySql.Data.MySqlClient.MySqlClientFactory.&lt;br /&gt;&lt;br /&gt;Now, ADO.NET factory classes are singletons.  Each concrete factory implementation will have a static/Shared Instance field that you can use to get the one and only instance of that type.  Doing so directly defeats the purpose somewhat though.  You will normally get a DbProviderFactory instance using the DbProviderFactories helper class, which is also a member of the System.Data.Common namespace.  The DbProviderFactories class includes two static/Shared methods: GetFactoryClasses will return a DataTable containing information about all ADO.NET factories available and GetFactory will return an instance of a specific ADO.NET factory class.&lt;br /&gt;&lt;br /&gt;To see how this works, try creating a new Windows Forms application, adding a DataGridView to the default form and then binding that grid to the result of the DbProviderFactories.GetFactoryClasses method:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.dataGridView1.DataSource = &lt;span style="color: #2b91af;"&gt;DbProviderFactories&lt;/span&gt;.GetFactoryClasses();&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.DataGridView1.DataSource = DbProviderFactories.GetFactoryClasses()&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;If you run that application you will see a row each for factories named “Odbc Data Provider”, “OleDb Data Provider”, “OracleClient Data Provider” and “SqlClient Data Provider”.  If you’ve installed Microsoft SQL Server CE then you’ll also see a row for a factory named “Microsoft SQL Server Compact Data Provider”.  If you’ve installed some third party data provider then you’ll see a row for that too.  For instance, if you’ve installed MySQL’s Connector/Net then you’ll see a row for a factory named “MySQL Data Provider”.  If you’ve installed Oracle’s ODAC then you’ll see a row for a factory named “Oracle Data Provider for .NET”.&lt;br /&gt;&lt;br /&gt;To get an appropriate instance of the DbProviderFactory class for your data source you would normally call the DbProviderFactories.GetFactory method.  You can pass that method either a DataRow from the DataTable returned by the GetFactoryClasses method or else one of the values from the InvariantName column of that table.  For instance, you could pass the string “System.Data.SqlClient” to the GetFactory method and it would return the value of the SqlClientFactory.Instance field.&lt;br /&gt;&lt;br /&gt;This provides us with two simple and logical ways to create an ADO.NET factory.  Firstly, we can call GetFactories and display the results to the user, e.g. in a ComboBox, for them to choose a provider:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.comboBox1.DisplayMember = &lt;span style="color: #a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.comboBox1.DataSource = &lt;span style="color: #2b91af;"&gt;DbProviderFactories&lt;/span&gt;.GetFactoryClasses();&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ComboBox1.DisplayMember = &lt;span style="color: #a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ComboBox1.DataSource = DbProviderFactories.GetFactoryClasses()&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;We can then call GetFactory and pass the row they selected as an argument:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;DataRow&lt;/span&gt; providerRow = ((&lt;span style="color: #2b91af;"&gt;DataRowView&lt;/span&gt;)&lt;span style="color: blue;"&gt;this&lt;/span&gt;.comboBox1.SelectedItem).Row;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;DbProviderFactory&lt;/span&gt; factory = &lt;span style="color: #2b91af;"&gt;DbProviderFactories&lt;/span&gt;.GetFactory(providerRow);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; providerRow &lt;span style="color: blue;"&gt;As&lt;/span&gt; DataRow = &lt;span style="color: blue;"&gt;DirectCast&lt;/span&gt;(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ComboBox1.SelectedItem, DataRowView).Row&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; factory &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbProviderFactory = DbProviderFactories.GetFactory(providerRow)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Alternatively, we can store the invariant name of our desired provider somewhere, e.g. in the config file, and pass that to GetFactory as an argument:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt; invariantName = Properties.&lt;span style="color: #2b91af;"&gt;Settings&lt;/span&gt;.Default.ProviderFactoryInvariantName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;DbProviderFactory&lt;/span&gt; factory = &lt;span style="color: #2b91af;"&gt;DbProviderFactories&lt;/span&gt;.GetFactory(invariantName);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; invariantName &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; = &lt;span style="color: blue;"&gt;My&lt;/span&gt;.Settings.ProviderFactoryInvariantName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; factory &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbProviderFactory = DbProviderFactories.GetFactory(invariantName)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;So, once we have our factory object, what do we do with it?  Well, we use it to create all our data access objects, including connections, commands, parameters, data adapters and more.  For instance, the following code might form part of your repository layer:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DbProviderFactory&lt;/span&gt; _factory;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ConnectionString { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; Repository(&lt;span style="color: blue;"&gt;string&lt;/span&gt; factoryName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._factory = &lt;span style="color: #2b91af;"&gt;DbProviderFactories&lt;/span&gt;.GetFactory(factoryName);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; Repository(&lt;span style="color: #2b91af;"&gt;DataRow&lt;/span&gt; factoryRow)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._factory = &lt;span style="color: #2b91af;"&gt;DbProviderFactories&lt;/span&gt;.GetFactory(factoryRow);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DbConnection&lt;/span&gt; GetConnection()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetConnection(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.ConnectionString);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DbConnection&lt;/span&gt; GetConnection(&lt;span style="color: blue;"&gt;string&lt;/span&gt; connectionString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DbConnection&lt;/span&gt; connection = &lt;span style="color: blue;"&gt;this&lt;/span&gt;._factory.CreateConnection();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.ConnectionString = connectionString;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; connection;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DbParameter&lt;/span&gt; GetParameter()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._factory.CreateParameter();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DbParameter&lt;/span&gt; GetParameter(&lt;span style="color: blue;"&gt;string&lt;/span&gt; parameterName,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;object&lt;/span&gt; value)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DbParameter&lt;/span&gt; parameter = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetParameter();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameter.ParameterName = parameterName;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameter.Value = value;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; parameter;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DbCommand&lt;/span&gt; GetCommand()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._factory.CreateCommand();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DbCommand&lt;/span&gt; GetCommand(&lt;span style="color: blue;"&gt;string&lt;/span&gt; commandText)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DbCommand&lt;/span&gt; command = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetCommand();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; command.CommandText = commandText;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; command;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DbCommand&lt;/span&gt; GetCommand(&lt;span style="color: blue;"&gt;string&lt;/span&gt; commandText,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IDictionary&lt;/span&gt; parameters)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DbCommand&lt;/span&gt; command = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetCommand(commandText);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt; parameterName &lt;span style="color: blue;"&gt;in&lt;/span&gt; parameters.Keys)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; command.Parameters.Add(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetParameter(parameterName,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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; parameters[parameterName]));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; command;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DataTable&lt;/span&gt; GetDataTable(&lt;span style="color: blue;"&gt;string&lt;/span&gt; procName,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IDictionary&lt;/span&gt; parameters)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DbCommand&lt;/span&gt; command = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetCommand(procName,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parameters);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DbConnection&lt;/span&gt; connection = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.GetConnection();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; command.Connection = connection;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; command.CommandType = &lt;span style="color: #2b91af;"&gt;CommandType&lt;/span&gt;.StoredProcedure;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DbDataReader&lt;/span&gt; reader = command.ExecuteReader(&lt;span style="color: #2b91af;"&gt;CommandBehavior&lt;/span&gt;.KeyInfo |&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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; &lt;span style="color: #2b91af;"&gt;CommandBehavior&lt;/span&gt;.CloseConnection);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DataTable&lt;/span&gt; table = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DataTable&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; table.Load(reader);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.Close();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; table;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;ReadOnly&lt;/span&gt; _factory &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbProviderFactory&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; _connectionString &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt; ConnectionString() &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._connectionString&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Get&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._connectionString = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Set&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Property&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; factoryName &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._factory = DbProviderFactories.GetFactory(factoryName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; factoryRow &lt;span style="color: blue;"&gt;As&lt;/span&gt; DataRow)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._factory = DbProviderFactories.GetFactory(factoryRow)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetConnection() &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbConnection&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetConnection(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.ConnectionString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetConnection(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; connectionString &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbConnection&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; connection &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbConnection = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._factory.CreateConnection()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.ConnectionString = connectionString&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; connection&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetParameter() &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbParameter&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._factory.CreateParameter()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetParameter(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; parameterName &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &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;As&lt;/span&gt; DbParameter&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; parameter &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbParameter = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetParameter()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameter.ParameterName = parameterName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameter.Value = value&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; parameter&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetCommand() &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbCommand&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;._factory.CreateCommand()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetCommand(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; commandText &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbCommand&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; command &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbCommand = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetCommand()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; command.CommandText = commandText&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; command&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetCommand( _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; commandText &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; parameters &lt;span style="color: blue;"&gt;As&lt;/span&gt; IDictionary(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;, &lt;span style="color: blue;"&gt;Object&lt;/span&gt;)) &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbCommand&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; command &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbCommand = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetCommand(commandText)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; parameterName &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt; &lt;span style="color: blue;"&gt;In&lt;/span&gt; parameters.Keys&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; command.Parameters.Add(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetParameter(parameterName, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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; parameters(parameterName)))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt; parameterName&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; command&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetDataTable( _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; procedureName &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; parameters &lt;span style="color: blue;"&gt;As&lt;/span&gt; IDictionary(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;, &lt;span style="color: blue;"&gt;Object&lt;/span&gt;)) &lt;span style="color: blue;"&gt;As&lt;/span&gt; DataTable&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; command &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbCommand = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetCommand(procedureName, parameters)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; connection &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbConnection = &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetConnection()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; command.Connection = connection&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; command.CommandType = CommandType.StoredProcedure&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.Open()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; reader &lt;span style="color: blue;"&gt;As&lt;/span&gt; DbDataReader = command.ExecuteReader(CommandBehavior.KeyInfo &lt;span style="color: blue;"&gt;Or&lt;/span&gt; _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&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;&amp;nbsp; &amp;nbsp;&amp;nbsp; CommandBehavior.CloseConnection)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; table &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; DataTable()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; table.Load(reader)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.Close()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; table&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;The GetDateTable method takes the name of a stored procedure and a dictionary of parameter values keyed on name as arguments.  It then invokes other methods that use the factory to create a connection and a command with parameters.  The DbProviderFactory class can also generate connection string builders, data adapters and command builders, so you can implement many other scenarios in a similar fashion.  In this way you can build up a complete data access layer with nary a reference to any specific data source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3064139338712255342-8391946589967134844?l=jmcilhinney.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jmcilhinney.blogspot.com/feeds/8391946589967134844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3064139338712255342&amp;postID=8391946589967134844' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/8391946589967134844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3064139338712255342/posts/default/8391946589967134844'/><link rel='alternate' type='text/html' href='http://jmcilhinney.blogspot.com/2009/07/database-independent-data-access-layer.html' title='Database-independent Data Access Layer'/><author><name>jmcilhinney</name><uri>http://www.blogger.com/profile/14563240967852089676</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3064139338712255342.post-7514266515845983429</id><published>2009-07-02T00:05:00.005+10:00</published><updated>2010-06-04T13:36:30.390+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb.net'/><category scheme='http://www.blogger.com/atom/ns#' term='collections'/><category scheme='http://www.blogger.com/atom/ns#' term='.net development'/><category scheme='http://www.blogger.com/atom/ns#' term='icomparable'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='comparison delegate'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><category scheme='http://www.blogger.com/atom/ns#' term='sorting'/><category scheme='http://www.blogger.com/atom/ns#' term='sort'/><category scheme='http://www.blogger.com/atom/ns#' term='arrays'/><category scheme='http://www.blogger.com/atom/ns#' term='icomparer'/><title type='text'>Sorting Arrays and Collections (Part 3)</title><content type='html'>&lt;a href="http://jmcilhinney.blogspot.com/2009/06/sorting-arrays-and-collections-part-1.html"&gt;Part 1 here&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jmcilhinney.blogspot.com/2009/07/sorting-arrays-and-collections-part-2.html"&gt;Part 2 here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In part 1 of this series we looked at using the &lt;span style="font-style: italic;"&gt;IComparable &lt;/span&gt;interface to provide sorting by allowing objects to compare themselves to each other.  In part 2 we looked at using the &lt;span style="font-style: italic;"&gt;IComparer &lt;/span&gt;interface to provide custom sorting through the external comparison of objects that may or may not be inherently comparable.  In this third and final part we look at using the &lt;span style="font-style: italic;"&gt;Comparison(T)&lt;/span&gt; delegate to provide similar functionality to the &lt;span style="font-style: italic;"&gt;IComparer &lt;/span&gt;interface but without the need to define a whole class.  The &lt;span style="font-style: italic;"&gt;Comparison&lt;/span&gt; delegate allows us to use a method declared anywhere to perform the comparisons.  Most often that would be in the same code file as we’re performing a one-off sort.&lt;br /&gt;&lt;br /&gt;The signature of the &lt;span style="font-style: italic;"&gt;Comparison&lt;/span&gt; delegate should put you in mind of the methods we’ve been using for comparisons already.  It takes two arguments of type &lt;span style="font-style: italic;"&gt;T &lt;/span&gt;and returns an &lt;span style="font-style: italic;"&gt;Int32 &lt;/span&gt;value that indicates their relative order.  That’s exactly the same as the &lt;span style="font-style: italic;"&gt;IComparer.Compare&lt;/span&gt; method.  Not surprisingly, the implementation of the method referred to by this delegate should be exactly the same as the implementation of an equivalent &lt;span style="font-style: italic;"&gt;IComparer.Compare&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;Going back to our example from part 2, where we were able to sort a list of &lt;span style="font-style: italic;"&gt;Person &lt;/span&gt;objects by both &lt;span style="font-style: italic;"&gt;LastName &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;FirstName&lt;/span&gt;, we can basically extract the implementations of the &lt;span style="font-style: italic;"&gt;CompareByFirstName &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;CompareByLastName &lt;/span&gt;methods.  Instead of declaring them in a separate class that implements the &lt;span style="font-style: italic;"&gt;IComparer &lt;/span&gt;interface we can declare them right there in the same class that contains the sorting code:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; ComparePeopleByFirstName(&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt; x, &lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt; y)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Compare by FirstName by default.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; result = x.FirstName.CompareTo(y.FirstName);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// If FirstNames are the same...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (result == 0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// ...compare by LastName.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = x.LastName.CompareTo(y.LastName);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; ComparePeopleByLastName(&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt; x, &lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt; y)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Compare by LastName by default.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; result = x.LastName.CompareTo(y.LastName);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// If LastNames are the same...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (result == 0)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// ...compare by FirstName.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = x.FirstName.CompareTo(y.FirstName);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; ComparePeopleByFirstName(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; x &lt;span style="color: blue;"&gt;As&lt;/span&gt; Person, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; y &lt;span style="color: blue;"&gt;As&lt;/span&gt; Person) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Compare by FirstName by default.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; result &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt; = x.FirstName.CompareTo(y.FirstName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'If FirstNames are the same...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; result = 0 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'...compare by LastName.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = x.LastName.CompareTo(y.LastName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; result&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; ComparePeopleByLastName(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; x &lt;span style="color: blue;"&gt;As&lt;/span&gt; Person, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; y &lt;span style="color: blue;"&gt;As&lt;/span&gt; Person) &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'Compare by LastName by default.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; result &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Integer&lt;/span&gt; = x.LastName.CompareTo(y.LastName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'If LastNames are the same...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; result = 0 &lt;span style="color: blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'...compare by FirstName.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = x.FirstName.CompareTo(y.FirstName)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; result&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;We can then create an instance of the &lt;span style="font-style: italic;"&gt;Comparison&lt;/span&gt; delegate that references one or other of those methods to sort by the appropriate properties:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&amp;gt; people = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;quot;Mary&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;Smith&amp;quot;&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;Williams&amp;quot;&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;Smith&amp;quot;&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;quot;Andrew&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;Baxter&amp;quot;&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;Before sorting:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt; person &lt;span style="color: blue;"&gt;in&lt;/span&gt; people)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;{0}, {1}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.LastName,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.FirstName));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Sort(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Comparison&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&amp;gt;(ComparePeopleByLastName));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;After sorting by LastName:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt; person &lt;span style="color: blue;"&gt;in&lt;/span&gt; people)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;{0}, {1}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.LastName,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.FirstName));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Sort(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Comparison&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt;&amp;gt;(ComparePeopleByFirstName));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;After sorting by FirstName:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Person&lt;/span&gt; person &lt;span style="color: blue;"&gt;in&lt;/span&gt; people)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;{0} {1}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.FirstName,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.LastName));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;VB&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; people &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; List(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; Person)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Add(&lt;span style="color: blue;"&gt;New&lt;/span&gt; Person(&lt;span style="color: #a31515;"&gt;&amp;quot;Mary&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;Smith&amp;quot;&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Add(&lt;span style="color: blue;"&gt;New&lt;/span&gt; Person(&lt;span style="color: #a31515;"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;Williams&amp;quot;&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Add(&lt;span style="color: blue;"&gt;New&lt;/span&gt; Person(&lt;span style="color: #a31515;"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;Smith&amp;quot;&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Add(&lt;span style="color: blue;"&gt;New&lt;/span&gt; Person(&lt;span style="color: #a31515;"&gt;&amp;quot;Andrew&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;&amp;quot;Baxter&amp;quot;&lt;/span&gt;))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Console.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;Before sorting:&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; person &lt;span style="color: blue;"&gt;As&lt;/span&gt; Person &lt;span style="color: blue;"&gt;In&lt;/span&gt; people&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;span style="color: blue;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;{0}, {1}&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.LastName, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.FirstName))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Sort(&lt;span style="color: blue;"&gt;New&lt;/span&gt; Comparison(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; Person)(&lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; ComparePeopleByLastName))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Console.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;After sorting by LastName:&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; person &lt;span style="color: blue;"&gt;As&lt;/span&gt; Person &lt;span style="color: blue;"&gt;In&lt;/span&gt; people&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;span style="color: blue;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;{0}, {1}&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.LastName, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.FirstName))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;people.Sort(&lt;span style="color: blue;"&gt;New&lt;/span&gt; Comparison(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; Person)(&lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; ComparePeopleByFirstName))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;Console.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;After sorting by FirstName:&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; person &lt;span style="color: blue;"&gt;As&lt;/span&gt; Person &lt;span style="color: blue;"&gt;In&lt;/span&gt; people&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;span style="color: blue;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;&amp;quot;{0} {1}&amp;quot;&lt;/span&gt;, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.FirstName, _&lt;/pre&gt;&lt;pre style="margin: 0px;"&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;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; person.LastName))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Removing the need to declare a whole new class makes the &lt;span style="font-style: italic;"&gt;Comparison&lt;/span&gt; delegate more convenient than the &lt;span style="font-style: italic;"&gt;IComparer &lt;/span&gt;interface in many cases, but it can be more convenient still if we employ anonymous methods or lambda expressions.&lt;br /&gt;&lt;br /&gt;C# 2.0 introduced the notion of anonymous methods.  Anonymous methods can be used to initialise a delegate just as a named method can.  If the code to perform our comparisons is relatively simple then using an anonymous method to create our &lt;span style="font-style: italic;"&gt;Comparison &lt;/span&gt;delegate is simpler than writing a separate named method.  Going back to our example from part 2, where we sorted strings by length instead of alphabetically, we could rewrite that code as follows:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt; strings = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;strings.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;The longest of all&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;strings.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;Short&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;strings.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;Even longer&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;strings.Add(&lt;span style="color: #a31515;"&gt;&amp;quot;Longer&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;Before sorting:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt; str &lt;span style="color: blue;"&gt;in&lt;/span&gt; strings)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(str);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;strings.Sort(&lt;span style="color: blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt; x,&lt;/pre&gt;&lt;pre style="margin: 0px;"&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; &lt;span style="color: blue;"&gt;string&lt;/span&gt; y)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; x.Length.CompareTo(y.Length);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;});&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;&amp;quot;After sorting:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt; str &lt;span style="color: blue;"&gt;in&lt;/span&gt; strings)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(str);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Our anonymous method has the appropriate signature to initialise a &lt;span style="font-style: italic;"&gt;Comparison&lt;string&gt;&lt;/string&gt;&lt;/span&gt; delegate, i.e. it has two parameters of type &lt;span style="font-style: italic;"&gt;string &lt;/span&gt;and a return type of &lt;span style="font-style: italic;"&gt;int&lt;/span&gt;, so the C# compiler accepts it and invokes the appropriate overload of the &lt;span style="font-style: italic;"&gt;Sort &lt;/span&gt;method.&lt;br /&gt;&lt;br /&gt;VB 8 has no equivalent to C# anonymous methods but both VB 9 and C# 3.0 introduced lambda expressions as a supporting feature for LINQ.  A lambda expression can be used to initialise a delegate in essentially the same way as an anonymous method:&lt;br /&gt;&lt;br /&gt;C#&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; strings = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt; {&lt;span style="color: #a31515;"&gt;&amp;quot;The longest of all&amp;quot;&l
