2017-08-10 12 views
0

私はフォーム間の変数の受け渡しと回答の取得について質問しました。私は単純なフォームでそれらをテストし、それは働いた。私はグローバル変数クラスとパブリック変数を作成し、それは動作するように見えました。しかし、私は実際のプログラムで同じことを試みました。それは動作しないと私は理由を把握することはできません。渡し変数が動作しない

基本的に私は在庫を表示するフォームを持っています。各項目には大文字のフィールドがあります。ボタンをクリックすると、VATフォームが開き、別のVAT IDがDataGridから選択されます。 VAT IDがすでに開いている在庫画面に戻ってその項目の大まかなテキストボックスを更新する必要がある選択ボタンをクリックすると、この画面の

view inventory screen

私はvatidの横にあるボタンをクリックすると、それは私は、この画面用バットタイプ

コードはここに

Imports MySql.Data.MySqlClient 

Public Class frmviewinventory 
    Dim mysqlconn As MySqlConnection 
    Dim command As MySqlCommand 
    Dim dbdataset As New DataTable 
    'Public recvatid As Integer 

    Private Sub load_table() 'routine to refresh database and reload datagrid 

     mysqlconn = New MySqlConnection 
     mysqlconn.ConnectionString = "server=localhost;userid=root;password=1234;database=fabpos" 
     Dim reader As MySqlDataReader 
     Dim sda As New MySqlDataAdapter 
     ' Dim dbdataset As New DataTable 
     Dim bsource As New BindingSource 


     Try 
      mysqlconn.Open() 
      Dim query As String 

      query = "select * from fabpos.inventory" 
      command = New MySqlCommand(query, mysqlconn) 
      sda.SelectCommand = command 
      sda.Fill(dbdataset) 
      bsource.DataSource = dbdataset 
      dginventory.DataSource = bsource 
      sda.Update(dbdataset) 
      reader = command.ExecuteReader 

      mysqlconn.Close() 

     Catch ex As MySqlException 
      MessageBox.Show(ex.Message) 
     Finally 
      mysqlconn.Dispose() 

     End Try 
    End Sub 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles btnloadgrid.Click 
     dbdataset.Clear() 
     load_table() 

    End Sub 

    Private Sub btnclose_Click(sender As System.Object, e As System.EventArgs) Handles btnclose.Click 

     Me.Close() 

    End Sub 

    Private Sub frmviewinventory_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 

     optdescription.Checked = True 
     txtsearch.Select() 
     load_table() 

     dginventory.Columns.Item(0).Width = 50 
     dginventory.Columns.Item(1).Width = 50 
     dginventory.Columns.Item(2).Width = 90 
     dginventory.Columns.Item(3).Width = 300 

    End Sub 

    Private Sub txtsearch_TextChanged(sender As System.Object, e As System.EventArgs) Handles txtsearch.TextChanged 

     Dim dv As New DataView(dbdataset) 

     If optstockcode.Checked = True Then 

      dv.RowFilter = String.Format("stockcode like '%{0}%'", txtsearch.Text) 
      dginventory.DataSource = dv 

     ElseIf optbarcode.Checked = True Then 

      dv.RowFilter = String.Format("barcode like '%{0}%'", txtsearch.Text) 
      dginventory.DataSource = dv 

     ElseIf optdescription.Checked = True Then 

      dv.RowFilter = String.Format("description like '%{0}%'", txtsearch.Text) 
      dginventory.DataSource = dv 

     ElseIf optbin.Checked = True Then 

      dv.RowFilter = String.Format("binlocation like '%{0}%'", txtsearch.Text) 
      dginventory.DataSource = dv 
     End If 

     'dv.RowFilter = String.Format("stockcode like '%{0}%'", txtsearch.Text) 
     'dginventory.DataSource = dv 

    End Sub 

    Private Sub optstockcode_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles optstockcode.CheckedChanged 
     txtsearch.Select() 
    End Sub 

    Private Sub optbarcode_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles optbarcode.CheckedChanged 
     txtsearch.Select() 
    End Sub 

    Private Sub optdescription_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles optdescription.CheckedChanged 
     txtsearch.Select() 
    End Sub 

    Private Sub optbin_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles optbin.CheckedChanged 
     txtsearch.Select() 
    End Sub 
    Private Sub frmviewinventory_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 

     If (e.KeyCode = Keys.Escape) Then 
      Me.Close() 
     End If 

    End Sub 
    Private Sub dginventory_SelectionChanged(sender As Object, e As EventArgs) Handles dginventory.SelectionChanged 

     Dim i As Integer 
     i = dginventory.CurrentRow.Index 
     Me.txtid.Text = dginventory.Item(0, i).Value.ToString 
     Me.txtstockcode.Text = dginventory.Item(1, i).Value.ToString 
     Me.txtbarcode.Text = dginventory.Item(2, i).Value.ToString 
     Me.txtdescription.Text = dginventory.Item(3, i).Value.ToString 
     Me.txtrecname.Text = dginventory.Item(4, i).Value.ToString 
     Me.txtvatid.Text = dginventory.Item(5, i).Value.ToString 
     Me.txtcostexcl.Text = dginventory.Item(6, i).Value.ToString 
     Me.txtvatamt.Text = dginventory.Item(7, i).Value.ToString 
     Me.txtcostincl.Text = dginventory.Item(8, i).Value.ToString 
     Me.txtmu.Text = dginventory.Item(9, i).Value.ToString 
     Me.txtspexcl.Text = dginventory.Item(10, i).Value.ToString 
     Me.txtspincl.Text = dginventory.Item(11, i).Value.ToString 
     Me.txtprofit.Text = dginventory.Item(12, i).Value.ToString 
     Me.txtgp.Text = dginventory.Item(13, i).Value.ToString 

    End Sub 

    Private Sub btngetvat_Click(sender As Object, e As EventArgs) Handles btngetvat.Click 

     Dim getvat As New frmvat 
     getvat.Show() 
     getvat.btnselect.Visible = True 

    End Sub 

