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

 

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

Παραμετρικό άνοιγμα φόρμας

Îåêßíçóå áðü ôï ìÝëïò gmlogic. Τελευταία δημοσίευση από το μέλος gmlogic στις 11-10-2006, 12:19. Υπάρχουν 16 απαντήσεις.
Σελίδα 1 από 2 (17 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  04-10-2006, 04:24 17886

    Geeked [8-|] Παραμετρικό άνοιγμα φόρμας

    Η φόρμα ανοίγει με Form1.Show

    Πώς θα μπορούσα αντί για Form1 να έχω μια μεταβλητή και να ανοίγω όποια φόρμα θέλω εγώ ανάλογα την μεταβλητή πχ

    Έχω Form1,Form2,Form3

    Θέλω να ανοίγω την ανάλογη φόρμα δίνοντας το όνομα της φόρμας σε μεταβλητή

    Πχ

    Μεταβλητή.Show

    Ευχαριστώ

     


    George Matzouranis
  •  04-10-2006, 08:11 17889 σε απάντηση της 17886

    Απ: Παραμετρικό άνοιγμα φόρμας

    Ο τρόπος που χρησιμοποιείς για να ανοίξεις φόρμες δουλεύει μόνο σε VB6 και VB.NET, οι οποίες επιστρέφουν ένα default instance της φόρμας όταν καλείς τη φόρμα με το ονομα της κλάσης της. Ο κανονικός τρόπος να ανοίξεις μία φόρμα είναι ακριβώς αυτός που ζητάς:



    Form1 aForm=new Form1();
    aForm.Show();

    Από εκεί και πέρα, αν θέλεις να κρατάς κάπου τη φόρμα, ασχέτως τύπου, και να την εμφανίζεις, μπορείς να χρησιμοποιήσεις μία μεταβλητή τύπου Form:



    Form anyForm;
    ...
    anyForm=new Form1();
    ...
    anyForm.Show();
    ...
    anyForm=new Form2();
    ...
    anyForm.Show();

    Έτσι κι αλλιώς, η εμφάνιση μιας φόρμας καλώντας απευθείας το όνομα της δημιουργεί λίγους μπελάδες, καθώς είσαι αναγκασμένος να καθαρίζεις όλα τα παλιά δεδομένα πριν δείξεις τα καινούρια. Άσε που το default instance της φόρμας θα παραμείνει φορτωμένο στη μνήμη μέχρι να τελειώσει η εφαρμογή, είτε το θέλεις είτε όχι!


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  04-10-2006, 10:37 17895 σε απάντηση της 17889

    Απ: Παραμετρικό άνοιγμα φόρμας

    Αγαπητέ Παναγιώτη,ευχαριστώ (μόνο αν σου είναι εύκολο σε παρακαλώ να μου γράφης σε VB)

    Λοιπόν να κάνω ποιό συγκεκριμένη λίγο τη ερώτηση.

    Έχω φτιάξη ένα custom control GmDgLookUp (ένα ευρετήριο για όλες τις δουλειές,ανάλογα το select φέρνει σε ένα datagridview τα fields ,μάλιστα θέλω και να το δημοσιεύσω γιατι με τη δικιά σας βοήθεια έγινε :) μήπως διευκολυνθούν και άλλοι φίλοι )

    Θέλω λοιπόν όταν περνάω σαν property το όνομα της φόρμας στο GmDgLookUp

    με κάποιο event του GmDgLookUp πχ button_click να μου  μου ανοίγη ανάλογη φόρμα για add,edit του record.

    δηλ

    GmDgLookUp.NameForm="Form1"

    GmDgLookUp.NameForm ...... show()


    Γ.ΜΑΤΖΟΥΡΑΝΗΣ

    ΥΓ

    Πως μπορώ να δημοσιεύσω το Solution με το custom control


    George Matzouranis
  •  04-10-2006, 10:55 17899 σε απάντηση της 17895

    Απ: Παραμετρικό άνοιγμα φόρμας

    Τότε καλύτερα να βάλεις ως property του control όχι το όνομα της φόρμας αλλά την ίδια τη φόρμα. Έτσι, θα μπορείς να πει κάτι σαν:

    GmDgLookUp.Form=Form1

    GmDgLookUp.Form.Show()


    Vir prudens non contra ventum mingit
  •  04-10-2006, 10:57 17900 σε απάντηση της 17895

    Απ: Παραμετρικό άνοιγμα φόρμας

    Θα μπορούσες να χρησιμοποιήσεις ένα interface όπου το custom control θα κάνει implement. Κοίταξε το και προς αυτή την κατεύθυνση, μπορεί να είναι αυτό που ζητάς.
  •  04-10-2006, 11:34 17904 σε απάντηση της 17886

    Απ: Παραμετρικό άνοιγμα φόρμας

    Λοιπόν έχουμε

    GmDgLookUp1.GmForm = Form2

    ........

    Public Class GmDgLookUp

    Private msForm As Form

    Public WriteOnly Property GmForm() As Form

    Set(ByVal value As Form)

    msForm = value

    End Set

    End Property

    Private Sub test_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles test.Click

    msForm.Show()

    End Sub

    End Class

    Όταν πατάω test_Click τη πρώτη φορά ανοίγη μια χαρά.

    Όταν ξαναδώσω δεύτερη φορά test_Click πέρνω

    Cannot access a disposed object.

    Object name: 'Form2'.
    George Matzouranis
  •  04-10-2006, 12:20 17907 σε απάντηση της 17886

    Απ: Παραμετρικό άνοιγμα φόρμας

    Μια άλλη λύση είναι να χρησιμοποιήσεις ένα enum με τις φόρμες, π.χ.

        Enum forms
            form1
            form2
            form3
        End Enum


    και να βάλεις αυτό σαν Property

    Έπειτα, με ένα Case δημιουργείς επί τόπου τη φόρμα και την παρουσιάζεις,
    κάπως έτσι:

            Dim form As Form
            Dim a As forms   'Αυτό είναι το enum
            a = forms.form2 'που ήδη έχεις πάρει από την property
            form = Nothing
            Select Case a
                Case forms.form1
                    form = New Form1
                Case forms.form2
                    form = New Form2
                Case forms.form3
                    form = New Form3
            End Select
            If form IsNot Nothing Then
                form.Show()
            End If



    Βαγγέλης Λαμπρινίδης.
  •  04-10-2006, 12:22 17908 σε απάντηση της 17904

    Απ: Παραμετρικό άνοιγμα φόρμας

    Οκ έδωσα

    msForm.ShowDialog()

    και δουλεύει


    George Matzouranis
  •  04-10-2006, 12:44 17911 σε απάντηση της 17895

    Απ: Παραμετρικό άνοιγμα φόρμας

     gmlogic wrote:
    Έχω φτιάξη ένα custom control GmDgLookUp (ένα ευρετήριο για όλες τις δουλειές,ανάλογα το select φέρνει σε ένα datagridview τα fields ,μάλιστα θέλω και να το δημοσιεύσω γιατι με τη δικιά σας βοήθεια έγινε :) μήπως διευκολυνθούν και άλλοι φίλοι )

    Θέλω λοιπόν όταν περνάω σαν property το όνομα της φόρμας στο GmDgLookUp
    με κάποιο event του GmDgLookUp πχ button_click να μου  μου ανοίγη ανάλογη φόρμα για add,edit του record.

    δηλ

    GmDgLookUp.NameForm="Form1"

    GmDgLookUp.NameForm ...... show()

    Αν θέλεις η επιλογή της φόρμας να γίνεται σε design time από τον προγραμματιστή όταν βάζει το control σου πάνω στη φόρμα του, τότε πρέπει να κάνεις λίγο πιο προχωρημένα πράγματα. Με κάποιο τρόπο ο προγραμματιστής θα πρέπει να δει μια λίστα με όλες τις διαθέσιμες φόρμες (όσες υπάρχουν στο project στο οποίο δουλεύει) και να επιλέγει αυτήν που θέλει. Στη συνέχεια εσύ θα πρέπει να δημιουργείς τη φόρμα με τον System.Activator, π.χ.:

    Form newForm = Activator.CreateInstance(
        "System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
        "System.Windows.Forms.Form");

    Θέλεις να κάνεις κάτι τέτοιο; Αν ναι, πες μας να σε βοηθήσουμε με τα παρακάτω (designers κλπ).


    Νατάσα Μανουσοπούλου
  •  04-10-2006, 14:03 17920 σε απάντηση της 17908

    Απ: Παραμετρικό άνοιγμα φόρμας

    Νατάσα

    Αυτό ακριβώς θέλω να κάνω :)


    George Matzouranis
  •  04-10-2006, 14:26 17927 σε απάντηση της 17907

    Απ: Παραμετρικό άνοιγμα φόρμας

    Βαγγέλη

    Όμως με αυτόν τον τρόπο ειναι υποχρεωμένος κάθε φορά που προσθετη μία φόρμα να γυρίζη στο control και να προσθέτη την φόρμα

     


    George Matzouranis
  •  04-10-2006, 17:47 17938 σε απάντηση της 17920

    Απ: Παραμετρικό άνοιγμα φόρμας

    Θα σου δώσω το σκελετό μιας λύσης, και μπορείς να το δεις και μόνος σου λιγάκι, με τη βοήθειά μας:

    Το control θα πρέπει να έχει ένα property το οποίο θα δίνει πλήρες type information για την κλάση που πρέπει να φορτώσεις, δηλαδή qualified assembly name στη μορφή "System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" και full namespace της κλάσης.
    Αν περιορίσεις τις κλάσεις της φόρμας σε αυτές που υπάρχουν στο ίδιο assembly με το instance του custom control, τότε δε χρειάζεσαι το assembly name.

    Το property αυτό θέλει ένα δικό του UITypeEditor, ο οποίος θα εμφανίζει μια λίστα με τα ονόματα των κλάσεων μέσα στην assembly οι οποίες έχουν για πρόγονο την System.Windows.Forms.Form.

    Για το πώς θα φτιάξεις τον UITypeEditor μπορείς να ρίξεις μια ματιά στο άρθρο αυτό, το οποίο θα σου δώσει αρκετές κατευθύνσεις. Όσο για το πώς θα βρεις σε design time τις κλάσεις μέσα στην assembly που δουλεύεις, είχαμε κάνει μια συζήτηση εδώ αλλά δεν είχαμε καταλήξει. Ευκαιρία να το ξαναδούμε.

    Νατάσα Μανουσοπούλου
  •  04-10-2006, 18:03 17940 σε απάντηση της 17938

    Απ: Παραμετρικό άνοιγμα φόρμας

    Πω...και έλεγα τι είχα ξεχάσει να δοκιμάσω τόσο καιρό...τι είχα ξεχάσει...:)


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  04-10-2006, 18:14 17941 σε απάντηση της 17940

    Απ: Παραμετρικό άνοιγμα φόρμας

    Χμμμμ... ευτυχώς που ο PM σου δεν διαβάζει DNZ Stick out tongue
    Vir prudens non contra ventum mingit
  •  04-10-2006, 20:05 17943 σε απάντηση της 17927

    Απ: Παραμετρικό άνοιγμα φόρμας

    -Έστω και καθυστερημένα- gmlogic έχεις δίκιο, το control με enums θα πρέπει να γίνει για συγκεκριμένη εφαρμογή και μόνο.

    Μια άλλη ιδέα, για control ... κάθε περίπτωσης, θα ήταν να βάλεις την εφαρμογή να του περνάει τους τύπους από κάθε φόρμα σε Collection (π.χ. HashTable)...



        Dim ht As New System.Collections.Hashtable
        ht("F1") = GetType(Form1)
        ht("F2") = GetType(Form2)
        ht("F3") = GetType(Form3)

    ...και μετά στο control θα μπορείς να δημιουργείς την εκάστοτε φόρμα (π.χ. από το κλειδί του HashTable)



        Dim f As Form
        f = Activator.CreateInstance(ht("F2"))
        f.Show()

    Αν όμως φτιαχτεί ένα control κατά τα παραπάνω, που να παίζει και με designer, τότε ...
    ...δεν θέλεις τίποτε άλλο!

     


    Βαγγέλης Λαμπρινίδης.
Σελίδα 1 από 2 (17 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems