Entwickler-Ecke

WinForms - NumericUpDown


Phelios - Di 02.12.08 14:50
Titel: NumericUpDown
Hi Leute ...

Ich bin noch ein C# Frischling, habe mir aber
über sehr viele MSDN WebCasts einiges Wissen angeeignet.

Ich arbeite mit Visual Studio 2008 Express C#
und hoffe, dass ich hier an die richtige Stelle gepostet habe.

Ich wurschtel gerade an einem popligen Texteditor rum,
der eigentlich nur ein Projekt zum Lernen gut sein soll,
also nix, um ihn regelmäßig zu nutzen.

In einem MDI-Parent-Window sollen mehrere Fenster gleichzeitig
geöffnet werden, was ja kein Problem darstellt.
Mit dieser Methode sollen aber nur MAXIMAL 10 Fenster geöffnet
werden. Wenn also bereits 3 Fenster offen sind, dann noch 7.

Es gibt einen Dialog, der u.A. ein NumericUpDown Element besitzt.
Den Dialog nennen wir mal "NewMore".
und der UpDown heißt "numWinRange"


C#-Quelltext
1:
NewMore dlg = new NewMore();                    


Jetzt sollte ich eigentlich Zugriff auf das UpDown haben, mit


C#-Quelltext
1:
2:
dlg.numWinRange.Minimum = 1;
dlg.numWinRange.Maximum = 7;

... wenn 3 Fenster bereits offen sind.

Das funzt aber nicht.
Das Berechnen von Maximum ist kein Problem.

Ich vermute mal, dass ich im Dialog selbst, also in der
"NewMore.cs" einen Getter und Setter einfügen muß.

Und genau da ist das Problem.

Wenn ich das richtig verstanden habe ist der Typ "decimal"
und NICHT "int"

Also ...


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public decimal Minimum
{
   get
   {
     // Das Problem liegt hier   
   }
   set
   {
     // Das Problem liegt hier
   }
}


und das Gleiche für Maximum.

Ich habe keinen Schimmer, was da rein kommt.

Außerdem hab ich gedankliche Probleme mit dem
Schlüsselwort "value" ...

"Value" von was? Minimum oder Maximum?

Vielleicht hat einer von Euch einen Tip für mich,
oder vielleicht ein kurzes Demo, der dieses Problem
gut beschreibt. Ich suche bereits seit 4 Tagen nach so was,
bin aber leider nicht fündig geworden.

Für Eure Hilfe bedanke ich mich im Voraus.

Greeting
( Karl )


JüTho - Di 02.12.08 16:42

Hallo Karl und :welcome:

Zur Einführung in WinForms und C# verweise ich gern allgemein auf OpenBook Visual C# [http://openbook.galileocomputing.de/visual_csharp/]; dort werden viele Deiner Probleme in einer sinnvollen Reihenfolge besprochen.

Zitat:
Jetzt sollte ich eigentlich Zugriff auf das UpDown haben,

Nein, so geht es nicht. Das wurde vor kurzem mehrfach besprochen, z.B. unter Daten vom Hauptframe in den Dialog [http://www.c-sharp-forum.de/viewtopic.php?t=88171] und unter zwei unterschiedliche label inhalt zuweisen [http://www.c-sharp-forum.de/viewtopic.php?t=88171]; dort gibt es auch Verweise auf weitere Erläuterungen.

Zitat:
Ich vermute mal, dass ich im Dialog selbst, also in der "NewMore.cs" einen Getter und Setter einfügen muß.

Das ist auf jeden Fall besser.

Zitat:
Und genau da ist das Problem.

Wenn ich das richtig verstanden habe ist der Typ "decimal" und NICHT "int"

Korrekt. Das musst Du entsprechend berücksichtigen. (decimal wurde gewählt, weil dieses Control auch für Dezimalzahlen geeignet ist und float u.ä. zu Rundungsproblemen führen würde.)

Das ist ein Beispiel dafür, dass get und set angepasst werden können. Beispiel, bei dem die Eigenschaft NumericMinimum als öffentlicher Zugriff auf das Control für das Minimum benutzt wird:

C#-Quelltext
1:
2:
3:
4:
public int NumericMinimum {
   get { return decimal.ToInt32(numWinRange.Value); }
   set { numWinRange.Value = value; }
}

Ein int kann einem decimal direkt zugewiesen werden; umgekehrt muss umgerechnet werden.

Zitat:
Außerdem hab ich gedankliche Probleme mit dem Schlüsselwort "value" ...

"Value" von was? Minimum oder Maximum?

Eigentlich wollte ich auf die SDK-Doku/MSDN verweisen, aber nachdem ich nachgelesen habe, was dort unter value-Schlüsselwort (C#-Referenz) steht, bin ich doch erschrocken. "value" (klein geschrieben) steht für den Wert, der einer Eigenschaft "von außen" zugewiesen wird und in den dazugehörigen internen Member eingetragen wird.

Gruß Jürgen


Phelios - Mi 03.12.08 09:47

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Karl und :welcome:


Danke für die nette Begrüßung.

Zitat:

Zur Einführung in WinForms und C# verweise ich gern allgemein auf OpenBook Visual C# [http://openbook.galileocomputing.de/visual_csharp/]; dort werden viele Deiner Probleme in einer sinnvollen Reihenfolge besprochen.

Das kenne ich natürlich und ich lese dort immer zuerst.
Aber zum Thema UpDown hab ich dort nix gefunden.


C#-Quelltext
1:
2:
3:
4:
public int NumericMinimum {
   get { return decimal.ToInt32(numWinRange.Value); }
   set { numWinRange.Value = value; }
}

Zitat:

Ein int kann einem decimal direkt zugewiesen werden; umgekehrt muss umgerechnet werden.

Ist schon klar, aber so, wie oben beschrieben, funzt es auch nicht.
Wenn Minimum = 2 und Maximum = 7 festgelegt werden, wird als erstes
die 7 angezeigt. Von dort aus kann ich bis 0 runterzählen, bzw
bis 100 hochzählen.

Also KEIN Range ...

Man kann es ja auch im Eigenschaftsfenster einstellen.
Wenn sich Maximum ändern kann, ist das natürlich Humbug.
Aber ...
Das Steuerelement heißt ja numWinRange.
Aber den Namen der Eigenschaft können wir ja nicht ändern,
und der heißt entweder "Minimum" oder "Maximum", und die tauchen
im o.g. Beispiel nicht auf, und deshalb funzt es wohl nicht.

Ich hab es mal so abgeändert.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
       public int NumericMinimum
        {
            get
            {
                return decimal.ToInt32(numWinRange.Minimum);
            }
            set
            {
                numWinRange.Minimum = value;
            }
        }

Und das Gleiche für Maximum.
Es fängt bei 2 an und hört bei 7 auf.

Jedenfalls OHNE Deine Ausführungen hätte ich wohl noch
bis zum jüngsten Tag gegrübelt.

Besten Dank zu Dir ...
Jetzt weiß ich wenigstens, wie's geht, und bin wieder
einmal schlauer geworden.

Greeting
( Karl )


JüTho - Mi 03.12.08 10:54

Zitat:
Ich hab es mal so abgeändert.

Entschuldige, so hatte ich es auch gemeint. Ich hatte ja "meine" Eigenschaft als NumericMinimum bezeichnet, das sollte sich also auf das Minimum beziehen (und nicht auf NumericUpDown.Value). Aber auch wenn ich es falsch aufgeschrieben habe, hast Du es ja richtig verstanden. Jürgen