2017-08-10 149 views
0

我问过在表单之间传递变量并获得答案。我用一个简单的表单测试了它们,它工作。我创建了一个全局变量类和一个公共变量,它似乎工作。但是当我在我的实际程序中尝试相同的东西时。它不工作,我不明白为什么。传递变量不起作用

基本上我有一个窗体显示库存。每个项目都有一个vatid字段。当我点击一个按钮时,我希望它打开增值税表格,并通过从数据网格中选择不同的增值税号码。那么当我点击一个选择按钮,增值编号必须返回到已经打开的库存屏幕并更新该项目的vatid文本框。

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 

我的公共类在这里

Public Class globalvariables 

Public Shared vatidvariable As String 
Public Shared testvariable As String 


End Class 

我已经试过这一个简单的应用程序只有2个表格和文本框和它完美的作品。但是在我的实际程序中并没有。并且vatid仍然保持不变。

我已经检查了文本bosex的只读属性和启用属性,它们都很好。即时变灰色。

任何帮助将不胜感激。

+0

请阅读[问]并参加[旅游]。第一个可以帮助避免未来的问题DV;第二个解释如何工作,如你应该做什么,当你得到一个答案 – Plutonix

回答

1

请勿使用全局变量。这是狡猾的。对话应通过属性或方法提供适当的数据,调用者应从方法属性中检索数据。例如,让我们说,Form1显示Form2,用户进入上Form2一些文本为TextBox,然后该文本应Form1显示在Label

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 

该属性可以暴露你想要的任何数据。它不一定是直接控制的属性。另请注意,此代码不包含对话返回OKCancel的机制,该机制并不直接相关。

这并不直接回答你的问题,但它提供了一个更好的机制,我几乎不能在评论中包含所有代码。

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。更适当地用以下代码替换getvat.Show()

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

希望它能为你工作。 没有全局变量可能会更好。

+0

嗨,感谢您的答复。但即时通讯仍然不理解。 我该如何检查viewinventory窗体是否打开,并将值传回给已打开的viewinventory窗体中的文本框。 此外,globalvariables.vatidvariable从我单击增值表单的数据网格的记录中获取它的值。我必须先打开增值税表,然后选择增值税号 –

+0

1.在'dgvat_SelectionChanged'事件中分配您的'vatidvariable'变量。 2.你的'btnselect_Click'事件将会关闭表单。 3.'btngetvat_Click'事件将使用'.ShowDialog'方法打开表单。只需在这个事件中使用我在上面提到的答案中的代码。 –

+0

嗨,我试过你的代码,但它仍然无法正常工作。 在视图清单屏幕我打开用下面的代码 '昏暗getvat作为新frmvat大桶形式 如果getvat.ShowDialog()= DialogResult.OK然后 txtvatid.Text = globalvariables.vatidvariable getvat.btnselect.Visible =真 结束如果' 在增值税形式,如果只是关闭增值税形式与me.close() 但视图库存txtvatid文本框仍然保持不变。 –

相关问题