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

 

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

Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

Îåêßíçóå áðü ôï ìÝëïò Αλέξανδρος Δημητρίου. Τελευταία δημοσίευση από το μέλος infoCENTER στις 22-10-2007, 18:49. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  20-10-2007, 14:22 36417

    Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Παιδιά καλησπέρα! Η βοήθεια σας και πάλι είναι σημαντική για μένα.

    Έχω το εξής "Πρόβλημα" :

    Φτιάχνω λοιπόν ένα windows Application (VB - Sql Server 2005) το οποίο ζητά κωδικό πελάτη σε διάφορα πεδία διαφορετικών φορμων της εφαρμογής. Δίπλα από κάθε τέτοιο πεδίο υπάρχει ένα κουμπάκι το οποίο εμφανίζει τη φόρμα αναζήτησης των πελατών στην οποία δίνεις κάποια κριτήρια και σου εμφανίζει τους πελάτες.Έχω φτιάξει λοιπόν τον κώδικα μου έτσι ώστε όταν επιλέγω μια γραμμή απο το datagridview της φόρμας αναζήτης που εμφανίζει το κουμπί  με τα αποτελέσματα και πατώ το πλήκτρο επιλογή να μου φέρνει τον κωδικο πελάτη στο ανάλογο πεδίο της φόρμας που πατήθηκε το κουμπί.

    Πώς Όμως?

    έχω βάλει ένα κρυφό label στη φορμα αναζήτησης πελατών. Όταν ανοίγω τη φόρμα αναζήτησης από τη φόρμα πωλήσεων αυτό γίνεται 1.Όταν την ανοίγω από τη φόρμα παραγελιών αυτο γίνεται δύο.Όταν την ανοίγω από τη φόρμα διαχείρισης πελάτών γίνεται 3.

    Πατώντας καταχώρηση λοιπόν ανάλογα με τον αριθμό του label βάζει και τα στοιχεία στην αντίστοιχη φόρμα. Δε μου αρέσει όμως προγραμματιστικά.Έχω την εντύπωση ότι είναι λάθος.Δοκίμασα να δολέψω με το dim  aaa as new frm_searchCustomer αλλά δεν κατάφερα να ελέγξω τις επιλογές του πλήκτρου "Επιλογή".

    1)Συμφωνείτε οτι ο τρόπος είναι λάθος?

    2)Έχετε κάτι άλλο να προτείνετε?

    3) Μπορείτε να με βοηθήσετε δίνοντας μου δείγμα λίγο κώδικα...

     

     

    ΥΓ:Παιδια είστε πραγματική βοήθεια για αυτούς που κάνουν τα πρώτα τους βήματα..Σας παρακολουθώ συχνά και χαίρομαι που είμαι μέλος του forum..

     

    Σας ευχαριστώ πολυ για το χρόνο σας.....


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  20-10-2007, 22:18 36442 σε απάντηση της 36417

    Απ: Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Γεια σου.

    Έχεις δίκιο ο τρόπος με τον οποίο προσπάθησες να να το υλοποιήσης είναι λάθος, όσο λάθος μπορεί να είναι κάτι που δεν ταιριάζει με την φιλοσοφία προγραμματισμού που ακούει στο όνομα OOP. Και το λέω αυτό γιατί θα μπορούσες να χρησμοποιούσες OOP και το πρόβλημα αυτό που αντιμετωπίζεις να ήταν πολύ απλό, προϋποθέτει όμως να κατανοήσεις την φιλοσοφία του OOP κάτι το οποίο δεν είναι τόσο απλό.

    Επειδή λοιπόν από ότι κατάλαβα δεν χρησιμοποιείς ΟΟΡ θα σου προτείνω μία λύση που να ταιράζει με τον τρόπο με τον οποίο έχεις φτιάξει μέχρι τώρα την εφαρμογή σου.

    Στον constructor της φόρμας αναζήτησης θα περνάς την φόρμα που κάλεσε την αναζήτηση.

    Dim MyCallingForm as Form=Nothing

    Public Sub New(CallingForm as Form)
       InitializeComponent()
       MyCallingForm=CallingForm
    End Sub

    Στις φόρμες από τις οποίες θα καλείς την φόρμα ανάζήτησης θα δημιουργήσεις μία Public Sub UpdateCustomerID και ή οποία θα ενημερώνει το TextBox που θέλεις.

    Public Sub UpdateCustomerID(ByVal CustomerID As Integer)
       CustomerIDTextBox.Text = CustomerID
    End Sub

    Την φόρμα αναζήτησης, ας πούμε από την φόρμα των πελατών θα την καλέσεις ως εξής:

    Dim mySearchForm as New SearchForm(Me)
    mySearchForm.ShowDialog

    Όταν είσαι τώρα στην φόρμα αναζήτησης και έχεις επιλέξει τoν πελάτη που θέλεις πατώντας Select ή OK ή Close θα γράψεις το εξής:

    MyCallingForm.UpdateCustomerID(<SelectedCustomerID>) π.χ MyCallingForm.UpdateCustomerID(30)
    Me.Close

    Και είσαι έτοιμος.

    Φυσικά υπάρχουν και άλλοι τρόποι απλά αυτός είναι ένας από τους πιο άμεσους.  

  •  20-10-2007, 22:43 36444 σε απάντηση της 36442

    Απ: Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Σε ευχαριστώ πραγματικά,

    Θα ήθελα παρ'ολα αυτα να σου τονίσω ότι δεν αντιμετωπίζω κάποιο πρόβλημα με το τρόπο που έχω φτιάξει την εφαρμογή μου.Αντιθέτως δουλέυει πολύ σωστά.Όμως γνωρίζοντας οτι υπάρχουν δυνατότητες όπου μπορώ να κάνω τη δουλειά μου πιο απλά μου γεννά την ανυσηχία οτι κάτι δε κάνω σωστά.Μου μοιάζει σαν πατέντα αυτό που έχω κάνει και ειμαι άνθρωπος που του αρέσει να δουλεύει σωστά και συνετά χρησιμοποιώντας όλα τα εργαλεία που έχει στα χέρια του.Μου φαίνεται όμως πραματικά δύσκολος α αντικειμενοστραφής προγραμματισμός και λυπάμαι που το λέω.Ελπίζω πολύ διαβασμα και λίγη βοήθεια από εσας να είναι συμπολεμιστές μου στη μάχη της γνώσης.

    Επέτρεψε μου φίλτατε να σε ρωτήσω τα εξής:

    1)τι πρόβλημα μπορεί να δημιουγηθεί αφήνοντας το δικό μου τρόπο?

    2)Γιατί είναι πιο σωστό να καλεις ένα instance της φόρμας και όχι την ίδια?

    3) Γίνομαι σπαστικός ? Big Smile

     

    Ευχαριστώ παρα πολύ για το χρόνο σου...

     


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  20-10-2007, 23:37 36445 σε απάντηση της 36444

    Απ: Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Καλησπέρα και πάλι.

    Σχετικά με αυτό που είπες συμφωνώ απόλυτα. Άλλωστε για αυτό στο αρχικό μου κείμενο ανέφερα ότι ο τρόπος σου αυτός είναι λάθος όσο λάθος μπορεί να θεωρηθεί κάτι που δεν συμβαδίζει με τις επικρατούσες αρχές προγραμματισμού σήμερα που ακούνε στο όνομα ΟΟΡ. Προσωπικά για εμένα ότι δουλεύει είναι σωστό, όχι όμως και το καλύτερο από θέμα τρόπου δημουργίας.

    Ας απαντήσω λοιπόν στα ερωτήματά σου.

    1. Δεν υπάρχει κάτι λάθος στον τρόπο σου αν δουλεύει σε αυτήν την φάση του προγράμματός σου. Προσωπικά πιστεύω πως αν υπάρχει μία οργάνωσει στον κώδικα που γράφεις και στον τρόπο που σκέφτεσαι για το πως θα φτιάξεις το πρόγραμμα όλα θα πάνε καλά. Το θέμα είναι οι αλλαγές στο μέλλον που θα γίνουν και τι θα χρειάζεται από εσένα για να γίνουν. Φυσικά σε αυτό το σημείο θα θέλαμε όλοι μας να κάναμε τις λιγότερο δυνατόν αλλάγες. Και κάπου εδώ αρχίζει και μπαίνει ο ΟΟΡ. Άλλωστε μόνος σου είπες ότι κάτι δεν σου αρέσει...
    Αυτό που σου ανέφερα έχει το εξής πλεονέκτημα.Ότι αν προσθέσεις μία άλλη φόρμα η οποία θα καλεί την φόρμα αναζήτησης δεν χρειάζεται να πας στην φόρμα αναζήτησης και να προσθέσεις το καινούριο νούμερο που θα έχει η φόρμα αυτή.  

    2. Δεν μπορείς να καλέσεις την ίδια ην φόρμα. Ότι ήξερες, γνώριζες για τον τρόπο που καλείς τις φόρμες στην VB 6 ξέχνα το. Εδώ κάθε φόρμα είναι μία class η οποία θα πρέπει να έχει instance για να καλέσεις κάποια ρουτίνα που δεν έχει δηλωθεί σαν Shared.

    3. Σπαστκός δεν γίνεσαι, απλά οι απαντήσεις στα ερωτήματά σου δεν μπορούν να απαντηθούν έτσι απλά. 'Οχι γιατί οι απαντήσεις είναι δύσκολες, αλλά γιατί χρειάζονται από την μεριά σου για να τις κατανοήσης μία προεργασία. Και για να γίνει αυτό θα πρέπει να κάνεις ένα επόμενο βήμα στην μέχρι τώρα ενασχόλησή σου με τον προγραμματισμό. Να αρχίσεις να ασχολείσαι λίγο με ΟΟΡ όσο δύσκολο και αν είναι. Και θα δεις ότι όταν φτάσεις σε εκείνο το σημείο θα γυρίσεις πίσω και θα θεωρήσεις τον τρόπο που δούλευες έως τώρα λίγο μπακαλίστικο αν μου επιτρέπεται, όχι όμως λάθος.

  •  21-10-2007, 00:05 36446 σε απάντηση της 36445

    Απ: Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Φίλε μου γειά σου και πάλι!

    Δοκίμασα όσα γράφεις και αντιμετωπίζω το εξής πρόβλημα:

    εκει που λές mycallingform.UpdateCustomerid(....) ενώ έχω κάνει public sub το updatecustomerid στη φόρμα όπου καλώ τη φόρμα αναζήτησης δε μου το εμφανίζει στις επιλογές του MycallingForm και μου φαίνεται λογικό γιατί δεν έχει δηλωθεί πουθενά οτι η mycallingform περιέχει αυτήν την υπορουτίνα...

    Τι κάνω?


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  21-10-2007, 00:38 36447 σε απάντηση της 36446

    Απ: Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Ναι κατάλαβα που κολλάς, δικό μου λάθος συγνώμη.

    O Constructor τις φόρμας αναζήτησης έχει σαν παράμετρο μία φόρμα η οποία είναι γενική, και οι γενικές φόρμες δεν έχουν τις ρουτίνες που φτιάχνουμε εμείς στις φόρμες μας. Οπότε θα πρέπει να κάνουμε μερικές αλλαγές για να παίζει σωστά ο κώδικάς σου.

    Αρχικά θα μπορούσαμε να κάνουμε το εξής

    Dim myCallingForm as Form=Nothing
    Public Sub New(CallingForm As Form)
       InitializeComponent
       Select Case TypeOf CallngForm
          Case CustomersForm
             myCallingForm=CType(CallingForm,CustomerForm)
       End Case
    End Sub

    Οπότε βάζουμε όσα Case όσες είναι οι φόρμες μας οι οποίες καλούν την φόρμα αναζήτησης. Αυτό όμως καταργεί το πλεονέκτημά μας, όπου αν προσθέσουμε μία νέα φόρμα θα πρέπει να έρθουμε στην φόρμα αναζήτησης και να προσθέσουμε την νέα αυτήν φόρμα. οπότε θα πρέπει να διαλέξουμε μία διαφορετικη προσέγγιση.

    Φυσικά και πάλι σου ξαναλέω ότι σχεδιατικά θα ακολουθούσα μία διαφορετική προσέγγιση άλλά επειδή δεν θέλω να αλλάξεις πολύ των κώδικά σου θα το φέρω όσο πιο πολύ στα δικά σου δεδομένα.

    Σβήσε την παράμετρο από τον Constructor της φόρμας αναζήτησης και δημιούργησε ένα event στην φόρμα αυτήν...

    Public Event Customer_Selected As EventHandler

    Όταν επιλέξεις πελάτη και πριν κλείσεις την φόρμα θα γράψεις.
    Dim e as new EventArgs.
    RaiseEvent Customer_Selected(Me,e)

    Στο σημείο αυτό θα σε παρακαλούσα να διαβάσεις στο MSDN πως μπορείς να περάσεις μέσα από το EventArgs τιμές, στην περίπτωσή μας τον κωδικό του πελάτη.  

    Στις φόρμες που καλούν την φόρμα αναζήτησης θα δηλώσεις επάνω

    Dim WithEvents mySearchForm as SearchForm=nothing

    Αυτό θα σου δώσει την δυνατότητα να μπορείς να κάνει subscribe στο event που βγάζει η SearchForm. Έτσι θα πάρεις μέσα από το Event την τιμή του κωδικού του πελάτη. Η λύση αυτή είναι πιο δύσκολη από την προηγούμενη αλλά έχει ακόμα μεγαλύτερα πλεονεκτήματα. Δυστυχώς λόγω τις ώρας δεν μπορώ να σου δώσω περισσότερες πληροφορίες αλλά θα μπορούσα από εβδομάδα αν εξακολουθείς να έχει πρόβλημα να σου στείλω ένα απλό παράδειγμα με πλήρες κώδικα. 

    ΥΣΤ: Ελπίζω να γνωρίζεις πως να κάνεις Subscribe σε events αλλοιώς θα είναι δύσκολο για εσένα να κάνεις το παράδειγμα που σου ανέφερα.
        

     

  •  21-10-2007, 00:45 36448 σε απάντηση της 36447

    Απ: Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Δυστυχώς δε γνωρίζω μα θα το ψάξω...Παντως αυτό που μου είπες να κάνω αρχικά δεν έχει και μεγάλη διαφορά από αυτο που είχα κάνει εγώ..Πάλι με συνθήκες πρέπει να ορίσεις τις φόρμες που καλούν τη φόρμα αναζήτησης....

    Εαν μπορέσεις να στείλεις κάποιο δείγμα θα με βοηθούσες πάρα πολυ..

    Όσο για την ώρα καταλαβαίνω οτι ειναι δύσκολη και σε ευχαριστώ παρα πολύ για το χρόνο σου.Θα προσπαθήσω να δώ τι θα κάνω με τα events..Απ'οτι βλεπω έχω ώρα ακόμα...

     

    Σε ευχαριστώ πραγματικά!!!!


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  21-10-2007, 14:28 36456 σε απάντηση της 36448

    Απ: Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Γεια σου και πάλι.

    Οπότε αποκλείουμε και την λύση με τα Events. Ας δοκιμάσουμε κάτι άλλο τότε.

    Όπως προσθέτεις φόρμες στο project σου πρόσθεσε ένα Interface. Ονόμασε αυτό το Interface IOpenSearchForm

    Θα σου ανοίξει μία νέα φόρμα το VS.

    Interface IOpenSearchForm
       Sub CustomerSelected(CustomerID As Integer) (Αυτό θα γράψεις εσύ)
    End Interface

    Στην συνέχεια θα πας σε κάθε φόρμα που θα ανοίγει την φόρμα αναζήτησής σου κάτω από την γραμμή
    Public Class <Όνομα Φόρμας>
       Implements IOpenSearchForm <Και θα πατήσεις Enter>

    Θα παρατηρήσεις στο τέλος ότι το VS θα σου προσθέσει μία ρουτίνα η οποία θα λέγεται CustomerSelected. Σε αυτήν θα γράψεις τον κώδικα για να ενημερώνει το TextBox που θέλεις. Την τμή του κωδικού την έχει η παράμετρος CustomerID.

    Στην φόρμα αναζήτησης θα γράψεις
    Dim myCallingForm as IOpenSearchForm
    Public Sub New(CallingForm As IOpenSearchForm)
       myCallingForm=CallingForm
    ....
    ....
    End Sub

    Όταν λοιπόν τώρα θα έχεις επιλέξει τον κωδικό που θέλεις (πελάτη δηλαδή) θα γράψεις 
    myCallingForm.CustomerSelected(<Και θα περάσεις σαν παράμετρο τον κωδικό>)

    Για να καλέσεις την φόρμα αναζήτησης θα γράψεις 
    Dim mySearchForm as new SearchForm(Me)
    mySearchForm.ShowDialog


    Αυτή είναι μία ακόμα λύση που χρησιμοποιεί Interface. Η λύση αυτη προσφέρει το πλεονέκτημα ότι αν προσθέσεις μία ακόμα φόρμα που να καλεί την φόρμα αναζήτησης δεν θα χρειάζεται να πας στην φόρμα αναζήτησης για να ενημερώσεις κάτι. Περισσότερες πληροφορίες για τα Interfaces στο MSDN.  

    Τα λέμε.

     

  •  21-10-2007, 16:48 36458 σε απάντηση της 36456

    Απ: Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Φίλε δούλεψε...Εισαι άψογος!!!

    Μια τελευταία χάρη(Μπορείς να με βρίσεις αν θές,Θα παρακαλέσω τους διαχεριστές εάν το κάνεις να μη το διαγράψουν):

    Μπορείς να μου το εξηγήσεις?

    Δε μου αρέσει να δουλέυω στα τυφλά!!!!

     

     

    Anyway

    Σε ευχαριστώ παρα παρα πολύ!!!

     


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  22-10-2007, 18:49 36492 σε απάντηση της 36458

    Απ: Βοηθεια σχετικά με χρήση ίδιας φόρμας από άλλες φόρμες

    Όπως σου είπα, περισσότερα για τα Interfaces στο MSDΝ ή στο Internet. Εκεί θα βρεις περισσότερα και πιο απλά παραδείγματα.
    Για αρχή πες απλά ότι μόλις είδες τις δυνατότητες που σου δίνει ο πολυμορφισμός, χαρακτηριστικό του OOP.

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