tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルFORM間の値渡し
記事No3955
投稿日: 2006/07/10(Mon) 22:24
投稿者Ear
 こんばんは。

VB2005で、FORM間の値渡し方法を教えて下さい。

FORM1にボタンとラベルがあります。ボタンをクリックすると
FORM2が表示され、テキストボックスで文字を入力し
入力した文字をFORM1のラベルに表示させたいのです。

このような場合、どのようなコードになりますか?
宜しく、お願いします。

[ツリー表示へ]
タイトルRe: FORM間の値渡し
記事No3956
投稿日: 2006/07/10(Mon) 22:36
投稿者Hongliang
Form2 がモーダルかモードレスか(ShowDialog か Show か)でも方法論が変わってきますが……。
ShowDialog で表示するとして、一般的には Form2 の TextBox に入力された文字列を String 型のプロ
パティとして公開することでしょう。
OpenFileDialog とかもそう言う実装ですよね。

[ツリー表示へ]
タイトル公開とは
記事No3959
投稿日: 2006/07/11(Tue) 16:06
投稿者Ear
  ありがとうございます。

もう少しお願いします。

FORM1のボタンクリックで

Dim frm2 AS New Form2
frm2.ShowDialog(Me)
でForm2を表示するようにしました。

「Form2 の TextBox に入力された文字列を String 型のプロ
パティとして公開することでしょう。」

とありますが、具体的にどのようにするのか
教えて頂けませんか?

FORM2で
Public Property MyForm2TextBox()
        Get
とコーディングしていくのでしょうか?

申し訳ありません、宜しくお願いします。







[ツリー表示へ]
タイトルRe: 公開とは
記事No3960
投稿日: 2006/07/11(Tue) 16:31
投稿者るしぇ
> FORM2で
>  Public Property MyForm2TextBox()
>         Get
> とコーディングしていくのでしょうか?
サンプルに書いてあるもんね?
http://www.bcap.co.jp/hanafusa/dotnet/form09.htm
できてるなら質問する必要はないのでは?

http://www.bcap.co.jp/hanafusa/hazimeni.htm#keijiban
読んでから掲示板を利用して頂いているとは思いますが、
>2.質問される場合は、必ず下調べをしてから質問するようにして下さい。
サンプルコードがあるわけですし、コードの意味はヘルプに書いてあります。
いくら不安でも、1から10まで聞くものではありません。

[ツリー表示へ]
タイトルすいません
記事No3961
投稿日: 2006/07/11(Tue) 17:21
投稿者Ear
 るしぇさんの言われるとおりなのですが、
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)      

Handles Button1.Click
        MessageBox.Show(f2.MyForm2TextBox)

    End Sub

ではなく、FORM2からFORM1に戻った時にFORM2の入力した値を
FORM1のラベルにセットしたいのです。

どこでラベルに、どうセットするようにアレンジするのか
聞きたく、投稿しました。
もう少しだけ、聞かせて頂けませんか?

[ツリー表示へ]
タイトル追記です
記事No3962
投稿日: 2006/07/11(Tue) 17:36
投稿者Ear
 何が聞きたいのか、説明不足でした。

確かにURLの参考プログラムで値はとれますが、FORM2を閉じてFORM1にフォーカスを
戻すと値がとれないのです。この解消方法をお聞きしたいのです。

それと、FORM2.Showしますが
FORM1に戻りFORM2のテキストボックスで入力した値を
FORM1のどこでどう書くのか、この2点をお聞きしたいのです。

何度も投稿して申し訳ありません。

[ツリー表示へ]
タイトルRe: FORM間の値渡し
記事No3963
投稿日: 2006/07/11(Tue) 18:29
投稿者るしぇ
結構、色々なサイトの色々な場所で繰り返し質問されていることなんですが、
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=16450&rev=&no=0
のような背景がありまして、技術的にできるかどうかと、設計として良いか悪いかの
問題があります。
ここで Hongliang さんの
>Form2 がモーダルかモードレスか(ShowDialog か Show か)でも方法論が変わってきますが……。
という書込みが意味を持ってきますが、Show を採用されるということですので、FORM2 の
イベントで処理すれば良いんじゃないでしょうか?

