Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / ASP.NET / General / August 2007

Tip: Looking for answers? Try searching our database.

DataList--is it wrong to do this?  If so, what's the correct way?

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Homer J. Simpson - 31 Jul 2007 21:20 GMT
I feel I'm not doing things correctly.

I have a <asp:DataList> embedded in a <asp:Panel> with its ScrollBars
property set to Auto.  Essentially, I want to format a bunch of records as a
list in an area of the screen with a fixed size, so I want a scrollbar to
appear if I have a lot of records.  That works fine.

Each row in my list consists of three fields that come from a database:  a
date, a title (both on the same line), and followed by a longer description
below that first line.  Knowing that the rendered HTML contains leading
table, tr and td tags, I've added my own tags right into the <ItemTemplate>:

<asp:DataList DataSourceID="..." >
<ItemTemplate>
       <div class="clsDate"><%# Eval("MYDATE") %></div></td>
       <td><div class="clsTitle"><%# Eval( "MYTITLE") %></div></td>
   </tr>
   <tr>
       <td colspan="2"><div class="clsDescription"><%# Eval(
"MYDESCRIPTION" ) %></div>
</ItemTemplate>
</asp:DataList>

This lines up nicely:

Date1    Title1
Description1

Date2    Title2
Description2

Date3    Title3
Description3

The rendered output is exactly what I want (and perfectly valid HTML)...but
I can't help but get the feeling that I'm "cheating" by embedding my own
partial tags--eg, my first <td> tag is a terminating </td>, knowing that the
framework will already have generated a leading <td> by then, and I don't
supply a terminating </td> either, knowing the framework will generate the
final </td> tag...

As far as I understand them, the DetailsView and FormView controls offer
more layout flexibility, but are are intended for displaying a single record
at a time.

Is my approach a common and acceptable ASP.NET 2.0 practice?  If it is, then
so be and I'm worrying about nothing because "it works" and the rendered
code is clean...but as much as possible, I'd like to do things the way
you're supposed to and not hack partial tags into .aspx files (not to
mention that it'll probably trip the WYSIWYG editor sooner or later)...

I've seen more than a few references suggesting that the DataList has been
mostly replaced by the GridView, but as far as I can tell, this isn't going
to work in this case because I want the description to appear on its own row
after the date and title fields (whereas the GridView is strictly
line-oriented).

Thoughts?
Brandon Gano - 31 Jul 2007 22:20 GMT
Try using <asp:Repeater /> instead. The problem with making assumptions
about the particular output of server controls is that the output could
potentially change in a future version, breaking your code. For example, if
Microsoft decided to use <ul /> to display menus instead of <table />.
Microsoft? Please? While it is unlikely that the DataGrid output will ever
change, I still think this applies as a bad practice.

Here is an example (not tested):

<table>
 <asp:Repeater ...>
   <ItemTemplate>
     <tr>
       <td class="clsDate">
         <%# Eval("MYDATE") %>
       </td>
       <td class="clsTitle">
         <%# Eval("MYTITLE") %>
       </td>
     </tr>
     <tr>
       <td class="clsDescription" colspan="2">
         <%# Eval("MYDESCRIPTION") %>
       </td>
     </tr>
   </ItemTemplate>
 </asp:Repeater>
</table>

This also allows you to assign classes at the <td /> level and avoid using
redundant <div /> containers.

>I feel I'm not doing things correctly.
>
[quoted text clipped - 55 lines]
>
> Thoughts?
Homer J. Simpson - 01 Aug 2007 16:41 GMT
> Try using <asp:Repeater /> instead. The problem with making assumptions
> about the particular output of server controls is that the output could
> potentially change in a future version, breaking your code. For example,
> if Microsoft decided to use <ul /> to display menus instead of <table />.
> Microsoft? Please? While it is unlikely that the DataGrid output will ever
> change, I still think this applies as a bad practice.

This is *exactly* why I'm asking the question.  Using knowledge of what
should be a black box to hack your way around always leads to problems in
the long term.  Thanks for confirming this.

> Here is an example (not tested):
>
[quoted text clipped - 20 lines]
> This also allows you to assign classes at the <td /> level and avoid using
> redundant <div /> containers.

Yeah, the only reason I was using divs was to add the ability to assign a
class for custom formatting--obviously I couldn't assign one to the first
<td> tag, since I'm not the one providing it.  As for the other cases
(title, description), I only added the div (instead of using the enclosing
td) for consistency.  That only increased my suspicion that I was going
about it the wrong way.

<asp:Repeater> it is then--your example looks safe enough and very clean for
my purposes.  I hadn't looked into it (yet) as most of the references I've
been using are concentrating on the gridview (being new to 2.0).  I'm still
at the stage where I'm discovering what's available and figuring out the
best way to tackle common problems.

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.