Visual C# 2010 Spalten umrechnen "wie in Excel"

...komplette Frage anzeigen

3 Antworten

So, habe mir mal Zeit genommen.

Benenne deine Textboxen wie folgt:

Muster für Summanden: txt_ZEILE_SPALTE
Muster für Quersumme: txt_ZEILE_L

txt_1_1    txt_1_2    txt_1_L

txt_2_1    txt_2_2    txt_2_L

Das Event KeyUp für alle Textboxen der Summanden lautet wie folgt:

private void txt_KeyUp(object sender, KeyEventArgs e)
{
    int i = 1;

    while (true)
    {
        string ctrlKey = "txt_" + i.ToString() + "_1";
        if (this.Controls.ContainsKey(ctrlKey))
        {
            int sum = 0;
            int teilSum = 0;
            int c = 1;

            while (true)
            {
                if (!int.TryParse(((TextBox)Controls[ctrlKey]).Text, out teilSum))
                    ((TextBox)Controls[ctrlKey]).Text = " ERROR";
                else
                    sum += teilSum;

                ctrlKey = "txt_" + i.ToString() + "_" + (++c).ToString();
                if (!this.Controls.ContainsKey(ctrlKey))
                {
                    ctrlKey = "txt_" + i.ToString() + "_L";
                    ((TextBox)Controls[ctrlKey]).Text = sum.ToString();
                    break;
                }
            }

            i++;
        }
        else
            break;
    }
}

Markiere alle Textboxen der Summanden und wähle für alle die obige Funktion KeyUp für das Ereignis "KeyUp". Das war alles. Solltest du noch weitere Textboxen benötigen, nummeriere sie nach geschilderten Muster fort. Die Textbox für die Quersumme hat hinten stets ein "L" zur Erkennung anstatt der Ziffer, die für die Spalte steht. Neuen Textboxen müssen natürlich auch das KeyUp-Event zugewiesen werden. Der Code erkennt automatisch die Anzahl der Summanden einer Zeile.

Im Code ist keine großartige Fehlererkennung integriert. Drum herum sollte auf jeden Fall ein Try-Catch. Außerdem solltest du verhindern, dass andere Zeichen als Ziffern eingegeben werden können. In die Felder für die Quersumme darf überhaupt keine Eingabe erfolgen, die sollten also auf ReadOnly gestellt werden. Zudem sollte noch mal geschaut werden, ob nicht eine Dauerschleife innerhalb der While-Schleifen möglich ist und abgefangen werden.

Sollten noch Fragen bestehen, kannst du dich gerne an mich wenden.

Viel Spaß!

Eine andere Lösung wäre, ein eigenes Benutzersteuerelement zu erstellen, innerhalb dessen du eine beliebige Anzahl Textboxen einfügen und deren Ergebnis berechnen kannst. Dieses Benutzersteuerelement könntest du anschließend so oft einfügen, wie es dir beliebt.

0

Um nur Ziffern in jedem Feld zuzulassen, wäre es möglich, alle Textfelder der Summanden auf folgendes KeyPress-Event zu setzen:

if ("1234567890\b".IndexOf(e.KeyChar) < 0)
    e.Handled = true;

Feierabend für heute! :)

0

Um eine Dauerschleife zu verhindern, aus welchen Gründen auch immer ausgelöst, könntest du anstatt des ersten "while(true)" ein "while(i<1000)" und anstatt des zweiten "while(c<1000)" setzen. Oder den "Schutzwert" gar auf 1 Mio. stellen, was aber Unsinn wäre, selbst 1000 Textboxen, egal ob senkrecht oder waagerecht, wirst du wohl kaum platzieren. Das soll nur eine Absicherung sein, solche Fallen sollten immer vermieden werden. Irgendwann anderer du oder jemand anderes etwas am Code, ohne ein Dauer-Loop zu bedenken, und schwubbs, hängt alles. Mit der Absicherung beendet sich die Schleife von selbst, kommt es zu außergewöhnlichen Werten. Das sind die kleinen Details in der Entwicklungsarbeit.

0

Hallo Toraka, du hattest eine Frage von mir beantwortet: http://www.gutefrage.net/frage/visual-c-2010-spalten-umrechnen-wie-in-excel#answer117766932 ich weiß nicht, ob du sofort eine Nachricht erhälst, wenn ich deine Antwort kommentiere. Ich programmiere erst seit kurzem, deshalb verstehe ich nicht was du machst bzw warum es bei mir nicht geht

Was verstehst du nicht? Du kannst den Code 1:1 übernehmen, die KeyUp-Events der Summanden auf die Funktion setzen, fertig.

0

Tut mir leid, dass ich erst mich jetzt melde, war grade etwas stressig.

Wow, danke, dass du dir so viel Mühe gemacht hast.

Ich denke damit kann ich was anfangen

0

Wenn du WPF benutzt:

Erstelle eine IEnumerable mit einer Klasse die deine Zeile repräsentiert. Binde die Aufzählung an eine ListView und überschreibe den Style, damit du Eingaben machen kannst (die Member müssen natürlich ein TwoWay-Binding haben). Und schon musst du dich um nichts mehr kümmern. Denn wenn die Setter deiner Klasse das Update des Ergebnisses auslösen aktualisiert sich der Wert automatisch, sobald du neue Eingaben rein bekommst.

Wenn du WinForms benutzt:

Schreib eine Update-Funktion einmal. Über den sender-Parameter bekommst du heraus wer die Methode aufgerufen hat und du kannst das Ergebnis der entsprechenden Zeile aktualisieren. Es wäre hilfreich die Textbox-Namen nach einem Schema zu benennen.

Viel einfacher wirst dus nicht hinbekommen

Tja, das kommt darauf an (beliebte Bemerkung von mir). Wenn es sich wie ein dem von Dir beschriebenen Sachverhält um ein paar wenige TextBoxen handelt, kann man das in der Tat manuell erledigen. Change-Ereignis auf jede TextBox und dann halt EINE Methode dahinter und darin die entsprechenden Werte ausrechnen.

Handelt es sich aber um eine unübersichtliche Anzahl, dann würde ich die TextBoxen entsprechend folgendermaßen bezeichnen:

  1. Zeile TextBoxLinks1 ... TextBoxRechts1 .... TextBoxErgebnis_1
  2. Zeile TextBoxLinks2 ... TextBoxRechts2 ... TextBoxErgebnis_2
  3. ...
  4. n. Zeile TextBoxLinksn ... TextBoxRechtsn ... TextBoxErgebnis_n

usw. Wiederum EINE Methode für sämtliche Change-Ereignisse. In dieser Methode per Reflection anhand des Namens ermitteln, aus welcher Zeile das Sender-Object stammt und dann halt beide Werte addieren und in die Ergebnis-TextBox speichern.

Ergänzung: Leider wird nur die Hälfte angezeigt. Vor jeder Zahl steht ein Unterstrich!

Der Grund weshalb es nicht manuell geht, ist, dass ich pro Spalte so um die 30 Einträge habe und die nicht alle einzel Tippen will

0
@IdontKnow789

Ich hab's ja geschrieben: Per Reflection (einfach mal danach im Zusammenhang mit Deiner Programmiersprache und set/get property danach suchen) geht's

0

Was möchtest Du wissen?