IntroductiontoAsp NET
IntroductiontoAsp NET
NET
            Introduction to
               ASP.NET
                      Objectives
                          •   Review the features and shortcomings of classic Active Server Pages.
                          •   Understand the advantages of an ASP.NET application.
                          •   Learn about server controls and events in ASP.NET.
                          •   Create a simple Web Service in ASP.NET.
An ASP Example
See Products-      Figure 1 shows the results of running a typical ASP application. Microsoft
ASP.asp            installs an ISAPI application with IIS that intercepts all requests for pages with
                   an extension of .asp.
                   These requests and the pages they point to are then handled within the ASP
                   run-time environment. This execution environment allows pages to contain
                   code in special script blocks delimited by <% and %> characters or contained
                   within <script> elements that include the attribute, runat=server. This script
                   performs whatever processing tasks are necessary to generate a custom HTML
                   page in response to the user’s request.
                      The ASP page in this example begins with a couple of script-related lines that
                      identify the language and specify that all variables will be explicitly declared:
                      The next lines are typical HTML that creates a title, defines an HTML form,
                      adds some text to the page, and begins a drop-down list box:
                      <html>
                      <head>
                      <title>Products-ASP</title>
                      </head>
                      <body>
                        <form action="Products-ASP.asp" method="post">
                           Select a Category:
                           <select name="Category">
                 <%
                      Dim cnn, cmd, rst
                      Set cnn=Server.CreateObject("ADODB.Connection")
                      ' Adjust user name and password, if necessary
                      cnn.Open "Provider=SQLOLEDB.1;Data Source=(local);" _
                           & "Initial Catalog=Northwind;User ID=sa;Password=;"
                      ' Open a read-only, forward-only, server-side recordset.
                      Set cmd=Server.CreateObject("ADODB.Command")
                      cmd.CommandText= _
                           "SELECT CategoryID, CategoryName FROM Categories" _
                           & " ORDER BY CategoryName;"
                      cmd.ActiveConnection=cnn
                      Set rst=cmd.Execute
                       •     The Request object is used to read data that was packaged inside the
                             HTTP request for the page.
                       •     The Application object is similar to the Session object, but its data is
                             shared across all client requests over the lifetime of the application,
                             and it also allows you to write code that runs automatically when the
                             applications starts or ends.
                      Getting back to our sample, the next lines of code use the ASP Response
                      object to inject HTML into the HTTP response being sent back to the browser.
                      The category ID from each row in the recordset is assigned as the value for
                      each row of the drop-down list box:
                      When the user clicks the button a postback occurs, and the drop-down list is
                      populated all over again. But you want the users to see the category when they
                      get the new page, which will also now show them the products in that
                      category. The remainder of this section of code ensures that the category
                      matching the one in the HTTP request will be selected in the new page, and it
                      also adds the category name as the text for each row in the drop-down list box:
                        </select>
                        <input type="submit" value="Show Products">
                 The rest of the page runs only during a postback, after the user selects a
                 category. When users first call up the page, only the drop-down box and the
                 button appear. After they pick a category and click the button, they get back a
                 list of all the products in that category, formatted as an HTML table. To
                 accomplish this, the ASP alternates between sections of code and sections of
                 literal HTML, building the table dynamically in response to the user’s request:
                      <%
                           ' Check if a category was selected.
                           If Len(Request("Category"))>0 Then
                             ' Create client-side, disconnected recordset
                             '      of products having the selected category.
                             Set rst = Server.CreateObject("ADODB.Recordset")
                             rst.CursorLocation=3 'adUseClient
                             rst.Open _
                                 "SELECT ProductID, ProductName, UnitsInStock" _
                                 & " FROM Products WHERE CategoryID=" _
                                 & Request("Category"), _
                                 cnn, 3, 1 'adOpenStatic, adLockReadOnly
                             Set rst.ActiveConnection = Nothing
                             cnn.Close
                             Set cnn = Nothing
                      %>
                             <table>
                                 <tr>
                                    <th>Product ID</th>
                                    <th>Product Name</th>
                                    <th>Units In Stock</th>
                                 </tr>
                      <%
                           ' Add a table row for each recordset row.
                             Do Until rst.EOF
                      %>
                                 <tr>
                                    <td> <% =rst("ProductID") %> </td>
                                    <td> <% =rst("ProductName") %> </td>
                                    <td> <% =rst("UnitsInStock") %> </td>
                                 </tr>
                      <%
                                  rst.MoveNext
                             Loop
                             rst.Close
                             Set rst = Nothing
                      %>
                             </table>
                 <%
                      End If
                      If Not cnn Is Nothing Then
                        cnn.Close
                        Set cnn=Nothing
                      End If
                 %>
                      </form>
                 </body>
                 </html>
                      <html>
                      <head>
                      <title>Products-ASP</title>
                      </head>
                      <body>
                        <form action="Products-ASP.asp" method="post">
                           Select a Category:
                           <select name="Category">
                      <option value="1">Beverages</option<option
                      value="2">Condiments</option><option
                      value="3">Confections</option><option value="4"
                      selected>Dairy Products</option><option
                      value="5">Grains/Cereals</option><option
                      value="6">Meat/Poultry</option><option
                      value="7">Produce</option><option
                      value="8">Seafood</option>
                           </select>
                           <input type="submit" value="Show Products">
                           <table>
                               <tr>
                                 <th>Product ID</th>
                                 <th>Product Name</th>
                                 <th>Units In Stock</th>
                               </tr>
                               <tr>
                                 <td> 11 </td>
                                 <td> Queso Cabrales </td>
                                 <td> 22 </td>
                               </tr>
                      (subsequent rows in the table omitted for brevity)
                                      </table>
                        </form>
                      </body>
                      </html>
                 In this simple example, the HTML delivered to the client is very simple, but
                 your ASP application can embed styles, graphics, hidden form controls, and
                 even client-side script, to create complex and full-featured Web pages.
                 ASP Shortcomings
                 As useful and successful as ASP has been, it suffers from several important
                 limitations that motivated the development of ASP.NET.
                 To overcome this limitation, many ASP developers have tried moving as much
                 logic as possible into COM automation components, such as ActiveX DLLs
                 created by Microsoft Visual Basic. Unfortunately, this practice results in one
                 very undesirable side effect: Once the DLL is loaded by ASP, it remains in
                 memory until the Web server is shut down, making it very hard to maintain
                 ASP applications without periodically bringing down the server.
                 Collaboration Is Difficult
                 Most Web development teams include two separate camps, which have
                 jokingly been referred to as the “black socks” and the “pony tails.” The nerdy
                 programmers in their black socks are responsible for writing code to fetch and
                 massage data, while the hip, pony-tailed designers are busy making the site
                 beautiful and interesting.
                 The way that ASP encourages the intermixing of code and HTML makes it
                 difficult for programmers and designers to collaborate on a page without
                 messing up each other’s work. To some extent, code can be segregated into
                 script blocks or encapsulated in COM objects, but some intermixing is
                 inevitable in most ASP projects, and this makes team development difficult.
                      ASP was created before this architecture became common, and its way of
                      maintaining session state makes it very hard to achieve optimal load balancing
                      across a cluster of servers. The reason for this is that session data is stored on
                      the server that processed the first request of the session. As multiple requests
                      come back from that user, those requests need to be routed to the server that
                      holds that session’s state.
                 to capture and reload their existing entries. In complex data entry pages, this
                 code can become quite extensive.
                 For an intranet site, you may be able to assume that all users have recent
                 versions of Internet Explorer, but for a public Internet site, you can’t make this
                 assumption. Unless you limit your pages to using only the basic HTML
                 features, you must write code to detect the user’s browser and alter the HTML
                 output accordingly. This creates a lot of extra work for ASP programmers who
                 need to support multiple browsers. Similarly, there is no support for mobile
                 devices, such as PDAs and phones.
                 When you need to replace a component of your ASP.NET application, you can
                 do so without bringing down the server. In fact, you can simply copy the new
                 file over the old oneASP.NET will continue to service any requests that
                 were using the old component until they are finished, and it will use the new
                 version to process all new requests. This is possible because the CLR allows
                 multiple versions of a component to coexist, even within the same process.
                 ASP.NET doesn’t completely eliminate the need for you to understand Web-
                 standard technologies, including HTML, XML, and CSS, in addition to your
                 programming language of choice. But you will find that ASP.NET does an
                 impressive job of bringing order to the world of Web development, with a
                 well-thought-out framework that encompasses all these technologies and
                 integrates them within a development environment that feels much more
                 productiveand, yes, more funthan what was previously available.
                      You can also use other .NET languages besides Visual Basic. The most
                      common alternative to Visual Basic is C#, a new language with C-based
                      syntax that is very similar to Java. All the features of ASP.NET are available
                      regardless of the language you use.
                 Try It Out!
                      1. Open Visual Studio and select File|New|Project, or press
                         CTRL+SHIFT+N. You’ll see the New Project dialog box shown in
                         Figure 2.
                      2. Name your new project TestProject and locate it in the virtual root
                         directory, http://localhost/ASPdotNET. A new subdirectory will
                         automatically be created for your new application.
                          5. If necessary, use the View menu to bring up the Toolbox. Select the
                             Web Forms category, and drag a TextBox, a Button, and a Label
                             onto your form.
                          6. Select the three controls by holding the SHIFT key down and clicking
                             on them, or by using the mouse pointer to click and drag a bounding
                             rectangle around them. Using the Format menu, select Align|Lefts,
                             Make Same Size|Width, and Vertical Spacing|Make Equal. Your
                             form should look like Figure 4.
                      7. Now, click on the HTML tab at the bottom of the form designer.
                         You’ll see the HTML that corresponds to the controls you created.
                         Add an instructional heading by entering this below the opening form
                         tag:
                           Notice that the closing tag is added for you automatically, and you get
                           IntelliSense support when you edit HTML, as shown in Figure 5.
                          8. Switch back to the Design pane, select the label, and use the Properties
                             window to delete the text. Select the button and change the Text
                             property to “Click Here.” You can switch back to the HTML pane to
                             see how these changes are immediately reflected in the HTMLyou
                             could have made the changes there initially, if you wanted to.
Figure 6. Visual Studio automatically creates a separate file for your code.
                           The code window shows you the contents of the code-behind file,
                           WebForm1.aspx.vb. Every Web form you create in ASP.NET has a
                           corresponding code file, which creates the class that ASP.NET uses to
                           render the page. To see the code files listed separately in the Solution
                           Explorer, click the Show All Files button at the top of the Solution
                           Explorer window, as shown in Figure 7. You can also choose
                           Project|Show All Files from the menu.
                      Figure 7. Click the Show All Files button to include code files in the Solution
                      Explorer.
                          10. Select File|Save All. Then, in the Solution Explorer window, right-
                              click on WebForm1.aspx, and choose Build and Browse. Type in
                              your name, and click the button. The completed page is shown in
                              Figure 8. You can also try using Internet Explorer to navigate to
http://localhost/ASPdotNET/TestProject/WebForm1.aspx.
                 The label is an example of an ASP.NET server control. Note that the HTML in
                 the Design pane included the attribute runat="server". This attribute marks the
                 HTML element as a server control that ASP.NET renders into custom HTML
                 when the page is called. In this case, it became an HTML span with an ID
                 corresponding to the name of the control and a style attribute that defines its
                 position and size.
                 If a user calls this page from an older browser that doesn’t support absolute
                 positioning, ASP.NET detects this and renders the HTML differently. The
                 following steps let you test this without installing an older browser:
                 Try It Out!
                      1. View the Design pane for your page in Visual Studio, and click in a
                         blank area of the page. This selects the page as a whole. In the
                         Property window, you should see the properties for the Document.
                         You can also achieve this by selecting Document from the drop-down
                         list at the top of the Properties window. Set the targetSchema
                         property to Internet Explorer 3.02/Navigator 3.0, as shown in Figure
                         9.
                          2. Save the project, right-click on the page in the Solution Explorer, and
                             select Build and Browse.
                          3. In the Browser window, right-click and select View Source. The older
                             browsers corresponding to this targetSchema do not support absolute
                             positioning. So, instead of using positioning values in style attributes,
                             ASP.NET accomplishes the positioning by creating an HTML table.
                             Here’s how the label now appears:
                          <TR vAlign="top">
                              <TD colSpan="2" height="20">
                              </TD>
                              <TD>
                                   <span id="Label1" style="width:156px;">
                                     Hello, Andy!</span>
                              </TD>
                          </TR>
                      </TABLE>
                  The HTML controls are very similar to the standard controls that you use when
                  writing HTML. Their properties correspond to the HTML attributes you set
                  when formatting the standard controls. However, unlike standard HTML
                  controls, these controls are rendered differently by ASP.NET, depending on
                  the client browser.
                  Web controls are distinguished by an asp: prefix in the HTML editor. Like
                  HTML controls, these controls must send standard HTML to the browser,
                  since that is, of course, all that browsers understand. But these controls support
                  properties, methods, and events that go far beyond what is available in
                  standard HTML. This gives you much more freedom and power when creating
                  Web pages, and you can let ASP.NET handle the messy details of rendering
                  the resulting HTML.
                  ASP.NET also allows you to create your own custom controls. This feature is
                  somewhat analogous to the way that Visual Basic 6 allows you to create your
                  own ActiveX controls.
                  In most cases, you will only use HTML controls for backwards compatibility
                  to facilitate migration of existing pages. Given a choice, you will probably
                  want to use the more full-featured Web controls when you can.
                  Remember that you are not limited to using server controls in ASP.NET. You
                  can edit the HTML and include standard HTML tags wherever you want, as
                  you did when you added the <h3> text at the top of the sample form.
                  At the start of this chapter, you saw an example of a classic ASP application
                  that retrieved product data from the Northwind database. Now, you’ll see
                  examples of how to build that application in ASP.NET, first using HTML
                  controls and then using Web controls.
