Scott on Writing

Musings on technical writing...

Your Daily Tip to Save Yourself 15 Minutes of Wasted Time

Thought I'd jot this donw - hopefully someone out there will read it and save the 15 minutes I lost to working on this little “gotcha” problem.

Scenario: You have a DataGrid with two columns.  The first is a BoundColumn, the second a TemplateColumn.  In the TemplateColumn you have a RadioButtonList.  The idea is to have the user select precisely one option from the second column for each item in the first one.  Basically, the DataGrid markup looks like:

<asp:DataGrid ...>
   <Columns>
      <asp:BoundColumn ... />
      <asp:TemplateColumn>
         <ItemTemplate>
             <asp:RadioButtonList id=”radList” ... />
         </ItemTemplate>
      </asp:TemplateColumn>
   </Columns>
</asp:DataGrid>

Now, this RadioButtonList needs to be bound to a list of options.  Since the options are the same for all items in the DataGrid (and therefore not specific on the particular row), you figure that you'll use the DataGrid's ItemCreated event to do this.  (FIRST MISTAKE!)  The event handler looks something like:

Sub MyDataGrid_ItemCreated(...) Handles MyDataGrid.ItemCreated
   If e.Item.ItemType = ... Then
      'Get a reference to the RadioButtonList
      Dim radList as RadioButtonList = CType(...)

      'Bind the data
      radList.DataSource = ...
      radList.DataBind()
   End If
End Sub

The above will work just fine, although it is a bit inefficient (more on that later).  Now, if you were to see the DataGrid, you'd see a series of rows with the second column in each row with a set of radio buttons.  However, no radio button is selected by default.  Ok, easy enough, go and add radList.SelectedIndex = 0 right after the radList.DataBind() call, right?  Well, you'd think that work, but it doesn't.  No error, of course, just no selected radio button.

Now, if you are like me, you spend the next 15 minutes thinking about this, opening Reflector, reading the docs, and being generally unproductive.

If you want to waste less time, you would simply move this code to the ItemDataBound event rather than ItemCreated.  After ItemCreated, the DataGrid assigns the DataSource record to the DataItem property of the current DataGridItem (e.Item) and then calls the DataBind() method of that DataGridItem.  The DataGridItem propogates the DataBind() call down to its child controls, meaning the RadioButtonList will have its OnDataBinding event fire.  What happens there?  Well, it sees that the DataSource for the RadioButtonList is not null, so it clears out the RadioButtonList items, and rebinds the data!  This, of course, has the negative side-effect of clearing out the SelectedIndex setting.

Solution: anytime you find yourself calling DataBind() for a Web control that exists in a TemplateColumn of the DataGrid, make sure you are doing so in the DataGrid's ItemDataBound event, otherwise the data will be bound twice to the Web control, which will not only be less efficient, but might have negative side-effects, as seen here.

posted on Tuesday, July 20, 2004 12:24 PM

Feedback

# Scott Mitchell's Time Saver 7/27/2004 7:45 PM OdeToCode News

# Scott Mitchell's Time Saver 7/29/2004 6:57 AM OdeToCode News

# re: Your Daily Tip to Save Yourself 15 Minutes of Wasted Time 2/8/2006 3:51 AM Damon Birch

Excellent

Just wasted a day on this, not just 15 minutes!


Thankyou

Title:  
Name:  
Url:
Protected by Clearscreen.SharpHIPEnter the code you see:
Comments   

My Links

Ads Via DevMavens

Archives

Post Categories

 

I am a Microsoft MVP for ASP.NET.
I am an ASPInsider.
<March 2010>
SMTWTFS
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

Comment Stats

DayTotal% of Total
Sunday 2056.8%
Monday 42514.1%
Tuesday 51917.2%
Wednesday 55618.4%
Thursday 58019.2%
Friday 54718.1%
Saturday 1886.2%
Total 3020100.0%

Hour1Total% of Total
12:00 AM 782.6%
1:00 AM 812.7%
2:00 AM 682.3%
3:00 AM 822.7%
4:00 AM 692.3%
5:00 AM 1264.2%
6:00 AM 1193.9%
7:00 AM 1816.0%
8:00 AM 1926.4%
9:00 AM 1585.2%
10:00 AM 1886.2%
11:00 AM 1936.4%
12:00 PM 2016.7%
1:00 PM 1846.1%
2:00 PM 1695.6%
3:00 PM 1354.5%
4:00 PM 1153.8%
5:00 PM 1073.5%
6:00 PM 1013.3%
7:00 PM 1073.5%
8:00 PM 923.0%
9:00 PM 882.9%
10:00 PM 913.0%
11:00 PM 953.1%
Total 3020100.0%

Comments by Blog Entry Date/Time

Day Entry MadeAvg.Total
Sunday 5.00160
Monday 4.80384
Tuesday 4.04477
Wednesday 7.39680
Thursday 6.26676
Friday 5.07466
Saturday 4.78177
Total 5.403020

Hour1 Entry MadeAvg.Total
12:00 AM 5.2937
1:00 AM 1.002
5:00 AM 0.000
7:00 AM 3.8550
8:00 AM 3.72134
9:00 AM 6.06297
10:00 AM 5.63276
11:00 AM 4.22194
12:00 PM 6.16351
1:00 PM 3.09133
2:00 PM 4.89230
3:00 PM 7.67322
4:00 PM 4.00108
5:00 PM 6.07170
6:00 PM 4.64116
7:00 PM 8.95188
8:00 PM 8.63164
9:00 PM 5.00115
10:00 PM 6.31101
11:00 PM 4.5732
Total 5.403020

Learn More About Comment Stats
1 - All times GMT -8...


Blog Stats

Favorite Web Sites

My Books

My MSDN Articles