In Part 1 of this part of the article series, we examined how
to set display properties for the DataGrid Web control and how to use styles to specify dislay
settings for the header, footer, item, and alternating item. All of these techniques either specify
the display settings for the entire DataGrid, or for the rows of a DataGrid. But what if
we want to specify the display settings for the columns of a DataGrid? This is not a difficult
task - read on to learn more!
Specifying what Columns Should Appear
By default the DataGrid created a column in the HTML table for every column returned by the SQL
query. There are times, though, when you may only wish to show a subset of these columns in the DataGrid.
For example, in my ongoing live demo series, I've been showing the most popular ASPFAQs.com
FAQs by calling the sp_Popularity stored procedure, which includes the FAQID
column. Perhaps in my DataGrid I don't want to display this column.
If you don't want to display all of the columns from the database query in the DataGrid, you have to
explicitly specify all of the columns you do wish to include. The first step is to set the
DataGrid's AutoGenerateColumns property to False. Once you've done this, you need to
specify the columns to show using the BoundColumn Web controls like so:
For each column that you wish to display you need to specify an <asp:BoundColumn ... />
tag with the DataField property specifying the database column to display. All of these
BoundColumn tags need to appear between the Column tags. (There is a way to
specify these bound columns programmatically, but it's really ugly and requires tons of code!) Note
that only those columns specified by BoundColumn tags will appear in the DataGrid and
they will appear in the order you specify them!
The nice thing about these BoundColumn controls is that they contain some formatting properties,
such as:
HeaderText - Specifies the text that should appear in the column's header.
FooterText - Specifies the text that should appear in the column's footer. (Remember
to set ShowFooter to True if you want to display a footer in your DataGrid!)
HeaderStyle / FooterStyle / ItemStyle - Contains all of the properties
that the DataGrid's styles did. Useful for centering columns, specifying fore/background color, etc.
DataFormatString - Specifies formatting instructions. (See the live demo for some
examples; refer to the docs for a full listing of format specifications.)
Let's see how we can use the BoundColumn tags to further enhance the live demo examples.
As I said before, we want to not show the FAQID or FAQCategoryID columns,
and we'd like to perform
formatting for the number column (ViewCount), as well as the date/time column
(DateEntered). Furthermore, we'd like
to have numeric columns have their values centered. This can all be accomplished in just a few simple lines
of easy-to-read and easy-to-understand format specification code:
As you can see in the live demo, the above code creates only the specified columns and applies the
specified formatting. Note that the DataFormatString property looks a bit funny. It
should always look like: {0:format string}. The {0:...} specifies to
format the first argument (the value of the particular column returned by the DataReader) using the
format string specified by .... In my example I used the format string #,###
to format a number with commas after every three digits, and MM-dd-yyyy to format the
date/time field to show the month, day, and year. Review the docs for more information on formatting
strings.
Conclusion
Take a moment to look at the first live demo (what we started with
when kicking off this article) and what we ended up with. A pretty
impressive improvement! Note that all of these stylistic and UI enhancements were done without
writing a single line of code - we just set a few properties in the Web control tag! In fact, if you
are using an editor like Visual Studio .NET, you can specify these formatting options by just clicking
some buttons, checking some checkboxes, and choosing some items from listboxes. Just imagine the
amount of bloated code we'd need to write to achieve the same look and feel in classic ASP. That thought
alone should make you fall in love with ASP.NET, if you're not already.