Click here to Skip to main content
6,292,811 members and growing! (11,128 online)
Email Password   helpLost your password?
Web Development » ASP.NET Controls » General     Intermediate License: The Code Project Open License (CPOL)

How to group RadioButtons

By Vladimir Smirnov

This article describes how to group radio-buttons when using them in DataGrid, DataList, Repeater etc.
C#, Windows, .NET 1.0, .NET 1.1, ASP.NET, VS.NET2003, Dev
Posted:11 Aug 2004
Views:322,268
Bookmarked:198 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
105 votes for this article.
Popularity: 9.66 Rating: 4.78 out of 5
2 votes, 1.9%
1
1 vote, 1.0%
2
2 votes, 1.9%
3
12 votes, 11.4%
4
88 votes, 83.8%
5

Introduction to the problem

'Where is the problem? Haven't you heard about GroupName property?' - you can ask me. Of course, you are right! But...

Let's take an ordinary DataGrid, add a TemplateColumn to its Columns collection, and place a RadioButton control within this column (it can be useful when you would like to provide the user with selection from the DataGrid items). See the code below:

<!-- Countries for selection -->
<asp:DataGrid id="countriesGrid" runat="server" 
         DataKeyField="ID" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateColumn>
            <ItemTemplate>
                <!-- 
                Draw attention at this control. 
                We would like to use radio-buttons to
                select single country from the list.
                -->
                <asp:RadioButton id="selectRadioButton" 
                    runat="server" GroupName="country" />
            </ItemTemplate>
        </asp:TemplateColumn>
        <asp:BoundColumn DataField="Country" HeaderText="Country" 
                                  HeaderStyle-Font-Bold="True" />
        <asp:BoundColumn DataField="Capital" HeaderText="Capital" 
                                  HeaderStyle-Font-Bold="True" />
    </Columns>
</asp:DataGrid>

Now, bind to the DataGrid some data and run your ASP.NET application. Try to click at the radio buttons in the Countries list. You can select one country!... and another one... and another... Hmm-m! Didn't we really want to get this effect?

Where is a mistake? We have specified GroupName for the RadioButtons to treat them as from the single group, haven't we? Look at the piece of HTML code that has been generated from our web form. You will see something like this:

<!-- Countries for selection -->
<table cellspacing="0" rules="all" border="1" id="countriesGrid" 
                              style="border-collapse:collapse;">
    <tr>
        <td> </td>
        <td style="font-weight:bold;">Country</td>
        <td style="font-weight:bold;">Capital</td>
    </tr>
    <tr>
        <td><input id="countriesGrid__ctl2_selectRadioButton" 
             type="radio" name="countriesGrid:_ctl2:country" 
             value="selectRadioButton" /></td>
        <td>USA</td>
        <td>Washington</td>
    </tr>
    <tr>
        <td><input id="countriesGrid__ctl3_selectRadioButton" 
             type="radio" name="countriesGrid:_ctl3:country" 
             value="selectRadioButton" /></td>
        <td>Canada</td>
        <td>Ottawa</td>
    </tr>
    <!-- etc. -->

The 'name' attributes of the radio-buttons are different. Why? Here is the answer.

When rendering RadioButton control, ASP.NET uses concatenation of GroupName and UniqueID for the value of 'name' attribute. So, this attribute depends on the UniqueID of the control which depends on the owner's UniqueID etc. It is the standard solution of ASP.NET to avoid naming collisions. As the value of the 'name' attribute of the <input type="radio" /> is used for identification of postback data of the radio-button group when the from is submitting, ASP.NET developers decided to isolate radio-button groups within the bounds of the single owner control (i.e., any two radio-buttons from the same group can not have different direct owners), otherwise it can occur that you will use two third party controls that both contain radio-button groups with the same GroupName - in this case, all radio-buttons will be treated as from the single group and that will bring undesirable behavior.

Now you have understood the cause of error, but how to implement the feature we want? In the next section, I'll provide you the solution.

Solution of the problem

To solve the problem I have stated above, I've created a new GroupRadioButton web control derived from the RadioButton.

In this control, I have changed the rendering method so that 'name' attribute of the resulting HTML radio-button now depends on the GroupName only.

Another one modification is postback data handling (IPostBackDataHandler interface has been overridden).

Other functionality of the GroupRadioButton is equivalent to RadioButton.

See the source code of the GroupRadioButton for details.

Using the code

Now, let's modify the initial form. Use the following script for the Countries list:

<%@ Register TagPrefix="vs" Namespace="Vladsm.Web.UI.WebControls" 
                                          Assembly="GroupRadioButton" %>
...
<!-- Countries for selection -->
<asp:DataGrid id="countriesGrid" runat="server" DataKeyField="ID" 
                                     AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateColumn>
            <ItemTemplate>
                <vs:GroupRadioButton id="selectRadioButton" 
                runat="server" GroupName="country" />
            </ItemTemplate>
        </asp:TemplateColumn>
        <asp:BoundColumn DataField="Country" HeaderText="Country" 
                                  HeaderStyle-Font-Bold="True" />
        <asp:BoundColumn DataField="Capital" HeaderText="Capital" 
                                  HeaderStyle-Font-Bold="True" />
    </Columns>
</asp:DataGrid>

Add reference to the GroupRadioButton assembly, bind data for the countriesGrid, and execute this form. You will find that all radio-buttons are in the single group (i.e., user can check only one of them).

It remained only to show how to determine which of the countries have been selected:

using Vladsm.Web.UI.WebControls;
...
private void selectButton_Click(object sender, System.EventArgs e)
{
    // for each grid items...
    foreach(DataGridItem dgItem in countriesGrid.Items)
    {
        // get GroupRadioButton object...
        GroupRadioButton selectRadioButton = 
            dgItem.FindControl("selectRadioButton") as GroupRadioButton;

        // if it is checked (current item is selected)...
        if(selectRadioButton != null && selectRadioButton.Checked)
        {
            // sample data that was boud to the countriesGrid
            DataTable dataSource = DataSource.CreateSampleDataSource();

            // get country corresponding to the current item...
            DataRow row = 
              dataSource.Rows.Find(countriesGrid.DataKeys[dgItem.ItemIndex]);

            // ...and show selected country information
            selectedCountryInfo.Text = 
                String.Format("Selected country: {0}, Capital: {1}", 
                row["Country"], row["Capital"]);

            return;
        }
    }

    // there are no selected countries
    selectedCountryInfo.Text = String.Empty;
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Vladimir Smirnov


Member

Occupation: Web Developer
Location: Russian Federation Russian Federation

Other popular ASP.NET Controls articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 123 (Total in Forum: 123) (Refresh)FirstPrevNext
GeneralThanks! Pinmembereriknsdca16:57 29 Mar '09  
GeneralThanks... I hope MS fixes this in their next release. Good work! PinmemberDire Entity15:53 20 Mar '09  
GeneralThanks a million for your answer Pinmemberaungmyo4:10 6 Mar '09  
GeneralThank you! PinmemberJohn Riston6:27 3 Feb '09  
Generalcool! but one suggestion..... PinmemberAravind Rajagopal K7:56 5 Dec '08  
Generalthanks very much PinmemberGeorge Manjooran23:37 5 Nov '08  
Generalhow to give different rows different groupnames? PinmemberThomas19110:49 9 Oct '08  
GeneralChecked=True PinmemberVivekVashisht20:39 3 Oct '08  
GeneralHow to group RadioButtons Pinmemberjemreal16:55 30 Sep '08  
Generalgreat PinmemberRa...aj23:59 13 Sep '08  
QuestionSystem.Security.SecurityException: That assembly does not allow partially trusted callers. PinmemberMember 37798830:57 16 Jul '08  
QuestionGroupRadioButton.Text & GroupRadioButton.ForeColor Doesnt work !?! PinmemberKamiDalton4:07 12 Jun '08  
QuestionCan't get which radiobutton is selected.....always gets checked = false Pinmemberamit_chudasama4:16 20 May '08  
RantThanks! Pinmemberagira22:44 11 May '08  
GeneralExcellent - Thank you PinmemberGeek Queen12:58 15 Apr '08  
GeneralRe: Excellent - Thank you Pinmembererax dan7:16 21 Jul '08  
Generalproblem is related to radio button list Pinmemberkrishnaveer5:21 3 Apr '08  
GeneralCool. thanks a lot PinmemberMember 98160623:04 12 Mar '08  
GeneralThank you PinmemberGlebowski2:58 11 Mar '08  
GeneralNice Pinmemberanzatechnologies22:20 13 Mar '08  
GeneralGreat Thanks Pinmembersstrega16:18 20 Feb '08  
QuestionGetting error .. Pinmemberumesh090:20 30 Jan '08  
GeneralRe: Getting error .. Pinmemberumesh090:39 30 Jan '08  
GeneralRe: Getting error .. PinmemberMember 37798830:53 16 Jul '08  
GeneralRe: Getting error .. Pinmembersherazl3:21 14 May '09  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 11 Aug 2004
Editor: Smitha Vijayan
Copyright 2004 by Vladimir Smirnov
Everything else Copyright © CodeProject, 1999-2009
Web20 | Advertise on the Code Project