Καλησπέρα καλησπέρα. Αποφάσισα και εγώ σαν παιδί να φτιάξω ένα callback αλλά αυτός ο καταραμένος ο index (παραλαγή του καταραμένου όφι) αποφάσισε να μας ταλαιπωρήσει.
Αλλά ας πάρουμε τα πράγματα από την αρχή.
Έχω δύο dropdownlists. Η δευτέρη λίστα γεμίζει ανάλογα της επιλογής που έχει γίνει στην πρώτη. Μέχρι τώρα είχα στην πρώτη DDL ενεργοποιημένο το autopostback και εκεί μέσα είχα τον κώδικα για να γεμίζει την δεύτερη DDL. Όλα καλά και όλα ωραία. Αλλά να που τα δεδομένα γίνανε περισσότερα και όταν γίνεται post back ο χρήστης πρέπει να περιμένει κάποια secs για να φορτώσει η σελίδα, οπότε είπα ότι καλύτερα να το κάνω με callback στην πλευρά του client.
Το πρόβλημα που παρουσιάζεται είναι το εξής:
Όταν φορτώνει η σελίδα όλα καλά. Κάνω την πρώτη επιλογή μου στην πρώτη DDL (όποια να είναι από τη λίστα μέσα) και βλέπω πως η δεύτερη DDL γεμίζει αναλόγως.
Όταν πάω να επιλέξω μία νέα επιλογή από την πρώτη DDL τότε μου πετάει ένα popup το οποίο λέει
"Parameter Name: index". Λογικά το λάθος θα είναι του στυλ out of range, αυτό είδα ως πιο πιθανό σφάλμα μετά από γουγλοέρευνα, αλλά δεν μπορώ να καταλάβω ακριβώς που χτυπάει. Το ψάχνω εδώ και ένα δίωρο αλλά τίποτα. Σας δίνω τον κώδικα
Οι DDL είναι δύο
1. Κατασκευαστές αυτοκινήτων
2. Μοντέλα αυτοκινήτων
1 2 3 4 5 6 7 8 9 10 11 12 | <script type="text/jscript"> function BringModels(control) //Η function άυτή είναι στη ddl του κατασκευαστή { CarModelDDL.SetSelectedIndex(-1); CarModelDDL.SetEnabled(CarManufacturerDDL.GetSelectedIndex() > 0); if(control.GetValue() != "") { CarModelDDL.PerformCallback(control.GetValue()); CarModelDDL.SetFocus(); }
} </script> |
Βάζουμε την ddl των μοντέλων ως απενεργεποιημένη για default τιμή
1 2 3 4 5 6 | Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) If (Not IsCallback) Then CarModelDDL.SelectedIndex = -1 CarModelDDL.ClientEnabled = False End If |
Ο κώδικας που βρίσκεται μέσα στο callback του μοντέλου
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | Protected Sub CarModelDDL_Callback(ByVal source As Object, ByVal e As DevExpress.Web.ASPxClasses.CallbackEventArgsBase) '============================================================================== 'Μοντέλο - Αρχή '============================================================================== 'Δημιουργούμε ένα connection String για την Βάση Dim ModelsSQLConnectionString As String = ConfigurationManager.ConnectionStrings("CarAndBikesConnectionString").ConnectionString 'Δημιουργούμε ένα Connection για να συνδεθούμε στη βάση και του δίνουμε το Connection String Dim ModelsSQLConnection As New Data.SqlClient.SqlConnection ModelsSQLConnection.ConnectionString = ModelsSQLConnectionString 'Δημιουργούμε το SQL Command Dim ModelsSQLSelectCommand As New Data.SqlClient.SqlCommand ModelsSQLSelectCommand.CommandText = "SELECT DISTINCT CarModels.CarModels_ID, CarModels.CarModels_Value FROM Cars INNER JOIN CarModels ON Cars.Cars_ModelID = CarModels.CarModels_ID INNER JOIN Manufacturers ON CarModels.CarModels_ManufacturerID = " & e.Parameter ModelsSQLSelectCommand.Connection = ModelsSQLConnection 'Δημιουργούμε έναν νέο adapter και θέτουμε το Select SQL στον adapter Dim ModelsSQLAdapter As New Data.SqlClient.SqlDataAdapter ModelsSQLAdapter.SelectCommand = ModelsSQLSelectCommand 'Ανοίγουμε τη σύνδεση με τη βάση ModelsSQLConnection.Open() 'Δημιουργούμε ένα DataSet Dim ModelsDataSet As New Data.DataSet 'Γεμίζουμε το DataSet ModelsSQLAdapter.Fill(ModelsDataSet) ModelsSQLAdapter.FillSchema(ModelsDataSet, Data.SchemaType.Source) 'Κλείνουμε τη σύνδεση με τη βάση ModelsSQLConnection.Close() ModelsSQLConnection.Dispose() 'Βάζουμε τα δεδομένα σε έναν πίνακα Dim dtModels As Data.DataTable = ModelsDataSet.Tables(0) dtModels.TableName = "Models" Dim drModels As Data.DataRow = dtModels.NewRow drModels(0) = 0 drModels(1) = "" dtModels.Rows.Add(drModels) dtModels.AcceptChanges() Dim dvModels As New Data.DataView(dtModels) dvModels.Sort = "CarModels_Value" CarModelDDL.DataSource = dvModels CarModelDDL.TextField = dtModels.Columns.Item(1).ToString CarModelDDL.ValueField = dtModels.Columns.Item(0).ToString CarModelDDL.DataBind() '============================================================================== 'Μοντέλο - Τέλος '============================================================================== End Sub |