End Class 
で選択し、そこからバットフォームを開く必要がありますしたいです

バット画面は、ここでは、インベントリ画面に戻ってグローバル変数を渡すことになっている vat form コードです

Private Sub dgvat_SelectionChanged(sender As Object, e As EventArgs) Handles dgvat.SelectionChanged 

    Dim i As Integer 
    i = dgvat.CurrentRow.Index 
    Me.txtvatid.Text = dgvat.Item(0, i).Value.ToString 
    Me.txtvatcode.Text = dgvat.Item(1, i).Value.ToString 
    Me.txtvatdescription.Text = dgvat.Item(2, i).Value.ToString 
    Me.txtvatpercentage.Text = dgvat.Item(3, i).Value.ToString 
    globalvariables.vatidvariable = Convert.ToInt32(txtvatid.Text) 


End Sub 

Private Sub btnselect_Click(sender As Object, e As EventArgs) Handles btnselect.Click 

    globalvariables.vatidvariable = Convert.ToInt32(txtvatid.Text) 
    frmviewinventory.txtvatid.Text = globalvariables.vatidvariable 
    Me.Close() 

End Sub 

私のパブリッククラスは、私はちょうど2形式とテキストボックスとシンプルなアプリでこれを試してみましたが、それは完璧に動作

Public Class globalvariables 

Public Shared vatidvariable As String 
Public Shared testvariable As String 


End Class 

ここにあります。しかし、私の実際のプログラムではそうはしません。大惨事は依然として同じです。

テキストbosexの読み取り専用プロパティと有効なプロパティを確認しても問題ありません。私はグレーになっています。

ご協力いただきますようお願い申し上げます。

+0

読む[尋ねる]と[ツアー]を行ってください。最初は将来の質問でDVを避けるのに役立ちます。 2番目は、答えが得られたときにすべきことなど、SOの仕組みを説明しています。 – Plutonix

答えて

1

グローバル変数を使用しないでください。それは変だ。ダイアログでは、プロパティまたはメソッドを使用して適切なデータを使用できるようにし、呼び出し元はメソッドのプロパティからデータを取得する必要があります。たとえば、のは、Form1ディスプレイForm2は、ユーザーがForm2TextBoxにテキストを入力し、そのテキストがForm1Labelに表示されなければならないとしましょう:

Public Class Form2 

    Public ReadOnly Property TextBoxText As String 
     Get 
      Return TextBox1.Text 
     End Get 
    End Property 

End Class 


Public Class Form1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Using dialogue As New Form2 
      If dialogue.ShowDialog() = DialogResult.OK Then 
       Label1.Text = dialogue.TextBoxText 
      End If 
     End Using 
    End Sub 

End Class 

プロパティは、あなたが好きなデータを公開することができます。それは直接コントロールのプロパティである必要はありません。また、このコードには、直接関連していないOKまたはCancelを返すダイアログが含まれていないことにも注意してください。

これはあなたの質問に直接答えませんが、より良い仕組みを提供し、コメントにすべてのコードを含めることができませんでした。

1

あなたの次のメソッドは、ここでは、このフォームではなく、あなたのバットフォームを開いた1の新しいインスタンスに値を設定している

誤っ
Private Sub btnselect_Click(sender As Object, e As EventArgs) Handles btnselect.Click 

    globalvariables.vatidvariable = Convert.ToInt32(txtvatid.Text) 
    '**** The following code line is misleading you 
    frmviewinventory.txtvatid.Text = globalvariables.vatidvariable 
    Me.Close() 

End Sub 

の変数を設定しています。 getvat.Show()コードの後に​​、ビューインベントリ画面のglobalvariables.vatidvariableに直接アクセスすることができます。より適切に、次の

If getvat.ShowDialog() = DialogResult.OK Then 
    txtvatid.Text = globalvariables.vatidvariable 
End If 

getvat.Show()行を置き換え、それはあなたのために働くことを願っています。 グローバル変数を使用しない方が良いでしょう。

+0

こんにちは、返信いただきありがとうございます。私はまだ理解していません。 ビューインベントリフォームが開いているかどうかを確認し、開いているビューインベントリフォームのテキストボックスに値を戻します。 もglobalvariables.vatidvariableがバットフォームのデータグリッドで私をクリックし、レコードから値を取得します。私は 'dgvat_SelectionChanged'イベントであなたの' vatidvariable'変数を割り当てる –

+0

1.最初のバットフォームを開き、バットのIDを選択する必要があります。 2.あなたの 'btnselect_Click'イベントはフォームを閉じます。 3. 'btngetvat_Click'イベントは' .ShowDialog'メソッドを使ってフォームを開きます。上記の私が答えたこのイベントのコードを使用してください。 –

+0

こんにちは、私はあなたのコードを試したが、それでも動作しません。 getvat.ShowDialog()= DialogResult.OKそして txtvatid.Text = globalvariables.vatidvariable getvat.btnselect.Visible =場合新規 をfrmvatようiは、次のコード '薄暗いgetvatとバットフォームを開くビューインベントリ画面で 真 END IF " バットの形でちょうどバットフォーム小枝のme.closeを閉じている場合() が、ビューインベントリ内txtvatidテキストボックスがまだ同じまま。 –

関連する問題