Felder dynamisch aus Datenbank erzeugen
-
Hey,
ich möchte in einem Formular einfache Berechnungen (Grundrechenarten) von einzugebenen Werten durchführen. Bedingungen (wenn Feld100 > 1000, dann ...) sollten eigentlich die Ausnahme bleiben.
Da die Anzahl der verwendeten Felder dynamisch erweiterbar sein sollen, würde ich gerne alles (inkl. der Formeln z.B Feld99-Feld66) in der Datenbank hinterlegen und die Formularfelder daraus dynamisch generieren. Also ein Art "Excel" als C#-Applikation.
Was kann man hier für die Ansicht auf dem Bildschirm (WinForms) verwenden? Ein Spread oder Grid ähnelt zu sehr dem Excelstyle, sodaß mir echte Labels und Textboxen lieber wären. Ich suche eine Möglichkeit die dynamisch erstellten Controls weitestgehend automatisch anzuordnen, sodaß es danach ausschaut, als wäre alles zur Designzeit erstellt worden.
Was für einen Ansatz könnte man fahren? Besten Dank für die Tips im Voraus.
viele grüße
_chris
-
Du könntest zur Anordnung ein TableLayoutPanel verwenden und dort dann die Labels und TextBoxen drauf platzieren.
Dies habe ich für eine Anwendung auch so programmiert (die Daten kamen dabei aber aus einer Konfigurationsdatei).
-
Ich habe es gerade damit getestet. Das geht erstaunlich gut.
Das dynamische erzeugen der Felder klappt schon mal problemlos.
Ich habe noch ein kleines problem beim Referenzieren des aus der Datenbank ermittelten Textes z.B. feld100 auf das Control mit dem namen feld100.hast du auch dafür noch einen tipp?
schönen dank.
_chris
-
Habs
Falls es mal jemand benötigt:
layoutPanel.Controls.Find() ist da sehr hilfreich ...Viele Grüße
chris
-
Hallo chris,
wieviele Textfelder werden es denn ungefähr? Das TableLayoutPanel gewinnt unter den Winform-Controls keinen Performancepreis.
Und optisch ansprechend ist es imho auch nicht, xxx Textboxen zu haben.Das DataGridView ist ein sehr mächtiges Control und unterstützt sogar eine Art Paging (VirtualMode), falls Anzahl der Daten zu groß wird.
Optisch sehr flexibel ist es auch noch, kennt Databinding und vieles mehr.Was spricht dagegen?
-
Hey µ,
es sind vermutlich unter 50 Label und Eingabefelder. Das DataGridView hatte ich wg. dem "Exceldesign" aussen vor gelassen.
Ich habe eben gelesen, dass man da direkt Formeln (Expression) hinterlegen kann. Gibt es einen 'Trick' wie ich das über mehrere Zeilen machen kann, z.B. [Zeile1,Spalte1] + [Zeile3,Spalte5]. Das würde mich noch mal vom Grid überzeugen
Mein erster Ansatz die Formeln zu berechnen war das Zeug zur Laufzeit zu kompilieren und dann das Ergebnis in die Felder zu schreiben. Das war allerdings viel zu langsam. Mein aktueller Ansatz ist die Werte aus dem Feldern zu holen und die Datenbank das Ergebnis berechnen zu lassen und dann zurück ins Feld schreiben. C# bräuchte ein Eval()-Funktion, wie man sie in anderen Sprachen kennt
Viele Grüße
_chris
-
_chris schrieb:
es sind vermutlich unter 50 Label und Eingabefelder. Das DataGridView hatte ich wg. dem "Exceldesign" aussen vor gelassen.
Ok 50 sind nicht viel.
_chris schrieb:
Ich habe eben gelesen, dass man da direkt Formeln (Expression) hinterlegen kann. Gibt es einen 'Trick' wie ich das über mehrere Zeilen machen kann, z.B. [Zeile1,Spalte1] + [Zeile3,Spalte5]. Das würde mich noch mal vom Grid überzeugen
Imho ist da Handarbeit angesagt. Schau mal hier:
http://www.codeproject.com/Articles/17853/Implementing-an-Excel-like-formula-engine
Abgesehen vom Excel-Design dürfte das Deinen Anforderungen entsprechen, oder?_chris schrieb:
Mein erster Ansatz die Formeln zu berechnen war das Zeug zur Laufzeit zu kompilieren und dann das Ergebnis in die Felder zu schreiben. Das war allerdings viel zu langsam. Mein aktueller Ansatz ist die Werte aus dem Feldern zu holen und die Datenbank das Ergebnis berechnen zu lassen und dann zurück ins Feld schreiben. C# bräuchte ein Eval()-Funktion, wie man sie in anderen Sprachen kennt
Wie und was hast Du zur Laufzeit kompiliert? Warum ist es schneller, die Datenbank Berechnungen durchführen zu lassen?
Eval-Funktion == Lexer & Parser für einfache Mathematische Ausdrücke. Gibt es zur Genüge, auch in obigem Projekt. Selbst mit den .NET-Mitteln ist da vieles mit wenig Code möglich.Gruß, µ
-
µ schrieb:
Wie und was hast Du zur Laufzeit kompiliert? Warum ist es schneller, die Datenbank Berechnungen durchführen zu lassen?
Ich bekomme aus der DB als Beispiel für Feld1 den Formelstring "Feld2+Feld3" zurückgeliefert.
Für Feld1.Text muss dann ja z.B. "Convert.ToFloat(Feld2.Text) + Convert.ToFloat(Feld3.Text)" zugewiesen werden? Den Formelstring habe ich kompiliert und ausführen lassen, was leider aber viel zu langsam war.Im 2. Versuche hole ich alle Werte aus den Controls wie hier z.B. "100+200" als String. Das kann ich dann durch einen noch zu schreibenden Parser geben und den Rückgabewert dem Feld1.Text zuweisen
Wenn die Datenbank mir das Berechnet (mit Select 100+200 ...) kann man auch gleich komplette SQL-Statements und CASE/WHEN-Konstrukte in der DB ablegen.Wenn es einfacher geht, bin ich für jede Idee offen.
_chris
-
Hallo _chris,
für die Formelberechnung schau dir mal meinen Parser für mathematische Formeln an.
-
Morgen Th69,
super, das kann ich sehr gut gebrauchen. Danke.
Viele Grüsse
_chris