- •Preface
- •Who Should Read This Book
- •Organization and Presentation
- •Contacting the Authors
- •Acknowledgments
- •Contents
- •Introduction
- •Why Microsoft .NET?
- •The Microsoft .NET Architecture
- •Internet Standards
- •The Evolution of ASP
- •The Benefits of ASP.NET
- •What Is .NET?
- •.NET Experiences
- •.NET Clients
- •.NET Services
- •.NET Servers
- •Review
- •Quiz Yourself
- •Installation Requirements
- •Installing ASP.NET and ADO.NET
- •Installing the .NET Framework SDK
- •Testing Your Installation
- •Support for .NET
- •Review
- •Quiz Yourself
- •Designing a Database
- •Normalization of Data
- •Security Considerations
- •Review
- •Quiz Yourself
- •Creating a Database
- •Creating SQL Server Tables
- •Creating a View
- •Creating a Stored Procedure
- •Creating a Trigger
- •Review
- •Quiz Yourself
- •INSERT Statements
- •DELETE Statements
- •UPDATE Statements
- •SELECT Statements
- •Review
- •Quiz Yourself
- •The XML Design Specs
- •The Structure of XML Documents
- •XML Syntax
- •XML and the .NET Framework
- •Review
- •Quiz Yourself
- •ASP.NET Events
- •Page Directives
- •Namespaces
- •Choosing a Language
- •Review
- •Quiz Yourself
- •Introducing HTML Controls
- •Using HTML controls
- •How HTML controls work
- •Intrinsic HTML controls
- •HTML Control Events
- •The Page_OnLoad event
- •Custom event handlers
- •Review
- •Quiz Yourself
- •Intrinsic Controls
- •Using intrinsic controls
- •Handling intrinsic Web control events
- •List Controls
- •Rich Controls
- •Review
- •Quiz Yourself
- •Creating a User Control
- •Adding User Control Properties
- •Writing Custom Control Methods
- •Implementing User Control Events
- •Review
- •Quiz Yourself
- •Common Aspects of Validation Controls
- •Display property
- •Type Property
- •Operator Property
- •Using Validation Controls
- •RequiredFieldValidator
- •RegularExpressionValidator
- •CompareValidator
- •RangeValidator
- •CustomValidator
- •ValidationSummaryx
- •Review
- •Quiz Yourself
- •Maintaining State Out of Process for Scalability
- •No More Cookies but Plenty of Milk!
- •Out of Process State Management
- •Review
- •Quiz Yourself
- •Introducing the Key Security Mechanisms
- •Web.config and Security
- •Special identities
- •Using request types to limit access
- •New Tricks for Forms-based Authentication
- •Using the Passport Authentication Provider
- •Review
- •Quiz Yourself
- •ASP.NET Updates to the ASP Response Model
- •Caching with ASP.NET
- •Page Output Caching
- •Absolute cache expiration
- •Sliding cache expiration
- •Fragment Caching
- •Page Data Caching
- •Expiration
- •File and Key Dependency and Scavenging
- •Review
- •Quiz Yourself
- •A Brief History of Microsoft Data Access
- •Differences between ADO and ADO.NET
- •Transmission formats
- •Connected versus disconnected datasets
- •COM marshaling versus text-based data transmission
- •Variant versus strongly typed data
- •Data schema
- •ADO.NET Managed Provider Versus SQL Managed Provider
- •Review
- •Quiz Yourself
- •Review
- •Quiz Yourself
- •Creating a Connection
- •Opening a Connection
- •Using Transactions
- •Review
- •Quiz Yourself
- •Building a Command
- •Connection property
- •CommandText property
- •CommandType property
- •CommandTimeout property
- •Appending parameters
- •Executing a Command
- •ExecuteNonQuery method
- •Prepare method
- •ExecuteReader method
- •Review
- •Quiz Yourself
- •Introducing DataReaders
- •Using DataReader Properties
- •Item property
- •FieldCount property
- •IsClosed property
- •RecordsAffected property
- •Using DataReader Methods
- •Read method
- •GetValue method
- •Get[Data Type] methods
- •GetOrdinal method
- •GetName method
- •Close method
- •Review
- •Quiz Yourself
- •Constructing a DataAdapter Object
- •SelectCommand property
- •UpdateCommand, DeleteCommand, and InsertCommand properties
- •Fill method
- •Update method
- •Dispose method
- •Using DataSet Objects
- •DataSetName property
- •CaseSensitive property
- •Review
- •Quiz Yourself
- •Constructing a DataSet
- •Tables property
- •TablesCollection Object
- •Count property
- •Item property
- •Contains method
- •CanRemove method
- •Remove method
- •Add method
- •DataTable Objects
- •CaseSensitive property
- •ChildRelations property
- •Columns property
- •Constraints property
- •DataSet property
- •DefaultView property
- •ParentRelations property
- •PrimaryKey property
- •Rows property
- •Dispose method
- •NewRow method
- •Review
- •Quiz Yourself
- •What Is Data Binding?
- •Binding to Arrays and Extended Object Types
- •Binding to Database Data
- •Binding to XML
- •TreeView Control
- •Implement the TreeView server control
- •Review
- •Quiz Yourself
- •DataGrid Control Basics
- •Binding a set of data to a DataGrid control
- •Formatting the output of a DataGrid control
- •Master/Detail Relationships with the DataGrid Control
- •Populating the Master control
- •Filtering the detail listing
- •Review
- •QUIZ YOURSELF
- •Updating Your Data
- •Handling the OnEditCommand Event
- •Handling the OnCancelCommand Event
- •Handling the OnUpdateCommand Event
- •Checking that the user input has been validated
- •Executing the update process
- •Deleting Data with the OnDeleteCommand Event
- •Sorting Columns with the DataGrid Control
- •Review
- •Quiz Yourself
- •What Is Data Shaping?
- •Why Shape Your Data?
- •DataSet Object
- •Shaping Data with the Relations Method
- •Review
- •Quiz Yourself
- •OLEDBError Object Description
- •OLEDBError Object Properties
- •OLEDBError Object Methods
- •OLEDBException Properties
- •Writing Errors to the Event Log
- •Review
- •Quiz Yourself
- •Introducing SOAP
- •Accessing Remote Data with SOAP
- •SOAP Discovery (DISCO)
- •Web Service Description Language (WSDL)
- •Using SOAP with ASP.NET
- •Review
- •Quiz Yourself
- •Developing a Web Service
- •Consuming a Web Service
- •Review
- •Quiz Yourself
- •ASP and ASP.NET Compatibility
- •Scripting language limitations
- •Rendering HTML page elements
- •Using script blocks
- •Syntax differences and language modifications
- •Running ASP Pages under Microsoft.NET
- •Using VB6 Components with ASP.NET
- •Review
- •Quiz Yourself
- •Preparing a Migration Path
- •ADO and ADO.NET Compatibility
- •Running ADO under ASP.NET
- •Early Binding ADO COM Objects in ASP.NET
- •Review
- •Quiz Yourself
- •Answers to Part Reviews
- •Friday Evening Review Answers
- •Saturday Morning Review Answers
- •Saturday Afternoon Review Answers
- •Saturday Evening Review Answers
- •Sunday Morning Review Answers
- •Sunday Afternoon Review Answers
- •What’s on the CD-ROM
- •System Requirements
- •Using the CD with Windows
- •What’s on the CD
- •The Software Directory
- •Troubleshooting
- •ADO.NET Class Descriptions
- •Coding Differences in ASP and ASP.NET
- •Retrieving a Table from a Database
- •Displaying a Table from a Database
- •Variable Declarations
- •Statements
- •Comments
- •Indexed Property Access
- •Using Arrays
- •Initializing Variables
- •If Statements
- •Case Statements
- •For Loops
- •While Loops
- •String Concatenation
- •Error Handling
- •Conversion of Variable Types
- •Index
236 |
Sunday Morning |
We can further specify the look and feel of the resulting table by using the HeaderStyle,
FooterStyle, ItemStyle, and AlternatingItemStyle properties. These properties specify the look and feel of the final output. Use HeaderStyle to format the header row if you have established headings for any of the output columns. The ItemStyle provides the default formatting for each new row; and AlternatingItemStyle sets up a contrasting pattern when a long series of alternating data is to be displayed. The results of these formatting styles can be seen in Figure 23-1.
Figure 23-1 Results of using various style properties of the DataGrid control
Now that we understand how to control what fields to display and how to format the resulting output, lets move into a very common use for the DataGrid control, displaying master/detail relationships
Master/Detail Relationships with the DataGrid Control
When implementing user interfaces, a very common technique for navigating through sets of data is to utilize Master/Detail controls to facilitate data searching. For example,
Figure 23-2 shows the data relationships that exist between the Authors table and the Titles Table in the Pubs database.
Session 23—Using the DataGrid Control with Bound Data |
237 |
Figure 23-2 Diagram of authors and titles relationship
In Figure 23-2, there is a many-to-many relationship between authors and titles. The titleauthor table maintains these relationships. It is very likely that you may need to provide the user of this database a list of authors and provide a list of titles related to a specific author. You can quickly build such a Master/Detail relationship by using a bound dropdown list and a DataGrid control. You can load the dropdown list with the authors table and then filter the titles table by the selected author.
The remainder of this session will refer to the masterdetail.aspx file located in the session 23 folder of the CD-ROM.
CD-ROM
In the masterdetail.aspx file, you’ll find three key functions that support the generation and binding of all data required to support the master/detail relationship shown in
Listing 23-3.
Listing 23-3 Partial Listing of masterdetail.aspx file illustrating core functions
Sub Page_Load(Src As Object, E as EventArgs)
Dim connection as New OleDBConnection(“provider=sqloledb;Data
Source=localhost;Initial Catalog=pubs;User ID=sa;pwd=”)
If Not IsPostback Then Connection.Open()
Dim command as New OleDbCommand(“SELECT * FROM Authors Order By au_lname, au_fname”, connection)
Dim AuthorDataReader As OleDbDataReader = command.ExecuteReader() Dim sFullName as String
While AuthorDataReader.Read()
sFullName = AuthorDataReader.Item(“au_fname”) & “ “ & AuthorDataReader.Item(“au_lname”)
Continued
238 |
Sunday Morning |
Listing 23-3 |
Continued |
authorlist.items.add(New ListItem(sFullName, AuthorDataReader.Item(“au_id”)))
End While AuthorDataReader.Close() Connection.Close() BindData()
End If
End Sub
Function GetTitles(ByVal au_id As String) As DataView Try
Dim connection as New OleDBConnection(“provider=sqloledb;Data Source=localhost;Initial Catalog=pubs;User ID=sa;pwd=”)
Dim command As New OleDBDataAdapter(“SELECT titles.title_id, titles.title, titles.price, titles.ytd_sales,titleauthor.au_ord,authors.au_id, titles.pub_id FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id INNER JOIN titles ON titleauthor.title_id = titles.title_id”, connection)
Dim dataset As New DataSet() Dim dataView1 as DataView
command.Fill(dataset, “TitleAuthor”)
dataView1 = new DataView(dataset.Tables(“TitleAuthor”)) dataView1.RowFilter = “au_id=’” & au_id &”’”
Return dataview1
Catch myException as Exception
Message.Text = (“Exception: “ + myException.ToString()) End Try
End Function
Function BindData() Try
Dim TitlesDataView As DataView = GetTitles(authorlist.SelectedItem.Value) titleGrid.DataSource = TitlesDataView
titleGrid.DataBind() Catch myException as Exception
Message.Text = (“Exception: “ + myException.ToString()) End Try
End Function
Populating the Master control
In the Page_Load() function we establish a connection to the Pubs database, then proceed to fill an OleDbDataReader by connecting it to a OleDbCommand which has been attached to a SQL select statement. We have decided to use a OleDbataReader object here as opposed to a DataSet object to simply illustrate how it can be used as easily as the DataSet object for this type of operation, forward reading a set of data.
We loop through the retrieved DataReader using the following control loop:
While AuthorDataReader.Read()
sFullName = AuthorDataReader.Item(“au_fname”) & “ “ &
AuthorDataReader.Item(“au_lname”)
authorlist.items.add(New ListItem(sFullName,
AuthorDataReader.Item(“au_id”)))
End While
Session 23—Using the DataGrid Control with Bound Data |
239 |
This allows us to quickly loop through the records and populate the authorlist dropdown list. Finally we close the OleDbDataReader and the Connection Objects with
AuthorDataReader.Close()
Connection.Close()
It is important to remember that you need to close OleDbDataReader objects when you are completed with them, as they do not automatically go out of scope, closing the
OleDbConnection the way that DataSet objects do.
Tip
General Rule on opening connections: If you explicitly open a connection, for instance by calling an Open() method, then you will need to use a Close() method to avoid errors. When using DataSet objects, you never explicitly open a connection, so closing is not an issue.
Now that we have a master list of authors populated, we need to filter the Titles table for the selected author and display the details in a DataGrid control. This is done by calling the BindData() function.
Filtering the detail listing
The BindData() function is the primary function, which initiates grabbing the authorid selected in the authorlist and then filtering the titles table by calling the GetTitles() function and passing the authorid value as shown below:
Function BindData() Try
Dim TitlesDataView As DataView = GetTitles(authorlist.SelectedItem.Value) titleGrid.DataSource = TitlesDataView
titleGrid.DataBind() Catch myException as Exception
Message.Text = (“Exception: “ + myException.ToString()) End Try
End Function
The GetTitles() function accepts the authorid and does a multitable query of the authors, titleauthor, and titles tables to get a list of all titles, the price of each title, and the year to date revenue for the title. The following example illustrates the use of a DataView filter to filter the rows returned by the author id:
Function GetTitles(ByVal au_id As String) As DataView Try
Dim connection as New OleDBConnection(“provider=sqloledb;Data Source=localhost;Initial Catalog=pubs;User ID=sa;pwd=”)
Dim command As New OleDBDataAdapter(“SELECT titles.title_id, titles.title, titles.price, titles.ytd_sales,titleauthor.au_ord,authors.au_id, titles.pub_id FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id INNER JOIN titles ON titleauthor.title_id = titles.title_id”, connection)
Dim dataset As New DataSet() Dim dataView1 as DataView
command.Fill(dataset, “TitleAuthor”)
dataView1 = new DataView(dataset.Tables(“TitleAuthor”)) dataView1.RowFilter = “au_id=’” & au_id &”’”