>FORM2を閉じてFORM1にフォーカスを戻すと値がとれないのです。
閉じた時点でメモリ上の実体は破棄されていますからね。
既にこの世から消えたものから値をとるのは不可能です。
>FORM1に戻りFORM2のテキストボックスで入力した値を
>FORM1のどこでどう書くのか、この2点をお聞きしたいのです。
破棄される(閉じる)前ならどこででも取れますけど、それを決める
のは Ear さんでは?
 例えば、FORM2 にボタンを用意して、そのボタンが押された時に書くとか。
 例えば、FORM2 を閉じた時に書くとか。(それならShowDialogでいいと思い
ますが、何故 Show を使うんですか?)

処理の仕様を決めて頂けませんか?

ちなみに、あまり推奨される方法では無いと思うのですが、
http://www.bcap.co.jp/hanafusa/dotnet/formflm.htm
>Form1 からForm2 のテキストボックスの内容を読み書きする(プロパティ使用)
の下に
>Form2からForm1のテキストボックスの内容を読み書きする(プロパティ使用)
もちゃんと書いてありますが?
…初心者が簡単に理解するなら、これもありだとは思います。

[ツリー表示へ]
タイトルRe^2: FORM間の値渡し
記事No3964
投稿日: 2006/07/11(Tue) 18:57
投稿者るしぇ
…うう...む。
書いてあるのかな?
>ではなく、FORM2からFORM1に戻った時にFORM2の入力した値を
戻った時でいいのね?ってゆーか戻った時って閉じた時とは違うの?
閉じた時でサンプル書いておきます。

