ダイアログやフォームを開くとき、そのフォームに対して値を渡す方法を記述します。


続きを読む

 

概要

ここでは別フォームに対してパラメータを渡し、その値を別フォームで編集して返すコードを記述します。

別フォームに値を渡す方法として Showメソッド に対して引数を追加しています。
Showメソッド の戻り値として別フォームから値を受け取ります。
つまりShowメソッドをオーバライドして独自のメソッドを作っています。

同じようなコードは Google先生にきけば いくらでも出てくるのですが、
ダイアログに対して値を渡すだけで、そのまま捨ててしまうものばかりです。
申し訳ないのですがそんなゴミコードをいくら教えてもらっても全く持って意味がないです。

というわけで、ちょっとサンプルを載せることにします。
ついでに ShowDialogメソッド は使用しないため削除(見えないように)しています。

 

実行環境

Microsoft Visual Studio 2008 Professional(VB.NET)
.NET Framework 2.0
※2003/2005でも、それ以降でも同じことができます。

 

サンプルプロジェクト

ここで使用するプロジェクトは以下からダウンロードできます。
サンプルプロジェクトのダウンロード

解凍すると以下の構成になっています。

    ./SampleProject
       + SampleProject
       |  + frmMain.vb         ----> メインフォームクラス
       |  + dlgEdit.vb         ----> 値を渡すダイアログ
       + SampleProject.sln     ----> プロジェクトファイル
       + SampleProject.suo

 

ダイアログ(別フォーム)呼び出し側の処理

