- PR -

ButtonコントロールのDialogResultプロパティを拡張したい

1
投稿者投稿内容
サンジ
会議室デビュー日: 2008/09/14
投稿数: 12
投稿日時: 2008-12-04 10:51
VB2008で開発しています。

子画面がありまして、その画面にはいくつかのボタンが配置されています。
それぞれのボタンを押下すると、その子画面が終了するのですが、
DialogResultに用意されたプロパティ値以外の値を返したい場合があります。

Buttonコントロールを継承して
DialogResultプロパティをオーバーライドするなどして、
対応できないものかと考えているのですが、
私の力では難しかったです。

具体的には、DialogResultプロパティの型を新しい型に変更してみたのですが、
それでは、継承できないとエラーとなってしまいます。
そのため、元となったEnum値(System.Windows.Forms.DialogResult)を
継承して拡張してみようかと思ったのですが、
どのように記載して良いものかわからなくなってしまいました。

現在のソースです。
コード:
Public Class ButtonEx
    Inherits Button

    Public Overrides Property DialogResult() As System.Windows.Forms.DialogResult
        Get
            Return MyBase.DialogResult
        End Get
        Set(ByVal value As System.Windows.Forms.DialogResult)
            MyBase.DialogResult = value
        End Set
    End Property

End Class



私の考え方は間違っているのでしょうか?
もしそうであれば、ぜひご指摘ください。

またどのように解決していったら良いか、
アドバイスいただけますと、とても助かります。

ぜひ、よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-12-04 11:22
引用:

サンジさんの書き込み (2008-12-04 10:51) より:

子画面がありまして、その画面にはいくつかのボタンが配置されています。
それぞれのボタンを押下すると、その子画面が終了するのですが、
DialogResultに用意されたプロパティ値以外の値を返したい場合があります。


まず正直な感想は、そんな場合なんてあるものなのでしょうか。 というところです。 つまりこれは特殊な場合ですね。

引用:

Buttonコントロールを継承してDialogResultプロパティをオーバーライドするなどして、
対応できないものかと考えているのですが、私の力では難しかったです。


DialogResult で対応できない時点で特殊なので、DialogResult に拘る必要はないと思います。 独自のプロパティで良いのではないでしょうか。 Shadows (new) で隠せないこともないですが、メリットは感じません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
サンジ
会議室デビュー日: 2008/09/14
投稿数: 12
投稿日時: 2008-12-04 12:01
引用:

じゃんぬねっとさんの書き込み (2008-12-04 11:22) より:
DialogResult で対応できない時点で特殊なので、DialogResult に拘る必要はないと思います。 独自のプロパティで良いのではないでしょうか。 Shadows (new) で隠せないこともないですが、メリットは感じません。



ご回答ありがとうございます。
素直に新しいプロパティを作成することに致しました。

せっかくなので、もう一つ教えて頂きたいのですが、
Clickイベントを継承して、DialogResultと同じような動きをさせたいと考えています。
その場合に、Button側からその元となったFormを閉じたいのですが
画面を閉じるためには、どのようなプログラムを書けば良いのでしょうか?

もちろん各フォームのボタンのクリックイベントで
Me.Closeを書けば済む話なのですが、
可能であればButton側にその処理をさせたいのです。

もしご存じであれば、教えて頂けませんか?
ぜひ、よろしくお願いいたします。
なかむら
ベテラン
会議室デビュー日: 2008/11/11
投稿数: 67
お住まい・勤務地: 福岡
投稿日時: 2008-12-04 12:37
Button の Parent プロパティをたどって親 Form を探す方法や、
Button の派生クラスに親 Form をセットするプロパティを用意する方法が
簡単だと思います。

そしてクリックされたときに、その Form を Close すればいいかと。

_________________
Nakamura Blog

[ メッセージ編集済み 編集者: なかむら 編集日時 2008-12-04 12:38 ]
サンジ
会議室デビュー日: 2008/09/14
投稿数: 12
投稿日時: 2008-12-04 13:08
引用:

なかむらさんの書き込み (2008-12-04 12:37) より:
Button の Parent プロパティをたどって親 Form を探す方法や、
Button の派生クラスに親 Form をセットするプロパティを用意する方法が
簡単だと思います。

そしてクリックされたときに、その Form を Close すればいいかと。



ありがとうございます。
Parentプロパティを使用して閉じることができました。
とても助かりました。
コード:
DirectCast(Me.Parent, Form).Close()

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-12-04 17:13
引用:

サンジさんの書き込み (2008-12-04 12:01) より:

せっかくなので、もう一つ教えて頂きたいのですが、
Clickイベントを継承して、DialogResultと同じような動きをさせたいと考えています。
その場合に、Button側からその元となったFormを閉じたいのですが
画面を閉じるためには、どのようなプログラムを書けば良いのでしょうか?


元の DialogResult を Shadows するなら DialogResult に None 以外の何かを予め入れておけば勝手に閉じるというモノグサ法もあります。 見た目わかりにくくなりますが、親を意識しなくても良いですね。

引用:

DirectCast(Me.Parent, Form).Close()


これではダメです。 コンテナ コントロールに入っていた場合にキャストミスします。 せめて FindForm メソッドを使いましょう。 Nothing のチェックもしておきましょう。 Parent プロパティで辿っていくのであれば型チェックも必要です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
サンジ
会議室デビュー日: 2008/09/14
投稿数: 12
投稿日時: 2008-12-05 09:35
引用:

じゃんぬねっとさんの書き込み (2008-12-04 17:13) より:
元の DialogResult を Shadows するなら DialogResult に None 以外の何かを予め入れておけば勝手に閉じるというモノグサ法もあります。 見た目わかりにくくなりますが、親を意識しなくても良いですね。



見た目がわかりにくいため、これはなるべく避けたいと思っておりました。


引用:

これではダメです。 コンテナ コントロールに入っていた場合にキャストミスします。 せめて FindForm メソッドを使いましょう。 Nothing のチェックもしておきましょう。 Parent プロパティで辿っていくのであれば型チェックも必要です。


コンテナコントロールのことを考えておりませんでした。
ご教示頂きありがとうございます。
とても勉強になりました。



[ メッセージ編集済み 編集者: サンジ 編集日時 2008-12-05 09:36 ]
1

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