'/// Form1.vb

    Private WithEvents f2 As Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
        If f2 Is Nothing OrElse f2.IsDisposed Then
            f2 = New Form2
        End If
        f2.Show()
    End Sub

    Private Sub f2_Closing(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles f2.Closing
        Me.Label1.Text = f2.MyForm2TextBox
    End Sub

'/// Form2.vb

    Public Property MyForm2TextBox() As String
        Get 'TextBox1.Text の内容を取得
            Return Me.TextBox1.Text
        End Get
        'TextBox1.Text に書き込み
        Set(ByVal Value As String)
            Me.TextBox1.Text = Value
        End Set
    End Property

[ツリー表示へ]
タイトル最後に
記事No3965
投稿日: 2006/07/11(Tue) 19:50
投稿者Ear
 るしぇさん、ありがとうございます。
おかげさまで値はとれるようになりました。

最後に、もう1点だけお願いします。

コントロール追加のボタンをクリックすると、FORMにボタンとラベルを10個動的に作成します。
(数は後々変動的に変わります)
そこで、例えば1番目のボタンをクリックするとFORM2に変わり、テキストボックスで入力した値を
1番目のボタンの横のラベルにセットしたいのです。
2番目なら、2番目のラベルにセット。
ButtonClickのイベントハンドラを作成しましたが、何番目のボタンをクリックしたのか
また動的に追加したラベルの名前をどう判断するのか
ご教授頂けないでしょうか?

少し長いですが、コードを記述します。

   '*******************************************************************************
    Private Sub btnAddControl_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnAddControl.Click
        Dim CtrlType1 As String
        Dim CtrlType2 As String
        CtrlType1 = "System.Windows.Forms.Label"
        CtrlType2 = "System.Windows.Forms.Button"
        For mintX = 1 To mintMAX
            Me.AddControl("myControl", CtrlType1, CtrlType2)
        Next mintX
    End Sub
    '*******************************************************************************
    Sub AddControl(ByVal ControlName As String, ByVal ControlType1 As String, ByVal
ControlType2 As String)
        Dim asm As [Assembly]
        asm = GetType(Form).Assembly
        ControlObject = asm.CreateInstance(ControlType1)
        ControlObject.Name = ControlName
        ControlObject.Location = New System.Drawing.Point(100, 30 * mintX)
        Me.Controls.Add(ControlObject)

        DynLabel = ControlObject
        DynLabel.Width = 250
        DynLabel.BackColor = Color.LightYellow
        DynLabel.Text = ""

        asm = GetType(Form).Assembly
        ControlObject = asm.CreateInstance(ControlType2)
        ControlObject.Name = ControlName
        ControlObject.Location = New System.Drawing.Point(30, 30 * mintX)
        Me.Controls.Add(ControlObject)

        DynButton = ControlObject
        DynButton.Width = 50
        DynButton.Text = "表示"
        AddHandler DynButton.Click, AddressOf ButtonClick
    End Sub
    '*******************************************************************************
    Private Sub ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        If f2 Is Nothing OrElse f2.IsDisposed Then
            f2 = New Form2
        End If
        f2.Show()
    End Sub
    '*******************************************************************************
    Private Sub f2_Closing(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles f2.Closing
        Me.Label1.Text = f2.MyForm2TextBox
    End Sub

大変、申し訳ありません。宜しくお願いします。

    

[ツリー表示へ]
タイトルRe: 最後に
記事No3966
投稿日: 2006/07/11(Tue) 20:36
投稿者YAS
クラスなり構造体なり,何でも入る魔法の箱のTagプロパティに入れて渡してしまうというのはダメです
か。
(私は,とにかく動けばいいのだ!というときに時々やります。)

[ツリー表示へ]
タイトルできれば
記事No3968
投稿日: 2006/07/11(Tue) 22:16
投稿者Ear
 できれば、VB2005のエントリーの基本形みたいなものにしたかったので

Private Sub f2_Closing(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles f2.Closing
 Me.Label1.Text = f2.MyForm2TextBox
End Sub

この場所で動的に追加したボタンの何番目をクリックしたのか判断し
その隣のラベルに値をセットしたいのです。

初心者にて何度も投稿してすいません。

宜しく、お願いします。

[ツリー表示へ]
タイトルRe: できれば
記事No3982
投稿日: 2006/07/13(Thu) 23:10
投稿者YAS
うーん。やりたいことがはっきりとはわからないのですが,次のようなことですか?

Public Class Form1

    Dim MAX As Integer = 10

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles MyBase.Load
        Dim Button As New Button
        Button.Text = "ボタンの追加"
        Me.Controls.Add(Button)
        AddHandler Button.Click, AddressOf AddButton
    End Sub

    Private Sub AddButton(ByVal sender As System.Object, ByVal e As System.EventArgs)
        For i As Integer = 1 To MAX
            Dim Label As New Label
            Label.Location = New Point(30, 30 * i)
            Label.BorderStyle = BorderStyle.FixedSingle
            Label.Width = 70
            Me.Controls.Add(Label)
            Dim Button As New Button
            Button.Location = New Point(100, 30 * i)
            Button.Width = 50
            Button.Text = "表示"
            Button.Tag = Label
            Me.Controls.Add(Button)
            AddHandler Button.Click, AddressOf ButtonClick
        Next
    End Sub

    Private Sub ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim value As String = InputBox("入力してください")
        DirectCast(DirectCast(sender, Button).Tag, Label).Text = value
    End Sub

End Class

[ツリー表示へ]
タイトルsenderを...
記事No3990
投稿日: 2006/07/15(Sat) 17:00
投稿者Ear
 YASさん、遅くなって申し訳ありません。

senderをヒントに

        Dim intX As Integer
        For intX = 0 To btn.Length - 1
            If btn(intX).Equals(sender) Then
                Index = intX
                Exit For
            End If
        Next intX

とコーディングしクリックした行位置の値を取ることができました。

何度もありがとうございました。

[ツリー表示へ]