chrism4111 Δημοσ. 11 Μαΐου 2011 Δημοσ. 11 Μαΐου 2011 Για σας και πάλι .. Ας μπω γρήγορα στο θέμα .. Εργάζομαι me to VisualStudio 2008 και με το Compact FrameWork.. Θέλω να καλέσω ένα object το οποίο είναι ήδη στο design mode στη φόρμα με τον εξης τροπο. έχω για παράδειγμα το button1 και button2 θέλω με >for(i=1;i<=2;i++) { button+i.Text = "Text"; } πως κάτι τέτοιο μπορεί να γίνει εφικτό στην C# Προσοχή αυτο που ζητάω πρέπει να γίνει σε combact framework αρα καποια λύση να ειναι εφορμόσιμη σε αυτο .. Ευχαριστω εκ των προτέρων **Πριν κλείσω έχω καταφέρει να πετύχω αυτό με έναν άλλον τρόπο δείτε τον: > Control[] ctrl = { button1,button2 }; for(i=0;i<2;i++) { ctrl[i].Text = "Text"; } //Φανταστείτε να έχω όμως 30+ buttons (που έχω 33 buttons) μέσα στην φόρμα πόσο αργά μου δινει το αποτέλεσμα. Συνολικά για 33 buttons κάνει 12.5 δευτερόλεπτα για να τελειώσει της επαναλήψεις(Το i του παρακάτω κώδικα το χρησιμόποιώ για να κάνω ερώτημα σε έναν πίνακα βάσης δεδομένων (SqlCeCompact) που μου εξάγει κάποιον αριθμο και αυτος μπαίνει μετα σαν index του πίνακα array των buttons).
alexnir Δημοσ. 11 Μαΐου 2011 Δημοσ. 11 Μαΐου 2011 Για σας και πάλι .. Ας μπω γρήγορα στο θέμα .. Εργάζομαι me to VisualStudio 2008 και με το Compact FrameWork.. Θέλω να καλέσω ένα object το οποίο είναι ήδη στο design mode στη φόρμα με τον εξης τροπο. έχω για παράδειγμα το button1 και button2 θέλω με >for(i=1;i<=2;i++) { button+i.Text = "Text"; } πως κάτι τέτοιο μπορεί να γίνει εφικτό στην C# Προσοχή αυτο που ζητάω πρέπει να γίνει σε combact framework αρα καποια λύση να ειναι εφορμόσιμη σε αυτο .. Ευχαριστω εκ των προτέρων **Πριν κλείσω έχω καταφέρει να πετύχω αυτό με έναν άλλον τρόπο δείτε τον: > Control[] ctrl = { button1,button2 }; for(i=0;i<2;i++) { ctrl[i].Text = "Text"; } //Φανταστείτε να έχω όμως 30+ buttons (που έχω 33 buttons) μέσα στην φόρμα πόσο αργά μου δινει το αποτέλεσμα. Συνολικά για 33 buttons κάνει 12.5 δευτερόλεπτα για να τελειώσει της επαναλήψεις(Το i του παρακάτω κώδικα το χρησιμόποιώ για να κάνω ερώτημα σε έναν πίνακα βάσης δεδομένων (SqlCeCompact) που μου εξάγει κάποιον αριθμο και αυτος μπαίνει μετα σαν index του πίνακα array των buttons). το προβλημα σου ειναι εκει. να σου υπενθυμισω πως η sqlce διαβαζει σειριακα και αμα εχεις βαλει και καποιον ελεγχο μεσα του πεδιου, τοτε ισως και να ειναι λογικος ο χρονος. παντως σε παραδειγμα που εστησα με 30 κουμπια, δεν ξεπερασε ο χρονος το 1 sec.
chrism4111 Δημοσ. 11 Μαΐου 2011 Μέλος Δημοσ. 11 Μαΐου 2011 > private void Tables_Load(object sender, EventArgs e) { Control[] ctrol = { button1, button1, button2, button3, button4, button5, button6, button7, button8, button1, button1, button11, button12, button13, button14, button15, button16, button17, button18, button19, button20, button1, button1, button1, button1, button1, button1, button1, button1, button1, button1, button31, button32, button33, button34, button35 }; this.activeTables2TableAdapter.Fill(this.appDatabase1DataSet.activeTables2); int i = this.activeTables2TableAdapter.GetData().Rows.Count; if (i > 0) { for (int y = 0; y < i; y++) { string str = this.activeTables2TableAdapter.GetData().Rows[y]["TableNo"].ToString(); int numberArray = Convert.ToInt32(str); ctrol[numberArray].BackColor = Color.Lime; } } } Για την ακρίβεια ο κώδικας είναι ο παρακάτω... Παίζω με Dataset για να τραβήξω δεδομένα απο την βάση μου.. Μήπως ο λόγος που αργή έχει να κανει με το οτι τρέχω το πρόγραμμα σε Windows Mobile 6.1? Αν το όλο αυτο στηνόταν σε Windows CE θα ήταν πιο γρήγορο?
alexnir Δημοσ. 11 Μαΐου 2011 Δημοσ. 11 Μαΐου 2011 δεν μπορω τωρα να το δοκιμασω αλλα αφαιρεσε σε παρακαλω την παρακατω γραμμη και δες χρονο. ctrol[numberArray].BackColor = Color.Lime; παντως να ξερεις πως οσο πιο μεγαλη ειναι η βαση και οσο πιο πολλα rows σου επιστρεφει, τοσο περισσοτερο θα αργει η διαδικασια αυτη. οχι, δεν θα ειναι καλυτερα σε Windows CE. ποιο framework χρησιμοποιεις? φανταζομαι το 3,5, ετσι?
chrism4111 Δημοσ. 11 Μαΐου 2011 Μέλος Δημοσ. 11 Μαΐου 2011 δεν μπορω τωρα να το δοκιμασω αλλα αφαιρεσε σε παρακαλω την παρακατω γραμμη και δες χρονο. ctrol[numberArray].BackColor = Color.Lime; παντως να ξερεις πως οσο πιο μεγαλη ειναι η βαση και οσο πιο πολλα rows σου επιστρεφει, τοσο περισσοτερο θα αργει η διαδικασια αυτη. οχι, δεν θα ειναι καλυτερα σε Windows CE. ποιο framework χρησιμοποιεις? φανταζομαι το 3,5, ετσι? Φυσικά και σε 3.5. Θα δοκιμάσω να βγάλω το χρώμα να δω την διαφορά..
chrism4111 Δημοσ. 12 Μαΐου 2011 Μέλος Δημοσ. 12 Μαΐου 2011 Το έκανα χωρίς χρώμα τελικα και πάλι τα ίδια. Επεσε βέβαια 2 δευτερόλεπτα ο χρόνος αλλα και πάλι είναι αργό.
kagelos Δημοσ. 13 Μαΐου 2011 Δημοσ. 13 Μαΐου 2011 string str = this.activeTables2TableAdapter.GetData().Rows[y]["TableNo"].ToString(); Κράτα το αποτέλεσμα της this.activeTables2TableAdapter.GetData() σε μια μεταβλητή αντίστοιχου τύπου, ώστε να μην καλείς την GetData() διαρκώς.
chrism4111 Δημοσ. 13 Μαΐου 2011 Μέλος Δημοσ. 13 Μαΐου 2011 string str = this.activeTables2TableAdapter.GetData().Rows[y]["TableNo"].ToString(); Κράτα το αποτέλεσμα της this.activeTables2TableAdapter.GetData() σε μια μεταβλητή αντίστοιχου τύπου, ώστε να μην καλείς την GetData() διαρκώς. η getData δεν γίνετε να μην καλείτε συνεχώς απο αυτήν παίρνω τα δεδομένα κάθε σειράς του πεδίου [TableNo] και το βάζω ουσιαστικά σαν δείκτη για να καλέσω το κατάλληλο object από τον πίνακα array που έχω δηλωμένο παραπάνω. Έχω σκεφτεί βέβαια και μια άλλη εκδοχή να φτιάξω μια κλάση σε εξωτερικό αρχείο η οποία θα επιστρέφει έναν πίνακα array και θα παίρνω από εκεί τα δεδομένα χωρίς να χρειάζεστε να τα τραβάω από την βάση δεδομένων . Μόνο μειονέκτημα όμως αυτής της εκδοχής είναι ότι μόλις η εφαρμογή κλείσει τότε αυτές οι μεταβλητές θα χάνονται. Αλλά μπορώ κατά την διάρκεια του ανοίγματος του προγράμματος στο splash screen να φορτώνω στην κλάση ξανά τις μεταβλητές που θέλω. Το πρόβλημα μου όμως είναι ότι δεν έχω χρησιμοποιήσει ξανά κλάση η οποία θα επιστρέφει πίνακα array. Μπερδεύομαι με τους getters και setters. Μπορεί κάποιος να μου δώσει ένα τέτοιο παράδειγμα?
kagelos Δημοσ. 14 Μαΐου 2011 Δημοσ. 14 Μαΐου 2011 > DataTable t = this.activeTables2TableAdapter.GetData(); for (int y = 0; y < i; y++) { string str = t.Rows[y]["TableNo"].ToString(); .... } Κάλεσε την GetData όπως σου είπα μια φορά.
chrism4111 Δημοσ. 14 Μαΐου 2011 Μέλος Δημοσ. 14 Μαΐου 2011 > DataTable t = this.activeTables2TableAdapter.GetData(); for (int y = 0; y < i; y++) { string str = t.Rows[y]["TableNo"].ToString(); .... } Κάλεσε την GetData όπως σου είπα μια φορά. Sorry δεν το κατάλαβα ότι το εννοούσες με αυτόν τον τρόπο. Για να δω θα υπάρξει διαφορά?? Τ ο κανω καιαπαντώ Sorry δεν το κατάλαβα ότι το εννοούσες με αυτόν τον τρόπο. Για να δω θα υπάρξει διαφορά?? Τ ο κανω καιαπαντώ Είσαι θεός τεράστια διαφορά (αφού φορτώνει στην μνήμη μια φόρα το DataTable). από τα 10 δευτερόλεπτα με έριξες στο 1 δευτερόλεπτο .... Ευχαριστώ πάρα μα πάρα πολύ αφού δεν μου έλυσες μόνο αυτό αλλά και πολλά κομμάτια όλης της εφαρμογής..
kagelos Δημοσ. 14 Μαΐου 2011 Δημοσ. 14 Μαΐου 2011 Μιας και από ότι καταλαβαίνω είσαι λίγο αρχάριος, να έχεις γενικά στο νου όταν προγραμματίζεις το εξής : Το ότι καλείς μια συνάρτηση και αυτό γίνεται σε μια γραμμή κώδικα, δεν σημαίνει ότι θα εκτελεστεί και αμέσως. Μπορεί να κάνει 1002 πράγματα η συνάρτηση όταν την καλείς.
chrism4111 Δημοσ. 14 Μαΐου 2011 Μέλος Δημοσ. 14 Μαΐου 2011 Μιας και από ότι καταλαβαίνω είσαι λίγο αρχάριος, να έχεις γενικά στο νου όταν προγραμματίζεις το εξής : Το ότι καλείς μια συνάρτηση και αυτό γίνεται σε μια γραμμή κώδικα, δεν σημαίνει ότι θα εκτελεστεί και αμέσως. Μπορεί να κάνει 1002 πράγματα η συνάρτηση όταν την καλείς. Ναι είμαι αρχάριος οσον αφορα τα dataset(αφου τα χρησιμόποιω για πρώτη φορά και προγραμματίζω για πρώτη φορα εφαρμογή σε Compact Framework το οποίο είναι αρκετά περιορισμένo σε σχέση με το .ΝΕΤ Framework) o κωδικας που έχει σχηματιστεί πίσω απο το dataset(design.cs) είναι γύρω στις 6000 γραμμές και εκει έχω χάσει λιγο την μπάλα. Αυτην την στιγμή έχω σχεδον τελιωσει την εφαρμογή και προσπαθώ να πετύχω οσο μικρότερους χρόνους γίνετε στο κομάτι επικοινωνίας του προγραμματος με την βάση δεδομένων (δηλαδη InsertQuerys, DeleteQuerys , UpdateQuerys). > for (int y = 0; y < dataGrid1.VisibleRowCount; y++) { payCheckTableAdapter.InsertQuery(TableNo.GlobalValue, duration, (Convert.ToDouble(text))/(dataGrid1.VisibleRowCount), DateTime.Now, null, getTime(Convert.ToDateTime(dataGrid1[y,1]))); } H TableNo.GlobalValue είναι μια μετάβλητη η οποια ειναι global, η duration είναι μεταβλητη που περνει ουσιαστηκα μια τιμη απο την getTime H getTime ειναι μια δικη μου συνάρτηση που το μονο που κανει ειναι να επιστρέφει ένα αριθμό απο αφαιρεση δύο ημερομινιών ολες δηλαδή η μεταβλητες δεν έχουν να κανουν με διάβασμα δεδομένων απο την βάση μου Πως θα μπορέσω να μειωσω το χρόνο σε αυτην εδω την επαναληψη;
kagelos Δημοσ. 14 Μαΐου 2011 Δημοσ. 14 Μαΐου 2011 Δεν ξέρω αν γίνεται να μειώσεις το χρόνο εκτέλεσης εδώ. Η InsertQuery τι κάνει; Insert στη βάση; Connection δεν χρειάζεται; Θα ήταν ένα πιθανό bottleneck αν σε κάθε κλήση της InsertQuery ανοιγοκλείνεις ένα connection.
chrism4111 Δημοσ. 14 Μαΐου 2011 Μέλος Δημοσ. 14 Μαΐου 2011 Δεν ξέρω αν γίνεται να μειώσεις το χρόνο εκτέλεσης εδώ. Η InsertQuery τι κάνει; Insert στη βάση; Connection δεν χρειάζεται; Θα ήταν ένα πιθανό bottleneck αν σε κάθε κλήση της InsertQuery ανοιγοκλείνεις ένα connection. Εισαγωγή δεδομενων στην βάση. connection γίνετε με το που καλω την insertQuery. Ακριβως αυτο γίνετε ανοιγοκλείνει ενα connection με to dataset.
kagelos Δημοσ. 14 Μαΐου 2011 Δημοσ. 14 Μαΐου 2011 Ε θα πρέπει να το αλλάξεις ως εξής (στο περίπου) : > SqlConnection conn = new SqlConnection(connectionString); conn.open(); for (int y = 0; y < dataGrid1.VisibleRowCount; y++) { payCheckTableAdapter.InsertQuery(param1, param2 ..., conn); } conn.close(); Είτε άλλαξε την InsertQuery ώστε να παίρνει παράμετρο το connection ή φτιάξε μια overload. To ζήτημα είναι να ανοίξεις ένα connection για τα διαδοχικά queries και όχι να ανοίγεις ένα για κάθε query.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.