2017-08-10 2 views
0

J'ai posé des questions sur la transmission de variables entre les formulaires et les réponses obtenues. Je les ai testés avec un formulaire simple et ça a marché. J'ai créé une classe variable globale et une variable publique et cela a semblé fonctionner. mais quand j'ai essayé la même chose dans mon programme actuel. ça ne marche pas et je n'arrive pas à comprendre pourquoi.la variable de passage ne fonctionnait pas

Fondamentalement, j'ai un formulaire qui affiche l'inventaire. chaque élément a un champ Vatid. quand je clique sur un bouton, je veux qu'il ouvre le formulaire de TVA et je choisis un ID de TVA différent en le sélectionnant à partir d'un DataGrid. puis, lorsque je clique sur un bouton de sélection, cet identifiant doit retourner à l'écran d'inventaire déjà ouvert et mettre à jour la zone de texte vatid pour cet élément.

view inventory screen

sur cet écran que je veux cliquer sur le bouton à côté de vatid et ouvrir une forme de cuve à partir de laquelle je sélectionne un code type de cuve

pour cet écran est ici

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 

l'écran de cuve est ici vat form Code qui est censé passer la variable globale à l'écran d'inventaire

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 

ma classe publique est ici

Public Class globalvariables 

Public Shared vatidvariable As String 
Public Shared testvariable As String 


End Class 

j'ai essayé sur une application simple avec seulement 2 formes et zones de texte et il fonctionne parfaitement. mais ici, dans mon programme actuel, ce n'est pas le cas. et le vatid reste toujours le même.

J'ai vérifié les propriétés readonly et activé les propriétés pour le texte bosex et ils sont tous très bien. Je deviens gris.

toute aide sera appréciée.

+0

Veuillez lire [ask] et prenez le [tour]. Le premier peut aider à éviter les DV sur les questions futures; la seconde explique comment SO fonctionne comme ce que vous devriez faire quand vous obtenez une réponse – Plutonix

Répondre

1

N'utilisez pas de variable globale. C'est douteux. Le dialogue doit rendre les données appropriées disponibles via une propriété ou une méthode et l'appelant doit extraire les données de cette propriété de la méthode. Par exemple, disons que Form1 affiche Form2, l'utilisateur saisit du texte dans un TextBox sur Form2 et que le texte doit être affiché dans un Label sur Form1:

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 

La propriété peut exposer toutes les données que vous voulez. Il ne doit pas nécessairement être une propriété d'un contrôle. Notez également que ce code n'inclut pas le mécanisme pour que le dialogue renvoie OK ou Cancel, ce qui n'est pas directement lié.

Cela ne répond pas directement à votre question, mais il fournit un meilleur mécanisme et je ne pouvais pratiquement pas inclure tout ce code dans un commentaire.

1

Votre méthode suivante est de fixer la variable de manière incorrecte

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 

Ici, vous définissez la valeur à une nouvelle instance de cette forme et non pas celui qui a ouvert votre forme de cuve. Vous pouvez accéder directement au globalvariables.vatidvariable sur votre écran d'inventaire après le code getvat.Show().Plus de remplacer de façon appropriée la ligne getvat.Show() avec les éléments suivants

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

espère que ce sera pour vous. Il pourrait être mieux fait sans variable globale.

+0

salut, merci pour la réponse. mais je ne comprends toujours pas. comment puis-je vérifier si le formulaire viewinventory est ouvert et renvoyer la valeur à une zone de texte dans le formulaire viewinventory qui est ouvert. également la variable globalvariables.vatid obtient sa valeur à partir d'un enregistrement que je clique dans la grille de données de la forme de la cuve. Je dois d'abord ouvrir le formulaire de la cuve, puis choisir un ID de la cuve –

+0

1. Affectez votre variable 'vatidvariable' dans l'événement' dgvat_SelectionChanged'. 2. Votre événement 'btnselect_Click' fermera simplement le formulaire. 3. L'événement 'btngetvat_Click' utilisera la méthode' .ShowDialog' pour ouvrir le formulaire. Il suffit d'utiliser le code dans cet événement que j'ai mentionné ci-dessus dans la réponse. –

+0

Bonjour, j'ai essayé votre code mais ça ne marche toujours pas. dans l'écran d'inventaire de vue i ouvrir la forme de cuve avec le code suivant 'Dim de getvat As New frmvat Si getvat.ShowDialog() = DialogResult.OK Alors txtvatid.Text = globalvariables.vatidvariable getvat.btnselect.Visible = Vrai Fin Si ' dans la forme de la cuve si juste fermer la forme de la cuve avec me.close() mais la zone de texte txtvatid dans l'inventaire de vue reste toujours le même. –