改訂版:DataGrid内のラジオボタンでグループに出来ない問題の回避方法

既に

http://d.hatena.ne.jp/NAL-6295/20060726

にて再度改訂済みです。

■[ASP.NET][.NET Tips]過去のサンプルの修正DataGrid内のラジオボタンでグループに出来ない問題の回避方法

NAL-6295の舌先三寸 – つまらない事の中に重要な事がある。

というエントリで公開していたソースでは

テキスト部分をクリックすると最後のラジオボタンが選択される。

という問題がありました。

それを解決したソースを以下に公開しておきます。

説明をすると、

ClientIDをオーバライドして、GroupNameプロパティが設定されているときのみMyBase.UniqueIDを返す処理

を追加しました。

001 Imports System.ComponentModel
002 Imports System.Web.UI
003 
004 
005 <DefaultProperty("Checked"), ToolboxData("<{0}:RadioButtonEx runat=server></{0}:RadioButtonEx>")> _
006  Public Class RadioButtonEx
007     Inherits System.Web.UI.WebControls.RadioButton
008 
009     Public Overrides ReadOnly Property UniqueID() As String
010         Get
011             If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then
012                 Return MyBase.UniqueID
013             Else
014                 Return Me.GroupName()
015             End If
016         End Get
017     End Property
018 
019     Public Overrides ReadOnly Property ClientID() As String
020         Get
021             If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then
022                 Return MyBase.ClientID
023             Else
024                 Return MyBase.UniqueID
025             End If
026         End Get
027     End Property
028 
029     Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
030         Me.Attributes.Add("value", MyBase.UniqueID)
031         MyBase.OnPreRender(e)
032     End Sub
033 
034     Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
035         MyBase.OnInit(e)
036         If Me.Page.IsPostBack Then
037             Me.Checked = MyBase.UniqueID = Me.Page.Request.Form.Item(Me.GroupName)
038         End If
039     End Sub
040 End Class
041 

FacebookTwitterHatenaTumblr共有

参照型と値型の値渡しと参照渡しについて

型は大別すると参照型と値型にわけられる。

だから引数として渡すパターンとして、

参照型の値渡しと参照渡し

値型の値渡しと参照渡し

がある。

参照型と値型のそれぞれが何を値として持っているかに着目すれば、

参照型と値型で値渡しと参照渡しの動作は変わらないのだけど、

そこに着目しないと参照型と値型で動作が変わる様に感じるかもしれない。

とはいえ、着目しなくても4パターン知ってればよいわけだから、

そんなに難しい話でもない。

値型は実体そのものが値である。

参照型は実体への参照が値である。

値渡しは保持しているものは変更できないという事。

(値のコピーを渡しているに過ぎないから、呼び元の変数の値に影響は与えられないという事)

だから、参照型が参照している実体の中身は変更が可能。

参照渡しは保持しているものを変更できるという事。

(値の参照を渡しているから、呼び元の変数の値に影響を与えてしまうという事)

だから、参照型が参照している先を変更できてしまう。

より自由度が高く、そして殆どの局面で利用する必要がない。

参照型の参照渡しが必要な設計は殆どの場合、あまり良い設計とは言えず、

(殆どの場合であり、全てが良い設計ではないとは思わない。

 必要な局面も確実にある。)

一度、戻り値で返す設計にできないか検討するべきだと思う。

過去にこんなエントリもありました。

メソッドを定義するときに、refキーワードを参照型に付けたときと付けなかったときの違いは、簡単に言えば・・・

・ref付きは参照する場所を変更出来る。

・ref無しは参照する場所を変更出来ない。

・両方とも、参照先のオブジェクトが持った値を変更する事は可能。

NAL-6295の舌先三寸 – 参照型にrefキーワードがついている時とついていない時の違い