新人を指導する立場の人が、自分の指導が下手で新人が育たない。と嘆いていた。
指導が下手なのは、貴方が特別悪いわけではなく、
指導の仕方を知らないのに上手く出来るわけが無い。
というだけの事。
だから、コーチングするための戦略を練る必要があり、
戦略を練る為には、そのための情報を得る(コーチングの手法を学ぶ)必要がある。
今のままじゃ、ゴルフやったことの無い人がホールインワン出来なくて嘆いているような感じだ。
でも、彼にとっては「指導するって難しい。」って事に気づいただけでも収穫だったと思う。
■[ASP.NET][.NET Tips]改訂版:DataGrid内のラジオボタンでグループに出来ない問題の回避方法
■[ASP.NET][.NET Tips]過去のサンプルの修正DataGrid内のラジオボタンでグループに出来ない問題の回避方法
NAL-6295の舌先三寸 – つまらない事の中に重要な事がある。
というエントリで公開していたソースでは
テキスト部分をクリックすると最後のラジオボタンが選択される。
以前に(といっても1ヶ月前)この記事で改訂版を出していましたが、下記の制限がありました。
・プログラム側でcheckedの内容を変更すると、
次のポストバックのLoadViewState時にcheckedの内容が変更されて、
クライアントで選択されたcheckedの内容を取得できなかった。
(EnabledViewState=falseでも)
そこで、下記の改訂版を出すことにしました。
Group化する場合のみ、ViewStateを無視する仕様になっています。
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
041
042 Protected Overrides Sub LoadViewState(ByVal savedState As Object)
043 If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then
044 MyBase.LoadViewState(savedState)
045 End If
046 End Sub
047
048 Protected Overrides Function SaveViewState() As Object
049 If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then
050 Return MyBase.SaveViewState()
051 Else
052 Return Nothing
053 End If
054 End Function
055 End Class
056
VBでコーディングする時、
クラスのフィールドにWithEventsキーワードを設定すると、
コンパイル時、暗黙のうちに
_(アンダーバー)+対象のフィールド名
でフィールドが作成され、
対象のフィールド自体はプロパティ化される。
そのプロパティの中で、イベントの設定等が行われている。
ここまでだったら、コンパイル後の話という事で良いのだが、
実際に暗黙のうちに宣言されたフィールド自体がコード中で使えてしまい、
コンパイルエラーにならないし、警告にもならない。
普通にコンパイルできてしまう。
例えば、今まで_フィールド名で宣言していたものを、
フィールド名に変更したとして、
それを利用している箇所を修正すると思うのだけど、
修正漏れに気づかないといった状況があり得る。
コンパイルエラーか警告にしてくれたら良いのになぁと思う。
既に
http://d.hatena.ne.jp/NAL-6295/20060726
にて再度改訂済みです。
■[ASP.NET][.NET Tips]過去のサンプルの修正DataGrid内のラジオボタンでグループに出来ない問題の回避方法
というエントリで公開していたソースでは
テキスト部分をクリックすると最後のラジオボタンが選択される。
という問題がありました。
それを解決したソースを以下に公開しておきます。
説明をすると、
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
型は大別すると参照型と値型にわけられる。
だから引数として渡すパターンとして、
参照型の値渡しと参照渡し
値型の値渡しと参照渡し
がある。
参照型と値型のそれぞれが何を値として持っているかに着目すれば、
参照型と値型で値渡しと参照渡しの動作は変わらないのだけど、
そこに着目しないと参照型と値型で動作が変わる様に感じるかもしれない。
とはいえ、着目しなくても4パターン知ってればよいわけだから、
そんなに難しい話でもない。
値型は実体そのものが値である。
参照型は実体への参照が値である。
値渡しは保持しているものは変更できないという事。
(値のコピーを渡しているに過ぎないから、呼び元の変数の値に影響は与えられないという事)
だから、参照型が参照している実体の中身は変更が可能。
参照渡しは保持しているものを変更できるという事。
(値の参照を渡しているから、呼び元の変数の値に影響を与えてしまうという事)
だから、参照型が参照している先を変更できてしまう。
より自由度が高く、そして殆どの局面で利用する必要がない。
参照型の参照渡しが必要な設計は殆どの場合、あまり良い設計とは言えず、
(殆どの場合であり、全てが良い設計ではないとは思わない。
必要な局面も確実にある。)
一度、戻り値で返す設計にできないか検討するべきだと思う。
過去にこんなエントリもありました。
メソッドを定義するときに、refキーワードを参照型に付けたときと付けなかったときの違いは、簡単に言えば・・・
・ref付きは参照する場所を変更出来る。
・ref無しは参照する場所を変更出来ない。
・両方とも、参照先のオブジェクトが持った値を変更する事は可能。