See Products-     The Intro example project includes a Web form named Products-HTML.aspx.
HTML.aspx.vb      This page behaves very much like the Products-ASP.asp page, but it achieves
                  that behavior very differently. The HTML for this page is very simple:
                      All the work to retrieve data from the database and to fill the list box and table
                      occurs in the code contained in Products-HTML.aspx.vb, which is referenced
                      in the directive at the top of the HTML.
                 TIP:      As with all .NET event procedures, you can give this sub any legal
                           nameyou don’t have to use Object_Event. The Page_Load name is just a
                           convention that makes the purpose of the procedure immediately obvious and
                           it is a naming pattern that is familiar to Visual Basic programmers because it
                           was required in previous versions of Visual Basic, so Visual Basic .NET uses
                           this naming pattern by default.
                 This procedure is very important and very useful, because it runs every time a
                 client accesses your page, including postbacks. In this example, all the
                 functionality of the page is defined within this procedure.
                 At the very top of the Visual Basic file, before the Products_HTML class is
                 created, we inserted three Imports statements for the ADO.NET namespaces
                 we would be using:
                 Imports System.Data
                 Imports System.Data.SqlClient
                 Imports System.Web.UI.HtmlControls
                 These statements are there just to save some typing. They allow you to refer to
                 ADO.NET classes using only their names, without having to prefix the names
                      with the full namespace. For example, without the Imports statement for
                      System.Data.SqlClient, you would type:
With the Imports statement at the top of the file, you can simplify this to:
                      Here are the ADO.NET object variable declarations that appear at the top of
                      the Page_Load procedure. The SqlConnection declaration also includes a
                      constructor that defines the connection:
                      In this page, you only need to populate the drop-down list once, when the form
                      is first loaded. ASP.NET will automatically preserve the contents of the list on
                      subsequent postback. The code checks the postback property and if it isn’t
                      truemeaning that this is a fresh hit, not a postbackthe code creates an
                      ADO.NET SqlDataReader object to retrieve a list of categories from the
                      database:
                       With Category
                              .DataSource = rdr
                              .DataTextField = "CategoryName"
                              .DataValueField = "CategoryID"
                              .DataBind()
                       End With
                       rdr.Close()
                      This control is part of the HTML form, so its value is posted back to the server
                      when the Submit button is clicked. The cryptic contents of this control are a
                      compressed representation of the property values of all the controls that have
                      their EnableViewState property set to True.
                      During a postback, ASP.NET can use the ViewState data to reconstruct the
                      state that the page had the last time it was sent out. This allows ASP.NET to
                      detect changes when necessary, and to recreate sections of the form that don’t
                      need to change. In this example, the Page_Load event only fills the drop-down
                      list box once for each session, when the page is first called. During a postback,
                      the list is automatically recreated from the ViewState data.
                      Populating a table using the HTML Table control is not simply a matter of
                      setting a DataSource property and binding the data. You must add rows to the
                      table, add cells to the rows, and add content to the cells.
                      Here’s the first part of the code, which just adds the header row at the top of
                      the table:
