Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα με πέρασμα τιμών από μία MDIChild σε άλλη MDIChild Form

Îåêßíçóå áðü ôï ìÝëïò giocha. Τελευταία δημοσίευση από το μέλος giocha στις 17-04-2007, 12:19. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-04-2007, 16:44 29652

    Πρόβλημα με πέρασμα τιμών από μία MDIChild σε άλλη MDIChild Form

    Έχω δύο MDIChild forms.

    Ενώ έχω ήδη ανοιχτή μία MDIChild form με όνομα frmCS ανοίγω μία άλλη πάλι MDIChild form που περιέχει ένα DataGridView, πατώντας F7.

    '========================
        Private Sub txtCsType_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtCsType.KeyDown
            If e.KeyCode = Keys.F7 Then
                Dim NewCSViewChild As New frmCustomersSuppliersView()
                NewCSViewChild.MdiParent = Me.MdiParent
                NewCSViewChild.Show()
            End If
        End Sub
    '========================



    Τώρα όταν είμαι στην NewCSViewChild φόρμα, πατώντας ENTER πάνω σε μία γραμμή του DataGridView (dgvCustomersSuppliersTypesView) στέλνω την τιμή της πρώτης στήλης της τρέχουσας γραμμής στο πεδίο txtCsType, το οποίο είναι TextBox, στην φόρμα frmCS.

    '========================
        Private Sub dgvCustomersSuppliersTypesView_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgvCustomersSuppliersTypesView.KeyDown
            If e.KeyCode = Keys.Escape Then
                Me.Close()
            End If

            If e.KeyCode = Keys.Enter Then
                frmCS.txtCsType.Text = dgvCustomersSuppliersTypesView.Item(0, dgvCustomersSuppliersTypesView.CurrentCell.RowIndex).Value
                Me.Close()
            End If
        End Sub
    '========================

    Το θέμα είναι ότι όταν οι φόρμες δεν είναι MDIChild όλα λειτουργούν κανονικά. Μόλις τις κάνω MDIChild τότε δεν λειτουργεί ο παραπάνω κώδικας.

    Καμιά ιδέα???

    Δημοσίευση στην κατηγορία: , , ,
  •  16-04-2007, 17:09 29664 σε απάντηση της 29652

    Απ: Πρόβλημα με πέρασμα τιμών από μία MDIChild σε άλλη MDIChild Form

    Υποψιάζομαι ότι δεν έχεις ορίσει πουθενά ένα instance της frmCS (Dim myForm as New frmCS) αλλά χρησιμοποιείς απευθείας την κλάση frmCS (π.χ. κάπου γράφεις frmCS.Show). Κανονικά, για να χρησιμοποιήσεις μία κλάση πρέπει να δημιουργήσεις ένα instance με την New. Ένα από τα πιο αμφιλεγόμενα χαρακτηριστικά της VB6 ήταν ότι μπορούσες να αναφερθείς στην κλάση μίας φόρμα απευθείας και να τη χρησιμοποιήσεις. Το runtime από πίσω δημιουργούσε ένα instance και σου το επέστρεφε. Αυτό το "feature" μπορεί να σε γλυτώνει από 1 επιπλέον γραμμή κώδικα για το Dim As New, αλλά δημιουργεί πάρα πολλά προβλήματα. Ένα από αυτά είναι ότι δεν ξέρεις ποτέ αν αναφέρεσαι στην κλάση frmCS ή στο default instance. Γι αυτό το λόγο και θεωρείται κακή πρακτική να το χρησιμοποιείς όχι μόνο στην VB6 αλλά και στην VB.NET.

    Στην περίπτωση σου, ο μόνος τρόπος να κάνει compile ο κώδικας που δίνεις είναι να έχεις χρησιμοποιήσει την frmCS με αυτό τον τρόπο.
    Εδώ όμως έρχεται το πρόβλημα, σε ποιό instance αναφέρεσαι? Αν έχεις δημιουργήσει κάπου μία frmCS ως MdiChild, με Dim myForm As New frmCS έχεις ένα instance της φόρμας, το οποίο λέγεται myForm. Στην δεύτερη φόρμα όμως δεν αναφέρεσαι σε αυτό. Αναφέρεσαι στο άσχετο default instance το οποίο λέγεται frmCS. Ουσιαστικά, όταν καλείς την frmCS.txtCsType.Text, δημιουργείται μία ΝΕΑ φόρμα, η οποία ΔΕΝ ΕΙΝΑΙ child ΚΑΝΕΝΟΣ!

    Για να μπορέσεις να αναφερθείς σωστά από μία φόρμα στην άλλη θα πρέπει κάπως να περάσεις ένα reference της μίας στην άλλη. Μπορείς π.χ. να φτιάξεις ένα constructor στην δεύτερη φόρμα ο οποίος θα δέχεται ως παράμετρο την myForm και θα αποθηκεύει την παράμετρο σε ένα πεδίο. Έτσι όμως θα πρέπει η μία φόρμα να ξέρει τα εσώψυχα της άλλης (ένα πρόβλημα το οποίο έχεις ήδη). Τί την νοιάζει την δεύτερη φόρμα αν έχει η πρώτη ένα πεδίο txtCsType?

    Καλύτερη λύση είναι η κάθε φόρμα να καλεί ένα function στην parent, ή να σηκώνει ένα event το οποίο θα χειρίζεται η parent. Αυτή μετά θα καλεί ένα function στην άλλη φόρμα το οποίο θα θέτει τις τιμές στα κατάλληλα πεδία.



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-04-2007, 12:19 29784 σε απάντηση της 29664

    Απ: Πρόβλημα με πέρασμα τιμών από μία MDIChild σε άλλη MDIChild Form

    Σ' ευχαριστώ.

    Δήλωσα μια Public μεταβλητή σε ένα module για την φόρμα που ανοίγω και μετά την καλώ από την MDIParent form.

    Public NewCSChild As New frmCS()

    Και λύθηκε το πρόβλημα.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems