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

 

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

Combobox style Dropdownlist και value assignment

Îåêßíçóå áðü ôï ìÝëïò Q-apprentice. Τελευταία δημοσίευση από το μέλος Q-apprentice στις 19-04-2012, 13:45. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-04-2012, 16:58 70055

    Combobox style Dropdownlist και value assignment

    Καλησπέρα σε όλους. έχω προσθέσει ένα combobox με style dropdownlist σε μια φόρμα και θέλω να του περάσω εγώ μια τιμή να εμφανίσει, όταν φορτώνει η φόρμα. δεν το θέλω σαν σκέτο dropdown έτσι ώστε να μην μπορούν οι χρήστες να γράψουν κάτι κατα λάθος. Είναι εφικτό να γίνει κάτι τέτοιο ; Αυτό που προσπαθώ να κάνω είνια κάτι σαν το παρακάτω κώδικα

    1
     
            Research_Form.Attendant_ComboBox.SelectedValue = getAttendant()
    όπου getAttendant() είναι μια function τύπου String η οποία επιστρέφει ένα λεκτικό, το οποίο υπάρχει και στο control αν κάνει κανείς dropdown.


    Στη διάθεση σας για οποιαδήποτε διευκρίνιση

    Αντώνης Ε. Κόλλιας
  •  18-04-2012, 17:25 70056 σε απάντηση της 70055

    Απ: Combobox style Dropdownlist και value assignment

    Το επιλεγμένο item αλλάζει με τις SelectedItem, SelectedIndex, όχι από τις SelectedText ή SelectedValue. Αν το combo περιέχει μόνο strings, μπορείς να αλλάξεις την επιλογή θέτοντας την SelectedItem στο string που θέλεις.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-04-2012, 10:53 70063 σε απάντηση της 70056

    Απ: Combobox style Dropdownlist και value assignment

    Παναγιώτη το δοκίμασα με SelectedItem καθότι έχει strings όντως, αλλά δεν δούλεψε...μήπως πρέπει να κοιτάξω και τίποτα άλλο ; (οποιαδήποτε συμβουλή είναι ευπρόσδεκτη).

    Ευχαριστώ εκ των προτέρων.

    Αντώνης Ε. Κόλλιας
  •  19-04-2012, 11:03 70064 σε απάντηση της 70063

    Απ: Combobox style Dropdownlist και value assignment

    Τί δοκίμασες γιατί προφανώς ... σε εμένα δούλεψε!

    Ο παρακάτω κώδικας φορτώνει 4 strings και επιλέγει το τρίτο:
    this.comboBox1.DropDownStyle=ComboBoxStyle.DropDownList;
    this.comboBox1.Items.AddRange(new[]{"Eeeny","Meeny","Miny","Moo"});
    this.comboBox1.SelectedItem= "Miny";


    Η χρήση του AddRange είναι καθαρά για λόγους τεμπελιάς.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-04-2012, 11:20 70065 σε απάντηση της 70064

    Απ: Combobox style Dropdownlist και value assignment

    Κάνω populate το combobox με το παρακάτω κώδικα

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            'Research_Routines.Research_Descr()
            '-----------------------------------------------------------------------------------------------------
            'πλήρωση του combobox
            sqlComm = "SELECT FullName FROM [20_Users] ORDER BY FullName"
            DA = New SqlDataAdapter(sqlComm, Connection)
            DS = New DataSet()
            DA.Fill(DS, "20_Users")
            DT = DS.Tables("20_Users")
            Attendant_ComboBox.DropDownStyle = ComboBoxStyle.DropDownList
            With Attendant_ComboBox
                .DataSource = DT
                .DisplayMember = "FullName"
                .ValueMember = "FullName"
                .SelectedIndex = 0
            End With
            '-----------------------------------------------------------------------------------------------------

    στη συνέχεια η function getAttendant() είναι η ακόλουθη

    1
    2
    3
    4
    5
    6
    7
    8
     
        Public Function getAttendant() As String
            'θα επιστρέψει το FullName field (όπως εμφανίζεται στο dropdown menu της φόρμας για την χρήση αυτού στην επιλογή υπεύθυνου υλοποίησης...)
            sqlComm = "SELECT FullName FROM [20_Users] " _
                    & "WHERE " _
                    & "FName + ' ' + LName = '" & Research_Form.Case_Attendant_Label_text.Text & "'"
            Dim command As New SqlCommand(sqlComm, Connection)
            getAttendant = command.ExecuteScalar.ToString
        End Function

    όταν λοιπόν φορτώνει η φόρμα στο FormLoad φορτώνει και η παρακάτω γραμμή

    1
     
            Research_Form.Attendant_ComboBox.SelectedItem = getAttendant()

    Τι στιγμή που έχει φορτώσει το combobox και έχει γίνει populate, δεν θα έπρεπε κανονικά να λειτουργήσει ; εκτός και αν μου διαφεύγει κάτι...



    Αντώνης Ε. Κόλλιας
  •  19-04-2012, 12:19 70067 σε απάντηση της 70065

    Απ: Combobox style Dropdownlist και value assignment

    Το combo σου ΔΕΝ περιέχει strings. Έχει γίνει data binding σε ένα datatable οπότε και τα items που περιέχει ΔΕΝ είναι strings αλλά DataRowView. Δεν μπορείς να συγκρίνεις ένα DataRow με ένα string οπότε δεν μπορείς να χρησιμοποιήσεις έτσι απλά την SelectedItem.

    Για να επιλέξεις κάτι σε αυτή την περίπτωση πρέπει να θέσεις την αντίστοιχη τιμή στο SelectedValue, όπως παρακάτω:

                var table = new DataTable();
                table.Columns.Add("ID", typeof (int));
                table.Columns.Add("Name", typeof(string));
    
                table.Rows.Add(1, "Eeeny");
                table.Rows.Add(2, "Meeny");
                table.Rows.Add(3, "Miny");
                table.Rows.Add(4, "Moo");
    
    
                this.comboBox1.DropDownStyle=ComboBoxStyle.DropDownList;
                this.comboBox1.DisplayMember = "Name";
                this.comboBox1.ValueMember = "Name";
                this.comboBox1.DataSource = table;
                this.comboBox1.SelectedValue = "Miny";

    Γενικά πάντως σαν ValueMember χρησιμοποιείται το κλειδί μίας εγγραφής (π.χ. το ID) καθώς αυτό είναι που χρησιμοποιείται συνήθως στη βάση, όχι το λεκτικό. 

    Επιπλέον, ο κώδικας που έχεις γράψει για να εκτελέσεις το query είναι επικίνδυνος και αργός. Μπορεί άνετα κάποιος κακόβουλος χρήστης να δώσει κάποια "περίεργη" τιμή και να προκαλέσει SQL Injection. Για φαντάσου τί θα συμβεί αν δώσει '; DROP TABLE [20_Users]; -- . 
    Άλλο πρόβλημα του κώδικα είναι ότι μετατρέπει όλες τις τιμές σε ASCII, ακόμα και τις ημερομηνίες και τα νούμερα, πριν τα στείλει στο server με αποτέλεσμα διάφορα παρατράγουδα, αν π.χ. το 3.5 μεταφραστεί σε 3,5 ή η 31/12 φύγει ως 12/31. Και μην πούμε για τα προβλήματα όταν τα ελληνικά μετατραπούν σε ASCII.

    Αντί για string concatenation θα πρέπει να χρησιμοποιήσεις είτε parameterized queries είτε stored procedures (στα οποία θα περάσεις τις παραμέτρους ως ΠΑΡΑΜΕΤΡΟΥΣ, όχι με string concatenation). Το αποτέλεσμα είναι πιο ασφαλές, καθώς οι παράμετροι μεταφέρονται ξεχωριστά από το κείμενο και χωρίς μετατροπή σε string, ενώ είναι και πολύ γρηγορότερο καθώς ο SQL Server κάνει cache το execution plan κάθε query και μπορεί να κάνει parse πολύ γρηγορότερα τα parameterized queries που έχει ξαναδεί.

    Για παράδειγμα, μπορείς να περάσεις το όνομα με τον παρακάτω τρόπο:
                using (var connection = new SqlConnection(""))
                {
                    // Create the command and set its properties.
                    var command = new SqlCommand("SELECT FullName FROM [20_Users] WHERE FName + ' ' + LName = '@fullName'",connection);
                    command.CommandType =CommandType.Text;
    
                    var parameter = new SqlParameter
                                        {
                                            ParameterName = "@fullName",
                                            SqlDbType = SqlDbType.NVarChar,
                                            Direction = ParameterDirection.Input,
                                            Value = "some name"
                                        };
    
                    // Add the parameter to the Parameters collection. 
                    command.Parameters.Add(parameter);
    
                    // Open the connection and execute the reader.
                    connection.Open();
                    var attendant=(string)command.ExecuteScalar();
                }
    Τέλος, το WHERE είναι προβληματικό καθώς το contatenation σημαίνει ότι δεν μπορεί να χρησιμοποιηθεί κανένα index και ο server θα πρέπει να διαβάσει ολόκληρο τον πίνακα για να βρει το αποτέλεσμα. Θα ήταν καλύτερα να δημιουργήσεις είτε ένα calculated field με την τιμή του FullName το οποίο θα βάλεις σε ένα index ή να αλλάξεις το WHERE και να περνάς ξεχωριστά το First και το Last Name, δηλαδή να γίνει το εξής:
    WHERE FName=@firstName AND LName=@lastName
     Σε αυτή την περίπτωση θα πρέπει να δημιουργήσεις ένα άλλο index το οποίο θα περιλαμβάνει τα δύο πεδία.
    

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-04-2012, 13:45 70068 σε απάντηση της 70067

    Απ: Combobox style Dropdownlist και value assignment

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

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