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

 

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

Εσωτερικό control ενός UserControl ως Container σε Design Time (.ΝΕΤ 1.1)

Îåêßíçóå áðü ôï ìÝëïò cap. Τελευταία δημοσίευση από το μέλος cap στις 25-11-2005, 11:08. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  22-11-2005, 18:50 7232

    Εσωτερικό control ενός UserControl ως Container σε Design Time (.ΝΕΤ 1.1)

    Εχω το εξής πρόβλημα, με πολύ απλα λόγια:

    Εχω ένα userControl. Μεσα σε αυτό έχω ένα Panel. Ας πούμε το userControl "Container" και το Panel "InnerPanel" για να μην μπερδευόμαστε.

    Εχω μια σειρά από άλλα userControls, ας τα πούμε ucl1, ucl2, ucl3. Μικρά user controls (απαρτιζόμενα κυρίως από κλασικά winforms controls). 

    Θελω σε DESIGN TIME, όταν κάνω drag-n-drop ένα από τα ucl1, ucl2, ucl3 επάνω στο "Container" να προστίθεται στο "InnerPanel" του. Αυτό που κάνει τώρα είναι να "κάθεται" από πάνω. (Φυσικά, μια και το custom control δεν μπορεί να λειτουργήσει ως container). ΠΡΟΣΟΧΗ: Δεν θέλω το custom control μου να λειτουργήσει ως container, αλλά ένα από τα εσωτερικά του controls, και για την ακρίβεια το InnerPanel, το οποίο λειτουργεί ήδη ως container. Απλά πρέπει με κάποιο τρόπο να το "δει".

    Διαβάζοντας διάφορα, έχω μια υποψία οτι αυτό δεν ειναι και τόσο εύκολο στο 1.1. (Στο 2.0 βρήκα αυτό εδώ το άρθρο που κάτι μου είπε χωρίς να μπορώ να το κατανοήσω εξ' ολοκλήρου - μικρή εμπειρία με τις WinForms).

    Σημείωση: Το πρόβλημα αφορά .NET Framework 1.1 (και φυσικά VS2003) όπως αναφέρω και στον τίτλο

    Παρακαλώ να είστε ήπιοι :)

     


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  22-11-2005, 20:23 7236 σε απάντηση της 7232

    Απ: Εσωτερικό control ενός UserControl ως Container σε Design Time (.ΝΕΤ 1.1)

    Εεεεε... Η απάντηση είναι απλή: Έμπλεξες!

    Γιατί έμπλεξες; Η απλοϊκή εξήγηση είναι γιατί όταν κάτα το design-time χρησιμοποιείς ένα UserControl, τότε αυτό βρίσκεται σε runtime mode! Όπερ σημαίνει ότι όπως το panel δεν μπορεί να δεχθεί control απλά με drag-and-drop κατά το run-time της φόρμας, έτσι δεν μπορεί να δεχθεί και όταν το τοποθετήσεις μέσα σε ένα UserConrtol. Για να το δοκιμάσεις, φτιάξε ένα UserControl που να περιέχει ένα button με ένα message box. Θα δεις ότι όταν το χρησιμοποιήσεις και είσαι σε design-time, θα πατάς το κουμπί και θα βγαίνει το message.

    Κάποτε το έψαξα το θέμα και με πολύ κόπο είχα βρει κάποια άκρη χρησιμοποιώντας subclassing, ωστόσο, IMHO αν τίθεται θέμα παραγωγικότητας, καλύτερα θα είναι να βρεις κανένα workaround.

     


    Vir prudens non contra ventum mingit
  •  22-11-2005, 20:30 7237 σε απάντηση της 7236

    Απ: Εσωτερικό control ενός UserControl ως Container σε Design Time (.ΝΕΤ 1.1)

    Το φαντάστηκα, από ο,τι σχετικό μπόρεσα να βρω μέχρι τώρα.
    Το ζήτημα του runtime mode το έχω "φαει" ήδη, και φαντάστηκα ότι η πιθανότητα να βρεθεί λύση σε αυτό που ζητάω είναι 1%, αλλά αρκούσε για να το βάλω εδώ, ποτέ δεν ξέρεις :)

    Μαλλον θα κάνω subclass ένα panel και θα φροντίσω στην ίδια φόρμα να είναι αυτό και άλλο ένα control που θα κάνουν τη δουλειά σε συνεργασία. (Ηθελα ένα user control που να κάνει host άλλα user controls σε design time και να έχει κα κάποιες στάνταρ λειτουργίες) Εκτός αν κάποιος άλλος συνάδελφος έχει καμμία καλύτερη άποψη...η ελπίδα πεθαίνει πάντα τελευταία :)

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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  22-11-2005, 20:36 7240 σε απάντηση της 7232

    Απ: Εσωτερικό control ενός UserControl ως Container σε Design Time (.ΝΕΤ 1.1)

    Φίλε Σωτήρη...

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

    Private aParent As Windows.Forms.Control = Nothing

    Public
    Property fParent() As Windows.Forms.Control
       Get
             Return aParent
       End Get
       Set(ByVal Value As Windows.Forms.Control)
             Me.Parent = Value
             Me.BringToFront()
             aParent = Value
       End Set
    End Property

    Με αυτό τον τρόπο καθορίζεις τον πατερα του UserControl DESIGN TIME

    Με τον ίδιο τρόπο μπορείς να έχεις ως property και το position του Control σου μέσα στο parent Control!!! Smile [:)]

    και ξανα λέω ΑΝ έχω καταλάβει καλά την ερώτηση...

     


    Παναγιώτης Λαβίδας
    Software Developer
  •  22-11-2005, 21:59 7242 σε απάντηση της 7240

    Απ: Εσωτερικό control ενός UserControl ως Container σε Design Time (.ΝΕΤ 1.1)

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

    Παίζοντας λοιπόν με αυτό είδαμε δύο πράγματα:

    1. Δεν μπορεί να πάρει σε design time ως parent property το panel που βρίσκεται μέσα στο user control ακόμα και αν το κάνουμε expose ως property. Φυσικά προγραμματιστικά μπορεί, αλλά προγραμματιστικά γίνεται και με άλλους τρόπους.

    2. Ας πούμε οτι απλά το "σέρνουμε" πάνω από το CustomControl μας και μετά θέτουμε το Parent να είναι το ίδιο το Custom Control. Ετσι όμως φαίνεται, ώσπου να το κάνουμε build. Μετά, φυσικά εξαφανίζεται διότι δεν έχει μπει στο panel που βρίσκεται μέσα στο control, αλλά στο ίδιο το control. Το panel στο συγκεκριμένο παράδειγμα ήταν fully docked στο control, οπότε το δικό μας custom control (ctl1 σύμφωνα με την αρχική εκφώνηση) το έφαγε η μαρμάγξ...

    Συμπέρασμα είναι οτι το να θέσουμε το parent property προγραμματιστικά μπορεί να μας λύσει το πρόβλημα, αλλά δεν μας το λύνει τόσο εύκολα σε design time.
    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  25-11-2005, 10:17 7312 σε απάντηση της 7232

    Απ: Εσωτερικό control ενός UserControl ως Container σε Design Time (.ΝΕΤ 1.1)

    Μια λύση (που τη βλέπω μάλλον σαν ημίμετρο, αλλά στο χρόνο που έχω δεν μπόρεσα να σκαρώσω τίποτα καλύτερο) είναι η παρακάτω:

    Βήμα 1: Ορίζεις ένα custom designer για το user control σου, ο οποίος κληρονομεί από τον ParentControlDesigner ή τον ScrollableControlDesigner (χρειάζεσαι reference στη System.Design.dll):

    	[Designer(typeof(MyUserControlDesigner))]
    	public class MyUserControl : System.Windows.Forms.UserControl
    	{
    	}
    
    	class MyUserControlDesigner : System.Windows.Forms.Design.ParentControlDesigner
    	{
    		public MyUserControlDesigner() { }
    	}
    

    Καλό είναι στον designer να πιάσεις την OnPaintAdornments για να σχεδιάζεις ένα border σε design time γύρω από το control σου.

    Τώρα, ό,τι ρίχνεις πάνω στο user control θα γίνεται child του, αλλά δε θα φαίνεται γιατί είναι πιο κάτω στο z-order από το panel. Παρόλα αυτά μπορείς να το διαλέξεις από το combo box του properties window.

    Βήμα 2: Πιάνεις το Load event του user control σου και κάνεις το παρακάτω:

    	protected override void OnLoad(EventArgs e)
    	{
    		base.OnLoad (e);
    		if (DesignMode)
    			return;
    
    		for (int index=this.Controls.Count-1; index>0; --index)
    		{
    			Control ctrl = this.Controls[index];
    			this.Controls.RemoveAt(index);
    			panel1.Controls.Add(ctrl);
    		}
    	}
    

    Αυτός ο κώδικας κάνει (μόνο σε runtime) reparent όλα τα controls που έχεις ρίξει πάνω στο user control και τα βάζει μέσα στο panel. Βέβαια κάνει το assumption ότι το panel είναι το πρώτο control, αλλά εσύ μπορείς να τον γράψεις να είναι bullet proof.

    Δεν μπορώ να πω ότι με ενθουσιάζει σα λύση, αλλά δεν έχω τίποτα καλύτερο :-(


    Νατάσα Μανουσοπούλου
  •  25-11-2005, 10:24 7313 σε απάντηση της 7312

    Απ: Εσωτερικό control ενός UserControl ως Container σε Design Time (.ΝΕΤ 1.1)

    Not bad....
    Χρήστος Γεωργακόπουλος
  •  25-11-2005, 11:08 7315 σε απάντηση της 7313

    Απ: Εσωτερικό control ενός UserControl ως Container σε Design Time (.ΝΕΤ 1.1)

    Ενδιαφέρον! Απο ο,τι κατάλαβα όμως σε design time δεν είναι πολύ εξυπηρετικό αν δεν μπορείς να δείς τα child controls. Λεω "απο ο,τι κατάλαβα" γιατί δεν το δοκίμασα, θα το δοκιμάσω μόλις μπορέσω.

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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

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