Using the ConwayControls RadioButton - Scenario 2
Scenario
Upon a simple asp:Button click event (postback), iterate the rows of a GridView finding the checked RadioButton
ASP.NET - RadioButtonSpike2.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="RadioButtonSpike2.aspx.cs" Inherits="RadioButtonSpike2" %> <%@ Register Assembly="ConwayControls" Namespace="ConwayControls.Web" TagPrefix="ccwc" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Radio Button Spike - Scenario 2</title> <style type="text/css" media="all"> div {padding-top: 10px;} h3 {display: inline;} </style> </head> <body> <form id="RadioButtonSpikeForm" runat="server"> <div> <asp:GridView ID="SurveyGrid" runat="server" AutoGenerateColumns="False"> <Columns> <asp:TemplateField HeaderText="Language"> <ItemTemplate> <asp:Label ID="NameLabel" runat="server" Text='<%# Eval("Name") %>' /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Favorite"> <ItemTemplate> <ccwc:RadioButton ID="FavoriteButton" runat="server" GroupName="FavoriteGroup" Value='<%# Eval("Id") %>' /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> <div> <asp:Button ID="ForPostBackButton" runat="server" Text="for post back" OnClick="ForPostBackButton_Click" /> </div> <div> <asp:Label ID="ResultsLabel" runat="server" /> </div> </div> </form> </body> </html>
C# (code behind) - RadioButtonSpike2.aspx.cs
using System; using System.Web.UI; using System.Web.UI.WebControls; using System.Collections.Generic; using CCW = ConwayControls.Web; public partial class RadioButtonSpike2 : Page { protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.IsPostBack) return; this.BindGrid(); } protected void BindGrid() { List<SurveyItem> items = new List<SurveyItem>(); items.Add(new SurveyItem(1, "C#")); items.Add(new SurveyItem(2, "VB")); items.Add(new SurveyItem(3, "Perl")); items.Add(new SurveyItem(4, "Java")); items.Add(new SurveyItem(5, "Ruby")); this.SurveyGrid.DataSource = items; this.SurveyGrid.DataBind(); } protected void ForPostBackButton_Click(object sender, EventArgs e) { foreach (GridViewRow row in this.SurveyGrid.Rows) { CCW.RadioButton radioButton = row.FindControl("FavoriteButton") as CCW.RadioButton; if (radioButton == null || !radioButton.Checked) continue; //the following label demonstrates the ability of grabbing other controls in the row and using it... Label label = row.FindControl("NameLabel") as Label; if (label != null) { string format = "favorite language: <h3>{0} (Id: {1})</h3>"; this.ResultsLabel.Text = string.Format(format, label.Text, radioButton.Value); break; } } } } public class SurveyItem { public SurveyItem(int id, string name) { this.id = id; this.name = name; } public int Id { get { return this.id; } set { this.id = value; } } private int id; public string Name { get { return this.name; } set { this.name = value; } } private string name; }
It is a good practice when iterating over a collection to continue after an unwanted test and break once you have found the item you were looking for.
As noted in the iteration of the GridViewRows inside the ForPostBackButton_Click method, I tested to ensure the RadioButton was found, that it was checked, and continued if it wasn't by using the continue keyword. Once the checked RadioButton was found, I broke the iteration using the break keyword. Both statements/uses prevent any unnecessary code execution which is even more important during iteration of a collection.
Please let me know if you have any questions with this particular scenario.
Thanks,
Jason Conway