- PR -

DataGridへのラジオボタンの設置について

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-03 08:31
引用:

sukeさんの書き込み (2002-07-22 13:34) より:

・・とのことでしたので、さっそくやってみたのですが、
『要素 'RadioButton' の属性 'Name' が見つかりませんでした。』
とのメッセージが出て、ビルドエラーになってしまいました。


 サーバ側で実行されるコードにて、

RadioButton.Attributes.Add("name", name)

という方法もあったような。。。
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2004-08-03 09:42
Mickyでございます。
いつもお世話になっております。

えっと、自分の場合はDataGridを使用するときは
動的に生成して使うのですが、この問題は同様に
発生しました。

調べた所「サポート技術情報 - 316495」と言うのが
MSDNにあって、「対処法のない不具合」という
認識だったんですよ(^^;

悩んだ挙句、ほやさんが紹介されているページと同様に
PostBackされた後に自前でラジオボタンの制御を
する様にしました。

Name属性を設定しても、.Netが自動で作成するName属性の方が
有効になってしまうようでした。

PsotBackを使用する方法はネットワーク環境のよくない所でも
使用する場合はViewState等のレスポンス対策にちょっと
工夫が必要かもしれません。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-08-03 10:32
NAL-6295です。

安直な方法ですが・・・

RadioButtonを継承したカスタムコントロールRadioButtonExを作成して、
UniqueIDをオーバライドして、
GroupNameが設定されていない時は、MyBase.UniqueIDを返して、
GroupNameが設定されている時は、GroupNameを返すようにすると、
うまくいきます。


コード:

<DefaultProperty("Checked"), ToolboxData("<{0}:optionButtonEx runat=server></{0}:optionButtonEx>")> Public Class RadioButtonEx
Inherits System.Web.UI.WebControls.RadioButton


Public Overrides ReadOnly Property UniqueID() As String
Get
If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then
Return MyBase.UniqueID
Else
Return Me.GroupName()
End If
End Get
End Property
End Class




[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-08-03 10:33 ]

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-08-03 10:36 ]
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2004-08-03 11:25
Mickyでございます。
NAL-6295さんこんにちは!
いつもお世話になっております。

引用:

NAL-6295さんの書き込み (2004-08-03 10:32) より:

RadioButtonを継承したカスタムコントロールRadioButtonExを作成して、
UniqueIDをオーバライドして、
GroupNameが設定されていない時は、MyBase.UniqueIDを返して、
GroupNameが設定されている時は、GroupNameを返すようにすると、
うまくいきます。



これだと、GroupNameを設定した際にIDが同じになってしまい、
PostBack時の動作でチェックされたラジオボタンの情報を
取得できないような気がしているのですが…

なにか見落としがあるのでしょうか?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-08-03 12:04
引用:

Mickyさんの書き込み (2004-08-03 11:25) より:
Mickyでございます。
NAL-6295さんこんにちは!
いつもお世話になっております。

引用:

NAL-6295さんの書き込み (2004-08-03 10:32) より:

RadioButtonを継承したカスタムコントロールRadioButtonExを作成して、
UniqueIDをオーバライドして、
GroupNameが設定されていない時は、MyBase.UniqueIDを返して、
GroupNameが設定されている時は、GroupNameを返すようにすると、
うまくいきます。



これだと、GroupNameを設定した際にIDが同じになってしまい、
PostBack時の動作でチェックされたラジオボタンの情報を
取得できないような気がしているのですが…

なにか見落としがあるのでしょうか?




一応、

UniqueIDプロパティ →クライアントサイドではName
ClientIDプロパティ →クライアントサイドではID

ということで、大丈夫だと思います。

#と思っていたのですが、ポストバック後の動作がうまくいかないですね。
#すいません。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-08-03 12:15 ]
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2004-08-03 18:15
Mickyでございます。

引用:

NAL-6295さんの書き込み (2004-08-03 12:04) より:
#と思っていたのですが、ポストバック後の動作がうまくいかないですね。
#すいません。



とんでもございませぬ。
RadioButtonを継承させていじってみると言うアイディアは
考えも付かなかったので、最初読んだときは、
すげぇ==!と思ったんですよ。

で、それをヒントにこねくり回してみました。(^^;

基本的に、最初に提示した技術情報より、
「name属性を一意に設定しないと、コントロールの識別ができない」
と言う仕様と
「グループ化するにはname属性を同じにしなければならない」
と言う矛盾のもとに発生する不具合の様でやはり単純な解決策は
見当たらないと言う所まで辿り着きました。

そこで考えたのが…
・RadioButtonを継承して、RadioButtonExを作成する
・Renderメソッドをオーバーライドして
id属性 = ClientID
name属性 = GroupName
valu属性 = UniqueID
とします。

これで、クライアントでの排他制御は出来るようになると思います。

次に、PostBack時の処理ですがこのままでは、name属性が全部同じなので
チェックされているRadioボタンが特定できません。
しかし、Request.Formプロパティを参照すると、設定したGroupNameより
選択されたRadioButtonのvalue属性が取得できます。

表示されているRadioButtonを順次参照して、value属性の値と
UniqueIDプロパティを比較して同じものがチェックされている
RadioButtonであると判断できます。

Checkedプロパティを直接参照できる根本的な解決にはなりませんが、
動作的にはOKだと思います。
しかし、あくまで局所的な対処方法ですので、
「name属性によるコントロールの特定が出来ない」と言う事が
どこかに影響するかもしれません。

それは一応御了承の上、参考になれば…と思います。

又、なにか問題があるようでしたら御指摘いただけると
ありがたいと思っております。



[ メッセージ編集済み 編集者: Micky 編集日時 2004-08-03 18:17 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-11-21 02:28
NAL-6295です。

今日まで、すっかり忘れていたのですが今Mickyさんの案をヒントに
試しにコントロールを継承して下のようなコードを書いたらポストバック時も、
正しくCheckedプロパティを拾えましたので、一応参考までに・・・

#落とし穴があったら教えてください。
#こういう時にはうまくいかなかったとか・・・

ここから修正

codeにデザイン時の制限があったため、修正したサンプルを掲載した自分のブログのURLを貼っておきます。
http://d.hatena.ne.jp/NAL-6295/20051023/p2

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-11-21 02:38 ]

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-10-23 16:32 ]

スキルアップ/キャリアアップ(JOB@IT)