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

 

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

Το γενικό control δεν έχει property Checked. Τότε πως το τσεκάρω?

Îåêßíçóå áðü ôï ìÝëïò sakis_drm. Τελευταία δημοσίευση από το μέλος sakis_drm στις 13-09-2010, 21:16. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-09-2010, 15:41 59968

    Το γενικό control δεν έχει property Checked. Τότε πως το τσεκάρω?

    Καλησπέρα,

    έχω ένα μηχανισμό για να τσεκάρονται αυτόματα ορισμένα από τα checkBoxes ενός container. Ψάχνω σε όλα τα controls του container για τα checkboxes και μετά για καθένα από αυτά αν αναφέρει την οδηγία "CheckMe" στο tag του. To πρόβλημα είναι ότι το ctrl δεν έχει property checked για να το ορίσω σε true.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (Control ctrl in grpFields.Controls)
    {
    	if (ctrl.GetType().Name.Equals("CheckBox"))
    	{
    		if (!ReferenceEquals(ctrl.Tag, "Checkme"))
    		{
    			// Τσέκαρε το ctrl
    		}
    	}
    }

    Φαντάζομαι ότι πρέπει να γίνει κάποιο cast σε checkBox και να γίνει με αναφορά στο αρχικό ctrl, αλλά δεν μπορώ να το καταφέρω.

  •  12-09-2010, 18:52 59971 σε απάντηση της 59968

    Απ: Το γενικό control δεν έχει property Checked. Τότε πως το τσεκάρω?

     
    private void DoSomethingToControls1(Control parentControl)
    {
               
            foreach (Control ctrl in parentControl.Controls)
            {
                  if (ctrl is CheckBox)
                  {
                       if (ctrl.Tag.ToString()=="Checkme")
                       {
                           ((CheckBox)(ctrl)).Checked=true;   //Casting σε CheckBox
                       }
                        
                  }

            }
    }

    //Το ίδιο με Linq!!!
    private void DoSomethingToControls2(Control parentControl)
    {
         foreach (var ctrl in parentControl.Controls.OfType<CheckBox>().Where(ctrl => ctrl.Tag.ToString() == "Checkme"))
         {
                ctrl.Checked = true;
         }
    }
    Μπλουγουράς Γιάννης
    Wizcom O.E.
  •  12-09-2010, 19:04 59972 σε απάντηση της 59971

    Απ: Το γενικό control δεν έχει property Checked. Τότε πως το τσεκάρω?

    Η εξωτερική παρένθεση έκανε τη διαφορά !
    Αυτό που έγραφα ήταν το εξής :

    (CheckBox)(ctrl).Checked = true;


    Και ήταν λογικό το παράπονο του.

    Επίσης να σημειωθεί και η βελτίωση στην αναγνωσιμότητα με την χρήση του τελεστή is.

    LINQ πρέπει κάποια στιγμή να μάθουμε.. thanks για την επιπλέον αναφορά!

  •  12-09-2010, 21:39 59973 σε απάντηση της 59972

    Απ: Το γενικό control δεν έχει property Checked. Τότε πως το τσεκάρω?

    Ενημερωτικά το :
    if (ctrl.Tag.ToString() == "CheckMe")
    { ...}
    Σκάει το κλασσικό object reference not set to an instance of an object...

    γι αυτό χρησιμοποιώ το εξής:

    if (ReferenceEquals(ctrl.Tag, "CheckMe"))
    { ... }

  •  13-09-2010, 10:52 59980 σε απάντηση της 59973

    Απ: Το γενικό control δεν έχει property Checked. Τότε πως το τσεκάρω?

    Αντί γι αυτό, κάνε τον απλούστατο έλεγχο: if (ctl.Tag != null). Η χρήση του ReferenceEquals είναι εντελώς περιττή και απλά δεν κάνει αυτό που νομίζεις. Αντί να ελέγχει αν το περιεχόμενο των string είναι ίδιο, ελέγχει αν είναι το ίδιο string instance. Στην περίπτωση σου ΕΤΥΧΕ να είναι ίδια, γιατί το .NET δημιουργεί μόνο ένα instance για κάθε string που δημιουργείται στον κώδικα. Αν π.χ. το tag έπαιρνε τιμή από κάποιο textbox, το ReferenceEquals θα αποτύγχανε.

    Γενικά, νομίζω ότι πρέπει να δώσεις λίγη προσοχή στους τύπους και πως δουλεύει το casting,  γιατί κόλπα όπως το GetType().Name, ή το ReferenceEquals είναι και περιττά και οδηγούν σε προβλήματα. 

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  13-09-2010, 11:23 59982 σε απάντηση της 59973

    Απ: Το γενικό control δεν έχει property Checked. Τότε πως το τσεκάρω?

    Καλησπέρα,

    ενημερωτικά:

    ο τελεστής '==' λειτουργεί διαφορετικά για value types,Reference types.

    Όταν κάνουμε χρήση του τελεστή '==' σε μεταβλήτη τύπου object θα κάνει χρήση εσωτερικά την ReferenceEquals.

    Όταν κάνουμε χρήση του τελεστή '==' σε μεταβλήτη τύπου string θα κάνει χρήση εσωτερικά την Equals.



    Οι δύο παρακάτω τιμές έχουν την ίδια τιμή "sss".
    var str1 = new string('s', 3);
    var str2 = new string('s',3);


    //Με την ReferenceEquals οι δύο μεταβλητές str1 και str2 δίνουν το αποτέλεσμα false, διότι οι μεταβλητές τύπου string είναι reference types και ελέγχουμε αν η διεύθυνση των μεταβλητών δείχνει στο ίδιο σημείο στην μνήμη.
    var boulValue=ReferenceEquals(str1, str2) //false

    //Παρακάτω η ReferenceEquals δίνει αποτέλεσμα true , διότι το CLR κάνει χρήση ενός μηχανισμού που ονομάζεται string interning. http://en.wikipedia.org/wiki/String_interning
    var str1 = "sss";
    var str2 = "sss";
    var boulValue=ReferenceEquals(str1, str2) //true

    Λίγο προσοχή με την referenceEquals.

    Για να ελέγχεις για αν oi τιμές δύο μεταβλητών τύπου string έχουν την ίδια τιμή μπορείς να κάνεις χρήση και την .Equals.
    var str1 = "Checkme";
    var boulValue= str1.Equals(str2)




    Μπλουγουράς Γιάννης
    Wizcom O.E.
  •  13-09-2010, 11:35 59983 σε απάντηση της 59982

    Απ: Το γενικό control δεν έχει property Checked. Τότε πως το τσεκάρω?

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

    Μπλουγουράς Γιάννης
    Wizcom O.E.
  •  13-09-2010, 21:16 59986 σε απάντηση της 59983

    Απ: Το γενικό control δεν έχει property Checked. Τότε πως το τσεκάρω?

    Το συγκεκριμένο κομμάτι κώδικα είχε γραφτεί πολύ "στο πόδι" και επειδή είδαμε ότι παίζει  εκείνη τη στιγμή προχωρήσαμε παρακάτω... κλασσική γενησιουργός αιτία των bugs ! Ευχαριστώ πολύ για τις οδηγίες σας, οι οποίες αποτελούν αφορμή για περισσότερη μελέτη, στο άμεσο μέλλον Smile
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems