GridView内でラジオボタンをグループ化する方法

2.0で起こる比較的有名なMSバグだが、どうやら3.0でも改善されていないらしい。
GridViewにRadioButtonコントロールを配置しても、IDが個々に振られてしまうため、グループ化できず、いくらでもラジオチェックできてしまうというもの。
javascriptを使用する等、回避法はあるが、ここは1つ、RadioButtonカスタムコントロールを作成する方が無難かと。あちこち、同様な内容が出回っているが、カスタムラジオボタンを作る上での必要そうなメソッド群を一応、メモ。
以下、publicなクラスCustomRadioButtonで記述。

protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
// このコントロールが選択されたか否か
bool newChecked = postCollection[GroupName] == this.UniqueID;
if (this.Checked != newChecked)
{
this.Checked = newChecked;
// コントロールが新たに選択されたときのみtrueを返す
return newChecked;
}
return false;
}

protected override void Render(HtmlTextWriter writer)
{
// 出力先を独自のTextWriterとして出力する
base.Render(new WriterWrapper(writer, this));
}

以下のprivateなクラスWriterWrapperも記述。

///


/// 属性を変更して出力するためのTextWriter
///

private class WriterWrapper : HtmlTextWriter
{
private CustomRadioButton control;

public WriterWrapper(HtmlTextWriter writer, CustomRadioButton control): base(writer)
{
// コントロールへの参照を保持しておく
this.control = control;
}

///


/// 属性の追加
///

/// 属性を表す列挙値
/// 属性に設定する値
///
/// RadioButtonが属性の設定のために本メソッドを呼び出すため、本メソッドで変更したい属性値を設定する
///

public override void AddAttribute(HtmlTextWriterAttribute key, string value)
{
switch (key)
{
case HtmlTextWriterAttribute.Name:
// ラジオボタンのグループを表す
// ユニークとせず、もともとプロパティで設定した値を出力する
base.AddAttribute(key, control.GroupName);
break;
case HtmlTextWriterAttribute.Value:
// POST時に出力する値を表す
// コントロールを識別する必要があるため、ユニークとする
base.AddAttribute(key, control.UniqueID);
break;
default:
base.AddAttribute(key, value);
break;
}
}
}

カスタム化しなくても、純正のRadioButtonが気兼ね無くGridViewに配置できる日が来る事を願う。