以下にコードを示します。
ボタンを押すとダイアログを開く、それだけです。
ここではテキストボックスに入力された文字列をダイアログに渡しています。

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Public Class frmMain
‌ 
    Private Sub btnDlgOpen_Click(ByVal sender As System.Object, _
                                 ByVal e As System.EventArgsHandles btnDlgOpen.Click
‌ 
        ' ====== テキスト編集ダイアログのインスタンスを生成
        Dim myDialog As dlgEdit = New dlgEdit
‌ 
        ' ====== ダイアログを開いてテキストボックスの内容を編集
        Dim myResult As dlgEdit.EditDialogResult = myDialog.Show(Me, txtInput.Text)
‌ 
        ' ====== 編集された結果をテキストボックスに反映
        If Not myResult Is Nothing Then
            txtInput.Text = myResult.Text
        End If
‌ 
        ' ====== インスタンスを破棄(GCが勝手に動くのでやらなくてもいい)
        myResult = Nothing
‌ 
‌ 
        ' ====== デザイナからダイアログを追加している場合、dlgeditのインスタンスを生成せず
        ' ====== 以下のようにダイアログ名で直接指定しても良い
        'dlgEdit.Show(Me, txtInput.Text) 
    End Sub
End Class
‌ 
このコードは CodePublish で生成しています

 

ダイアログ(別フォーム)側の処理

以下にコードを示します。
Showメソッド呼び出し時に文字列を保存し、フォームロード時にテキストボックスに格納しています。
ここでDialogResultは意味がないため使用していません。
またこのサンプルでは×ボタンが押されたときのことは考えていません。
対応する場合、Load時に d_MyEditText を破棄し、OKボタン押下時に New すれば完璧だと思います。

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
Option Strict On
Option Explicit On
‌ 
Public NotInheritable Class dlgEdit
‌ 
    '''===========================================================
    ''' <summary>ダイアログ戻り値クラス</summary>
    '''  ----
    ''' = ◆ 備考
    '''  ----
    ''' <remarks>
    '''      <para>ダイアログの戻り値として使用します。</para>
    '''      <para>戻り値としてNothing判定ができるため便宜的にクラスにしています。</para>
    '''      <para>戻り値を単純にString型とすると、NullとNothing判定が難しいのです。</para>
    ''' </remarks>
    '''  ----
    Public Class EditDialogResult
        ''' <summary>編集されたテキスト</summary>
        Public Text As String
‌ 
        ''' <summary>コンストラクタ</summary>
        Sub New()
            Me.Text = vbNullString
        End Sub
‌ 
    End Class
‌ 
‌ 
    '''===========================================================
    ''' <summary>ダイアログ戻り値格納メンバ</summary>
    '''===========================================================
    Private d_MyEditText As EditDialogResult = Nothing
‌ 
‌ 
    ''' ==========================================================
    ''' = ◆ 関数機能
    '''  ----
    ''' <summary>
    '''      <para>ダイアログ表示メソッド</para>
    ''' </summary> 
    '''  ----
    ''' <param name="avOwner">
    '''      <para>このダイアログのオーナーウィンドウ</para>
    ''' </param>
    '''  ----
    ''' <param name="avEditText">
    '''      <para>編集するテキスト</para>
    ''' </param>
    '''  ----
    ''' = ◆ 戻り値
    '''  ----
    ''' <returns>
    '''      <para>編集されたテキストが返ります。</para>
    '''      <para>キャンセルされたときNothingが返ります。</para>
    ''' </returns>
    '''  ----
    ''' = ◆ 備考
    '''  ----
    ''' <remarks>
    '''      <para>元々あったShowメソッドを隠してしまいます</para>
    ''' </remarks>
    ''' ===========================================================
    Public Shadows Function Show(Optional ByVal avOwner As  _
                        System.Windows.Forms.IWin32Window = Nothing, _
                              Optional ByVal avEditText As String = vbNullString) _
                                                                   As EditDialogResult
‌ 
        ' ====== 編集テキスト用の新しいインスタンスを生成
        d_MyEditText = New EditDialogResult
‌ 
        ' ====== 引数のテキストを保存
        d_MyEditText.Text = avEditText
‌ 
        ' ====== 基底クラスのダイアログを開く(このクラスのShowDialogは殺している)
        If avOwner Is Nothing Then
            MyBase.ShowDialog()
        Else
            MyBase.ShowDialog(avOwner)
        End If
‌ 
        ' ====== 編集された値を返す
        Return d_MyEditText
    End Function
‌ 
‌ 
‌ 
    ''' ==========================================================
    ''' = ◆ 関数機能
    '''  ----
    ''' <summary>
    '''      <para>ShowDialog</para>
    ''' </summary> 
    '''  ----
    ''' = ◆ 備考
    '''  ----
    ''' <remarks>
    '''      <para>使わないので死んでもらいます。</para>
    '''      <para>このダイアログクラス内からもアクセスできません。</para>
    '''      <para>EditorBrowsableState.Neverにすることで、</para>
    '''      <para>インテリセンスにも表示されません。</para>
    ''' </remarks>
    ''' ===========================================================
    <System.ComponentModel.EditorBrowsable( _
                System.ComponentModel.EditorBrowsableState.Never), _
                    Obsolete("This method should not be used.")> _
    Public Shadows Function ShowDialog( _
                         ByVal avOwner As System.Windows.Forms.IWin32Window) _
                                           As System.Windows.Forms.DialogResult
        Throw New ApplicationException("This method should not be used.")
        Return (Nothing)
    End Function
‌ 
‌ 
‌ 
    '=================================================================
    '   以下フォームの処理
    '=================================================================
    Private Sub OK_Button_Click(ByVal sender As System.Object, _
                        ByVal e As System.EventArgsHandles OK_Button.Click
        ' ====== テキストボックスの値を格納して終了
        d_MyEditText.Text = txtEdit.Text
        Me.Close()
    End Sub
‌ 
    Private Sub Cancel_Button_Click(ByVal sender As System.Object, _
                        ByVal e As System.EventArgsHandles Cancel_Button.Click
        ' ====== キャンセルされたのでインスタンスを破棄
        d_MyEditText = Nothing
        Me.Close()
    End Sub
‌ 
    Private Sub dlgEdit_Load(ByVal sender As System.Object, _
                        ByVal e As System.EventArgsHandles MyBase.Load
‌ 
        ' ====== テキストボックスに、Showメソッドでもらった値を設定
        Me.txtEdit.Text = d_MyEditText.Text
    End Sub
End Class
このコードは CodePublish で生成しています

コメント

時計コピー

電池交換したばかりなのに止まってしまったストップウォッチ機能などのついた時計は電池消耗が早く電池寿命も短くなりますが、それでも一般的には新品の電池寿命は1年 ...国産時計はもちろん、その他スポット商品、人気ブランド商品など、数多く取り揃えております。 また、時計電池交換、その他修理うけたまわります。 お気軽にスタッフまでお ...http://sakurawow.com/hgwares/wow-Watch/

かえる(管理者)

  • URL

商標法第37条、67条、78条に違反した業者(i114-181-145-214.s05.a013.ap.plala.or.jp)からのスパムが酷いため、
これ以上続くようであれば "ぷらら" からのアクセスを禁止させていただきます。
尚、Proxy経由のアクセスは可能な限り拒絶しております。

レジスタは上海のようですので、中華業者であることは間違いありません。
いくつものスパムフィルタを掻い潜って投稿するのですから、大したものです。

この業者の責任者は本田幸郎、森谷太郎、三木栗原などと複数の名前を騙っており、
本拠地は中国のアパートの一室の模様(真偽不明)。また、以下も関連する違法業者です。
www.jpwatch2019.com
www.jpprobags.com
jpwatchshop.net
wewin777.com

ルイヴィトンコピー

  • URL

流行する包装の周期間で、あなたはルイヴィトンコピーショー場の入口が黒色の制服のを身につけていてに観衆の身分証と入場券を検査するように守るあることを見ます。仕入商さえ□頭の知らせを要して事前に方の見通しのを主催して金額を買ってようやく招待状を獲得することができます。
たとえあなたは流行する界の業界の従事者ですとしても、とても高い知名度がない限り、さもなくばどうしても良い席の不便なことを奪い合わなければならないことがもいます。

コメントを投稿する

コメントを投稿する場合は以下に注意してください。

・記事に関係する内容であること
・特別な理由がない限り「全体公開」であること

これさえ守っていただければどんな内容でも投稿可能です。
皆様の質問やコメントは他の方の問題解決に繋がりますのでご協力ください。

コメント投稿フォーム
名前
メール
URL
コメント
閲覧制限

コメントを投稿するには、以下の問題に答えてください。
問題:「電流の標準単位をカタカナ4文字で入力してください」