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

 

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

Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

Îåêßíçóå áðü ôï ìÝëïò Dimitris Papadimitriou. Τελευταία δημοσίευση από το μέλος Demelene στις 26-02-2009, 21:26. Υπάρχουν 28 απαντήσεις.
Σελίδα 1 από 2 (29 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  10-11-2006, 16:14 20161

    Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    Αυτό είναι ένα από τα αγαπημένα μου πράγματα στο dNZ. Να γράφω ένα προβληματισμό μου στο "Design & Architecture" ζητώντας την γνώμη σας...

    Σε μια φόρμα υπάρχουν διάφορα elements (buttons, panes κλπ.) τα οποία θέλω να ενεργοποιούνται/απενεργοποιούνται ή να εμφανίζονται/εξαφανίζονται ανάλογα με κάποιες συνθήκες. Π.χ. αν έχω μια λίστα δεδομένων, το πλήκτρο "Διαγραφή" θέλω να είναι disabled όταν η λίστα είναι άδεια.

    Για το σκοπό αυτό έχω κάνει μια μέθοδο RefreshState() η οποία έχει των κώδικα όπου ενεργοποιούνται/απενεργοποιούνται ή εμφανίζονται/εξαφανίζονται τα elements.
    π.χ.
    DeleteButton.Enabled = (MyList.Items.Count > 0);
    ή
    DeleteButton.Enabled = (MyList.Visible & MyList.Items.Count > 0);
    Πλέον βάζω και την παράμετρο των δικαιωμάτων. Αν ο χρήστης δεν έχει πρόσβαση να διαγράψει τότε το παραπάνω γίνεται:
    DeleteButton.Enabled = (MyList.Visible & MyList.Items.Count > 0 & DeleteAllowed);

    Για να αποφύγω τις πολύπλοκες συνθήκες οι οποίες θα αρχίσουν να γίνονται δυσκολοσυντήρητες (!) με την πάροδο του χρόνου, είπα να προσθέσω άλλη μια μέθοδο που να λέγεται RefreshPermissions και να βάλω εκεί τους ελέγχους που σχετίζονται με το security.
    Παραδοχή 1) Και για να μην μπερδεύεται η μια με την άλλη είπα να κάνω την παραδοχή "τα δικαιώματα θα κάνουν τα elements visible/invisible και οι άλλες συνθήκες enable/disable".
    Παραδοχή 2) ή να κάνω την RefreshState να θέτει τιμές στο Enabled ή Visible property των elements και την RefreshPermissions να τις αλλάζει με λογικούς τελεστές: DeleteButton.Enabled = DeleteButton.Enabled & DeleteAllowed. Φυσικά πάντα πρέπει να καλούνται και οι δυο μαζί ή η 1η να καλεί την 2η.

    Πως σας φαίνεται;


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  10-11-2006, 16:15 20162 σε απάντηση της 20161

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    ...ελπίζω να βγαίνει νόημα!
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  10-11-2006, 16:55 20163 σε απάντηση της 20161

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    Εγώ το κάνω περίπου ίδια με σένα.

    Έχω μια method η οποία κάνει set το Visible property. Σε περίπτωση που είναι Visible (έχει permission) καλεί (η ίδια που κάνει set το Visible Property) κάτι σαν την δική σου RefreshState για να την κάνει Enable/Disable.

    Σε όλες περνάω το Control σαν ref οπότε η ίδια η method έχει πρόσβαση στο Control κατευθείαν και δεν χρειάζεται παραπάνω κώδικα για να το ελέγξεις ή να αλλαξείς το state του.

    Άλλωστε για ένα σωστό GUI/BL ο καθένας πρέπει να βλέπει μόνο αυτά τα οποία έχει πρόσβαση (role based security), οπότε η παραδοχή σου για visible/invisible είναι σωστή (κατα εμένα πάντα).
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  10-11-2006, 16:57 20165 σε απάντηση της 20163

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    Μην ξεχνάς ότι με αυτό το τρόπο μπορείς πολύ γρήγορα με μια for για όλα τα controls να κάνεις set τα properties τους , χωρίς να χρειάζεται να γράφεις για κάθε ένα DeleteButton.Enabled = CheckState(); κλπ κλπ.
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  11-11-2006, 03:37 20187 σε απάντηση της 20165

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    Χμμμ .. στα καπάκια απ'το TechEd, οπότε μπορεί να μην είναι απόλυτα αντικειμενική η απάντησή μου ...

    Θα χρησιμοποιούσα μία μόνο μέθοδο, η οποία κάνει traverse το control tree, ή δέχεται σαν παράμετρο τα controls στα οποία θα ενεργήσει, ή τα ids τους, καθώς και έναν delegate ο οποίος είναι στην ουσία ο κώδικας που θα εκτελεστεί πάνω στο control.

    ( Αν είσαι σε 2.0, ίσως αποδειχθεί και καλή χρήση για anonymous delegates )

    Σε κάθε περίπτωση όμως, έχεις μια βασική μέθοδο που κάνει enumerate τα controls τα οποία επεξεργάζεσαι, και τον κώδικα που θα εκτελεστεί για κάθε ένα απο αυτά τα controls - Iterator & Visitor pattern. Σε ένα απλό σενάριο όπου μιλάς για 1-2 controls δε σου δίνει κάτι ιδιέταιρα extra - αλλά αν χρειάζεται να "τραβήξεις" το σενάριο λίγο, π.χ. να εκτελέσεις κάποια λογική για να δείς ποια controls χρειάζεται να επεξεργαστείς, το Iterator - Visitor είναι μια πολύ όμορφη και reusable λύση.

    Τέλος, δε θα καλούσα τη μία απο την άλλη. Χαλάς την ατομικότητα της λειτουργίας τους έτσι. Ίσως μια τρίτη που καλεί τις δύο είναι πιο "καθαρό" σχήμα, και πιο δομημένο όσον αφορα το Object Orientation του.

    ( Υποθέτω οτι ο delegate θα είναι ορισμένος σε base class, όπως και η "τρίτη" μέθοδος ως virtual, και η subclass δίνει διαφορετικές υλοποιήσεις στο delegate parameter. Αν κάνεις και μερικούς διαφορετικούς Iterators - subclasses, έχεις πλέον ένα πολύ flexible σχήμα )

    Θα επανέλθω αύριο μάλλον με λίγο κώδικα, γιατί δείχνει εδώ 3:27 το πρωί και μυρίζω ακόμη αεροδρομίλλα :D ... Holaaaa !!! :D
    Angel
    O:]
  •  11-11-2006, 11:55 20189 σε απάντηση της 20161

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    Ναι όντως μια τρίτη method η οποία θα καλεί και τις δύο είναι καλή λύση, αλλα μην ξεχνάς ότι έτσι κι αλλιώς θα πρέπει να τις καλέσεις και τις δυο, γιατι θέλεις να ελεγξεις δυο διαφορετικά πράγματα στην κάθε μια χωρίς κανένα scenario το οποίο να αποκλείει κάποιες απο τις δυο.Οπότε απο την άλλη μια τρίτη method θα ήτανε περιττή.
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  12-11-2006, 12:42 20212 σε απάντηση της 20189

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    Οκ, καλημέρα ! ... με κώδικα και καφέ. ( yes, I really should get a life ... )

    Βασική κλάσση, ένας control iterator, οποίος δέχεται ως constructor parameters ένα enumerable collection απο Control instances, καθώς και ένα delegate, ο οποίος μπορεί να δείχνει σε μια ή περισσότερες μεθόδους οι οποίες κάνουν process κάθε control στο collection.

    ( Εκμεταλλεύομαι το γεγονός ότι ένας delegate είναι στην ουσία ένας function pointer σε μιά μέθοδο, αλλά στο .NET δεν υπάρχει διαφορά μεταξύ single ή multi delegates. Έτσι, θα μπορούσες να περάσεις έναν multi delegate, και θα εκτελούσε κάθε μια απο τις μεθόδους στις οποίες δείχνει, και μάλιστα στη σειρά που του τις έδωσες )

    Λίγος κώδικας:

    using System;
    using
    System.Web.UI;
    using
    System.Collections.Generic;

    namespace ControlIterator
    {
        /// <summary>
       
    /// Summary description for ControlIterator
       
    ///
    </summary>
       
    public class ControlIterator
       
    {

            /// <summary>
           
    /// Defines the footprint of a method that will retrieve
           
    /// a collection of controls to iterate on, from a specified
           
    /// web form
           
    /// </summary>
           
    /// <param name="page"></param>
           
    ///
    <returns></returns>
           
    public delegate void ProcessControlMethod(Control control);
     

            /// <summary>
            /// Initialize from a collection of controls ...
           
    /// </summary>
           
    ///
    <param name="controls"></param>
           
    public ControlIterator(IEnumerable<Control> controls, ProcessControlMethod processor) {
                this.Controls = controls;
                this.ProcessControlDelegate = processor;
           
    }

            #region lookup controls & process methods / properties

            private IEnumerable<Control> m_Controls = null;

            protected IEnumerable<Control> Controls {
                get{
                   
    if (null == m_Controls)
                        throw new NullReferenceException("Controls to iterate have not been initialized");

                    return m_Controls;
                }
                set{
                    if (null == value)
                        throw new ArgumentNullException("Controls to iterate cannot be initialized to null");

                    m_Controls = value;
                }
            }

            private ProcessControlMethod m_ProcessControlDelegate;

            /// <summary>
           
    /// Retrieves / sets in a type-safe way the procesor method for each node in the iteration
           
    ///
    </summary>
           
    protected ProcessControlMethod ProcessControlDelegate {
                get {
                    if (null == m_ProcessControlDelegate)
                        throw new NullReferenceException("ProcessControlDelegate has not yet been initalized");

                    return m_ProcessControlDelegate;
                }

                set {
                    if (null == value)
                        throw new ArgumentNullException("ProcessControlDelegate cannot be initialized to null");

                    // I could / should (??) be checking for multiplicity here, but perhaps it's actually a feature !!!
                   
    m_ProcessControlDelegate += value;
                }
            }
     

            /// <summary>
           
    /// Iterates through the controls array, and proceses each one of them with the given
           
    /// delegate
           
    ///
    </summary>
           
    public void Iterate() {
                foreach (Control ctrl in this.Controls)
                   
    this.ProcessControlDelegate(ctrl);
            }
     

            #endregion

        }
    }

     

    Δεν κάνει κάτι σπουδαίο ... απλώς είναι wrapper γύρω απο το functionality που χρειάζεται για το iteration / function calling.

    Και λίγος κώδικας στη σελίδα τώρα:

    using securityIter = ControlIterator.ControlIterator;
     

    public partial class _Default : System.Web.UI.Page
    {

        private Control[] ControlsToValidate {
            get {
                return new Control[2] { this.TextBox1, this.Button1 };
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            securityIter iterator = new securityIter(this.ControlsToValidate,
                delegate(Control ctrl) {
                    if (ctrl is TextBox) {
                        ((TextBox)ctrl).Enabled = false;
                    }
                    else if (ctrl is Button) {
                        ((Button)ctrl).Visible = false;
                    }
                }
            );

            iterator.Iterate();
       
    }
    }

    Piece of cake ??? :D

    Καλά, παραβλέψτε τον anonymous delegate - το έκανα προς χάρην ευκολίας, και απλώς για να δείξω ότι γίνεται.

    Το βασικό concept είναι οτι θα είχα τον iterator και το initialization & iteration σε κάποια base κλάσση για όλες τις σελίδες / φόρμες μου, και το εκάστοτε subclass θα υλοποιούσε απλώς τη μέθοδο που επιστρέφει τα controls to validate (άτυχο όνομα), και ίσως και τον / τους delegates που κάνουν το processing. Επίσης, το αν θα κάνει disable / not visible τα controls θα μπορούσες να το ελέγχεις με τύποις declarative τρόπο, έχοντας attributes πάνω στα controls.

    Και τελειώνω με μια πολύ αγαπημένη μου φράση ... οι delegates ΔΕΝ ΕΙΝΑΙ ΑΠΛΩΣ EVENT HANDLERS !!!!

    Άντε καλημέρα μας !

    Angel
    O:]
  •  12-11-2006, 12:54 20213 σε απάντηση της 20161

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    Ναι, πολύ ωραία υλοποίηση!Και το anonymous delegate μια χαρά είναι εκεί!
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  12-11-2006, 15:45 20225 σε απάντηση της 20213

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

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

    ps. Cool το κόλπο να αλλάζεις το όνομα της κλάσης χρησιμοποιώντας το using αλλά κάνει τον κώδικα δυσανάγνωστο.
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  12-11-2006, 19:58 20229 σε απάντηση της 20225

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

     papadi wrote:
    Όντως ωραίος κώδικας, αν και δεν απαντά στο ερώτημά μου νομίζω, το οποίο ήταν μια πρόταση για να γίνει διαχωρισμός των συνθηκών που αλλάζουν την κατάσταση των controls λόγω άλλων controls ή μεταβλητών και των συνθηκών που αλλάζουν την κατάσταση των ίδιων controls λόγω δικαιωμάτων του χρήστη, έτσι ώστε ο διαχωρισμός αυτός να είναι εμφανής και εύκολα συντηρίσιμος στον κώδικα.



    Oops ! We missed the point :D ...

    Ναί, νομίζω οτι security-wise αλλαγές στο UI οφείλουν να βρίσκονται κάπου ξεχωριστά. Group ανα concern. Security, και dependencies.

     papadi wrote:

    ps. Cool το κόλπο να αλλάζεις το όνομα της κλάσης χρησιμοποιώντας το using αλλά κάνει τον κώδικα δυσανάγνωστο.


    Ναι μωρέ, απλώς έκανα τη βλακεία να ονομάσω την κλάσση και το namespace με το ίδιο όνομα, και μου τη σπάει να γράφω ControlIterator.ControlIterator παντού ... :D .. consider that a typo ...

    Angel
    O:]
  •  13-11-2006, 00:12 20243 σε απάντηση της 20229

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

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

    Το Visible και το Enabled property στα controls μιας φόρμας σου επηρεάζονται από διάφορες συνθήκες, οι οποίες αφορούν το security αλλά και το control flow της φόρμας. Γενικά όμως, ακόμα και σε μια φόρμα με αρκετά controls, οι συνθήκες αυτές δεν είναι και τόσες πολλές σε πλήθος, και θα μπορούσες θεωρητικά κάθε μια από αυτές να τις αντιστοιχίσεις σε ένα boolean property ενός object, της ίδιας της φόρμας ή του controller της. Το property αυτό θα μπορούσες στη συνέχεια να το συνδέσεις με το Visible ή το Enabled property των κατάλληλων controls με data binding.

    Αυτή η προσέγγιση, εκτός από τα properties που αντιστοιχούν στις συνθήκες, απαιτούν και τα αντίστοιχα XyzChanged events για να γίνεται αυτόματα η ενημέρωση, εκτός κι αν παίζεις με WPF.

    Πλεονεκτήματα: είναι shoot and forget, δε χρειάζεται να διατρέξεις κάθε φορά όλα τα controls της φόρμας
    Μειονεκτήματα: μπορεί να έχεις πολλές συνθήκες σε ένα object, μπορεί να είναι δύσκολο στη συντήρησή του.

    Το ιδανικό θα ήταν να κάνεις bind το Enabled και το Visible property των controls σε έναν indexer που είναι κοινός για όλα τα controls, αλλά αυτό δυστυχώς δεν είναι δυνατό.

    Νατάσα Μανουσοπούλου
  •  13-11-2006, 09:44 20260 σε απάντηση της 20243

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

     mns wrote:
    Υπάρχει και μια άλλη (υποψιάζομαι λίγο παρανοϊκή) προσέγγιση, την οποία δε θα σου τη συστήσω, αλλά θα την αναφέρω παρόλα αυτά, γιατί είναι διαφορετική από τις υπόλοιπες, και μπορεί κάποιος που θα τη διαβάσει να την κάνει καλύτερη.

    Το Visible και το Enabled property στα controls μιας φόρμας σου επηρεάζονται από διάφορες συνθήκες, οι οποίες αφορούν το security αλλά και το control flow της φόρμας. Γενικά όμως, ακόμα και σε μια φόρμα με αρκετά controls, οι συνθήκες αυτές δεν είναι και τόσες πολλές σε πλήθος, και θα μπορούσες θεωρητικά κάθε μια από αυτές να τις αντιστοιχίσεις σε ένα boolean property ενός object, της ίδιας της φόρμας ή του controller της. Το property αυτό θα μπορούσες στη συνέχεια να το συνδέσεις με το Visible ή το Enabled property των κατάλληλων controls με data binding.

    Αυτή η προσέγγιση, εκτός από τα properties που αντιστοιχούν στις συνθήκες, απαιτούν και τα αντίστοιχα XyzChanged events για να γίνεται αυτόματα η ενημέρωση, εκτός κι αν παίζεις με WPF.

    Πλεονεκτήματα: είναι shoot and forget, δε χρειάζεται να διατρέξεις κάθε φορά όλα τα controls της φόρμας
    Μειονεκτήματα: μπορεί να έχεις πολλές συνθήκες σε ένα object, μπορεί να είναι δύσκολο στη συντήρησή του.

    Δεν μου φαίνεται και τόσο παρανοϊκή προσέγγιση. Με βοηθάει και το γεγονός ότι έχω μια base class που ελέγχει το control flow των derived φορμών (ίσως έπρεπε να έχω composition και όχι inheritance σε αυτό το σημείο, αλλά ας μην το θίξουμε αυτό τώρα). π.χ. η base class ξέρει αν υπάρχει κάτι στην λίστα δεδομένων, οπότε μπορεί να έχει ένα boolean που το οποίο να χρησιμοποιείται για enable/disable π.χ. του πλήκτρου delete.
     mns wrote:
    Το ιδανικό θα ήταν να κάνεις bind το Enabled και το Visible property των controls σε έναν indexer που είναι κοινός για όλα τα controls, αλλά αυτό δυστυχώς δεν είναι δυνατό.

    Αυτό δεν το 'πιασα! Hmm

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  13-11-2006, 14:43 20281 σε απάντηση της 20260

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

     papadi wrote:
     mns wrote:
    Το ιδανικό θα ήταν να κάνεις bind το Enabled και το Visible property των controls σε έναν indexer που είναι κοινός για όλα τα controls, αλλά αυτό δυστυχώς δεν είναι δυνατό.

    Αυτό δεν το 'πιασα! Hmm


    Φαντάσου ότι έχεις το παρακάτω. Δε θα ήταν πολύ ωραίο;

    public class ControlEnabler
    {
        public bool this[Control control]
        {
            get { /* Κώδικας που επιστρέφει true αν το control πρέπει να είναι enabled, false αλλιώς*/ }
        }
    }
    public class MyForm
    {
        private ControlEnabler controlEnabler = new ControlEnabler();
        public MyForm()
        {
            InitializeComponent();
            control1.DataBindings.Add("Enabled", controlEnabler, "Item"); // Όπου Item είναι το IL όνομα του indexer! Αυτό δεν γίνεται.
        }
    }


    Νατάσα Μανουσοπούλου
  •  13-11-2006, 22:08 20298 σε απάντηση της 20243

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    Χμμ ... ίσως με κάποιο specific subclass του Binding ? Δεν ξέρω πόσο εύκολο ή δύσκολο είναι αυτό, και πόσο κώδικα εμπεριέχει - αν δεν είναι προφανές ως τώρα, είμαι primarily a web boy ...

    Και μια ερώτηση. Δεν είναι λίγο "βαρύ" αυτό το data binding ? Δεν είναι reflection-based σε μεγάλο βαθμό; Βέβαια, φαντάζομαι οτι σε WinForms context δεν έχει και τόση σημασία, αφού δεν έχεις 2-3 χιλιάδες ταυτόχρονους να βαράνε την εφαρμογή.

    ( Όπως θα'λεγε κι ο Claudio Νατάσα - ναί, ήμουν εκεί ... ;] - "It depends", ε; :D )
    Angel
    O:]
  •  13-11-2006, 22:41 20299 σε απάντηση της 20298

    Απ: Enable/Disable ανάλογα με δικαιώματα και άλλες συνθήκες

    I don't know what you're talking about Stick out tongue


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