Products.Rows.Add(row)
                 The final step is to use ADO.NET again to retrieve a list of products for the
                 selected category, and to add a row of cells to the table for each row in the
                 data:
                      This code generates a standard HTML table, which you can inspect by
                      selecting View Source in the browser after running the page.
                 Try It Out!
                      1. Open the HTML pane of the Products-HTML.aspx Web form, and
                         click inside the table tag, or select the Products table from the drop-
                         down list at the top of the Properties window. You can also select
                         controls in the Design pane, but the table is hard to select there
                         because it doesn’t have any rows defined.
                      2. In the Properties window, click in the bgcolor property and use the
                         builder button (showing three dots, called an ellipsis) to open the
                         Color Picker dialog box.
                      3. Click on the Named Colors tab, as shown in Figure 10, and select a
                         color you like for the table’s background.
                      Figure 10. The ASP.NET Color Picker dialog box supports all the standard HTML
                      options for specifying colors.
See Products-          The Intro project also includes a couple of example forms that use Web
Web1.aspx              controls, rather than HTML controls.
                        <body>
                            <form id="Form1" method="post" runat="server">
                                 <asp:Label id="Label1" runat="server">
                                  Select a Category:</asp:Label>
                                 <asp:DropDownList id="cboCategory" runat="server">
                                 </asp:DropDownList>
                                 <asp:Button id="btnShow" runat="server"
                                  Text="Show Products"></asp:Button>
                                 <br>
                                 <asp:DataGrid id="grdProducts" runat="server"
                                  Visible="False" GridLines="None">
                                     <HeaderStyle Font-Bold="True"
                                        HorizontalAlign="Center"></HeaderStyle>
                                 </asp:DataGrid>
                            </form>
                        </body>
                        The control tags on this page all have the prefix asp:, signaling that they are
                        Web controls. These Web controls support properties, methods, and events that
                        go beyond what is available from ASP.NET HTML controls.
                        The most interesting difference between this page and the Products-HTML
                        page is the use of a DataGrid control instead of an HTML table control.
                        The DataGrid, like many Web controls, contains object-based properties that
                        can be nested several object layers deep. For example, to make the header font
                        bold, using Visual Basic .NET, you would use syntax like this:
grdProducts.HeaderStyle.Font.Bold = True
<HeaderStyle Font-Bold="True"
                      Figure 11. Properties you have changed appear in bold type in the Properties
                      window in Visual Studio.
                        In this example, we also set the Visible property of the data grid to False. We
                        only show the grid during a postback, after the user has selected a category and
                        clicked the button.
See Products-          In contrast to the HTML table control, the DataGrid Web control is easy to fill
Web1.aspx              with data. It automatically creates columns to match the columns in your data,
                       and it creates headings that match the field names in your data.
                        grdProducts.Visible = True
                        cmd = New SqlCommand("SELECT ProductID [Product ID]," _
                         & " ProductName [Product Name]," _
                         & " UnitsInStock [Units in Stock] FROM Products" _
                         & " WHERE CategoryID = " _
                         & cboCategory.SelectedItem.Value, _
                         cnn)
                        cnn.Open()
                        rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
                        grdProducts.DataSource = rdr
                        grdProducts.DataBind()
                        rdr.Close()
                        So, the same task that required a couple dozen lines of code using the HTML
                        table control takes just a couple of lines using the DataGridnot bad!
See Products-          So far, the example pages have forced the user to click a button after selecting
Web2.aspx              a product category. But what if you wanted to fetch the list of products
                       immediately when the users select a category, without requiring them to click a
                       button?
Figure 13. The AutoPostBack property causes control events to trigger a postback.
                      In this example, we could have moved the code that populates the data grid to
                      an event handler for the drop-down list’s SelectedIndexChanged event. But
                      that isn’t really necessary, because the Page_Load event will still run after
                      every postback.
                      This behavior is something that Visual Basic programmers have a hard time
                      getting used to. Server-side control events never run in isolationthe page’s
                      load event handler always runs first and then any control event handlers run.
                      Events based on changes to data “accumulate” unless the control’s
                      AutoPostBack property is set to True, and then all these events run during the
                      next postback.
                      In the meantime, the markup language HTML, which was standardized as the
                      page-description language for Internet documents, evolved into XML, which
                      uses the same basic structure to represent any type of data, not just page
                      descriptions. Using the Internet to transmit XML means that any kind of data
                      can be communicated, taking advantage of the fact that virtually every type of
                      computing device can now connect to the Internet.
                      XML Web Services are provided over the Internet to support communication
                      between software applications. Using the HTTP and XML Internet standards,
                      XML Web Services allow disparate types of software running on disparate
                      platforms to send questions and answers to each other.
                 As this simple example code makes clear, creating a method in an XML Web
                 Service is like writing any Visual Basic function. The only difference is that
                 you need to preface the function with an attribute that identifies it as a
                 WebMethod. When the compiler sees that attribute, it does all the heavy lifting
                 for you.
                      Figure 14. ASP.NET automatically creates a test page for each method in an XML
                      Web Service.
Summary
                          •   Classic ASP has several important shortcomings that are addressed by
                              ASP.NET
                          •   ASP.Net is a completely new product based on the .NET Framework.
                          •   Server controls include the attribute runat="server".
                          •   ASP.NET uses both HTML controls and Web Forms controls.
                          •   The Imports statement allows you to simplify your code.
                          •   The Postback property allows you to determine whether a page is
                              being loaded for the first time.
                          •   The hidden __VIEWSTATE control is used to reconstruct the state
                              that the page had the last time it was sent out.
                          •   Setting the AutoPostBack property determines whether data entry
                              control events cause an immediate postback.
                          •   ASP.NET makes it easy for developers to create XML Web Services.
Questions
                      1. Name three of ASP.NET’s advantages over classic ASP.
Answers
                 1. Name three of ASP.NET’s advantages over classic ASP.
                      Compiled code, separation of code from HTML, better design
                      tools, state management that works in Web farms, easier
                      configuration based on XML files, automatic support for different
                      browsers
                 Lab 1:
            Introduction to
               ASP.NET
Lab 1 Overview
                 In this lab you’ll learn how to work with HTML and Web server controls in
                 Visual Studio.
                      Objective
                      In this exercise, you’ll create an HTML Label and Table control. You’ll use
                      the HTML editor to set properties for the Table control. You’ll then write code
                      to populate the Table control with the Country and ContactName data from the
                      Northwind Customers table.
                      Things to Consider
                          •   How do you create HTML controls in Visual Studio?
                          •   How do you set properties for the controls?
                          •   How do you access data from a database?
                          •   How do you fill an HTML table?
                      Step-by-Step Instructions
                      1. Open the HTMLControls.aspx page and click the Toolbox button on the
                         toolbar. Choose Project|Show All Files if that option is not already
                         selected. These steps assume that the pageLayout property is set to
                         GridLayout.
2. Click the HTML section on the Toolbox to display the HTML controls.
                      3. Double-click the Label control to add it to the page. Make sure that the
                         label is not selected and double-click the Table control to add it to the
                         page also. Reposition the table, if necessary by clicking and dragging. The
                         page should look similar to Figure 15.
                 5. Select all of the <TD> </TD> and <TR> </TR> pairs, and delete them.
                    Click the Design tabthe cells are no longer visible. However, the table is
                    still there and you can continue working with it in the HTML window.
                 6. To ensure that you can access your table in event procedures, check that
                    the opening table tag includes runat="server". Enter this attribute, if
                    necessary:
<TABLE runat="server"
                 7. In the HTML pane position your cursor just after the <TABLE tag. Right-
                    click and choose Properties from the menu. This loads the Property Pages
                    dialog box.
                 8. Click the builder button (…) next to the Background color option and
                    choose Named Colors. Select a color from the listLight Blue, for
                    example, and click OK.
                      Note the HTML that was created:
                 10. Change the text that reads Label (located right on top of the </DIV> tag)
                     to Customer Contacts.
                      Imports System.Data.SqlClient
                      Imports System.Web.UI.HTMLControls
                      12. Now it’s time to write code that loads the table with data. Replace the
                          existing Page_Load event handler stub with the following procedure. You
                          can copy and paste this code from HTMLControls.txt:
Customers.Rows.Add(row)
                    Do While rdr.Read
                       row = New HtmlTableRow()
                           Customers.Rows.Add(row)
                        Loop
                        rdr.Close()
                      End Sub
                      13. Click the Save button to save your changes. Select the
                          HTMLControls.aspx page in the Solution Explorer, right-click and
                          choose Build and Browse. The page should be displayed in your browser.
                 Objective
                 In this exercise, you’ll create a page using Web controls rather than HTML
                 controls, specifically a Label and a DataGrid. You’ll use the Properties
                 window to set properties for the controls. You’ll then write code to populate
                 the DataGrid control with Country and ContactName data from the Northwind
                 Customers table, and to modify the caption of the label.
                 Things to Consider
                      •    How do you create Web controls in Visual Studio?
                      •    How do you set properties for the controls?
                      •    How do you fill a DataGrid contol with data?
                      •    How do Web controls differ from HTML controls.
                 Step-by-Step Instructions
                 1. Open WebControls.aspx and click on the Toolbox icon to load the
                    Toolbox. Click the Web Forms bar in the toolbox so that you can select
                    Web controls.
                 2. Add a Label control and DataGrid control so that the page looks like
                    Figure 16.
                      3. Click the HTML tab to examine the HTML created. Note the asp: prefix
                         for the controls.
                      4. Next, open the WebControls.aspx.vb page and place the following Import
                         statements at the top of the page. Note how the WebControls namespace
                         allows you to shorten the class names for the label and data grid:
                          Imports System.Data.SqlClient
                          Imports System.Web.UI.WebControls
                      5. Next, replace the Page_Load event handler with the following procedure,
                         which populates the DataGrid control and sets the Label control’s Text
                         property. You can copy this code from WebControls.txt:
                         DataGrid1.Visible = True
                         cmd = New SqlCommand( _
                           "SELECT Country, ContactName FROM Customers" _
                           & " ORDER BY Country", cnn)
                         cnn.Open()
                         rdr = _
                           cmd.ExecuteReader(CommandBehavior.CloseConnection)
                         DataGrid1.DataSource = rdr
                         DataGrid1.DataBind()
                         rdr.Close()
                         Label1.Text = "Customers by Country"
                      End Sub
                 7. Close the browser window and return to the Design tab of the
                    WebControls.aspx page.
8. Select the Label control and press F4 to bring up the Properties window.
                 9. Expand the plus sign (+) next to the Font property. Set the Name to
                    Verdana, Bold to True, and the Size to Medium. Widen the label so that
                    it can accommodate the larger text size when displayed in a browser.
                 10. With the Properties window still open, click on the DataGrid control. Set
                     the Font Name to Verdana.
                      11. Expand the plus sign (+) next to the HeaderStyle option. Set the
                          BackColor property to Aqua.
                      12. Click the HTML tab and examine the changes that have been made by
                          changing properties in the designer.
                      13. Save your changes by clicking the Save button. Right-click on the
                          WebControls.aspx file in the Solution Explorer and choose Build and
                          Browse.
                      Your changes will be displayed in the browser. For the most part, you’ll find it
                      easier to work with Web controls than HTML controlsyou can do more and
                      there is usually less code to write.