| 

.NET C# Java Javascript Exception

5
Hallo zusammen,
bevor ich mich bei meinem Sohn lächerlich mache, eine Frage zu einem Schleifenkonstrukt in eienr Klasse.

Es gibt 5 TextBoxen.
Bei denen möchte ich quasi auf "zuruf" die Farbe ändern.
Natürlich könnte ich jede Box einzeln anwählen und die Farbe ändern, aber was ist, wenn ich 1000 Boxen habe ?
Desshalb dachte ich mir - bau eine Klasse - leg es in eine Schleife ...

Zumindest habe ich jetzt noch mehr graue Haare - da meine Software mich nicht versteht ;)
Hat hier jemand evtl. einen Rat ?

Allein das textBox(i) ( also dank der Schleife textBox1 textBox2 textBox3 ... ) haut vorne udn hinten nicht hin. Allein deswegen habe ich mir bereits 3 Bücher ( wohl die falschen ) gekauft.
Egal wie ich es anstelle - ausser alle textBoxen einzeln an zusprechen habe ich keine weitere Möglichkeit gefunden :(

Selbst ein einfaches

string Farbe = green;
textBox1.BackColor = Color.(Farbe);

Bringt meinen Compiler zur verzweifelung - mich leider genauso.

Hier mal die komplette Klasse, die nichts besonderes machen soll,
ausser eine definiert anzahl an textBoxen umfärben ;)

class Farbeaendern
{
public string farbeaendern (string Farbe)
{
string okay = "ja";

for (int i=1;i<=5;i++)
{
textBox(i).BackColor = Color.(Farbe);
}
return okay;
}
News:
07.09.2011
DieterOG 63 1 5
6 Antworten
4
Hallo DieterOG,

als Erstes musst Du dafür sorgen, dass alle Deine Textboxen zu einer Gruppe zusammgefasst werden. Dafür kannst Du ein Array verwenden oder eine Liste oder eine beliebige andere Collection. Sind Deine Textboxes alle zusammengefasst in einer Collection, kannst Du in einer Schleife alle Elemente einer Collection bearbeiten. Um eine Color-Struktur anhand eines strings zu erzeugen, verwendest Du Color.FromName(string). Hier ein Codebeispiel:
class Farbeaendern
{
public string farbeaendern (TextBox[] textboxes, string Farbe)
{
string okay = "ja";

foreach(TextBox box in textboxes)
{
box.BackColor = Color.FromName(Farbe);
}
return okay;
}

public void Test()
{
TextBox[] textboxes = new TextBox[5];
// falls Du schon irgendwo welche rumliegen hast
textboxes[0] = textbox0; // vorhandene Textbox am Index 0 ins Array einhängen
textboxes[1] = textbox1;
for(int n = 2; n<5; n++)
{
// neue Textboxes erzeugen (die sind aber noch in keinem Formular sichtbar, dazu myForm.Controls.Add(newBox) aufrufen
Textbox newBox = new Textbox();
textboxes[n] = newBox;
}

farbeaendern(textboxes, "Gray");
}
}

Habs nur runtergetippt, könnten als Schreibfehler drin sein. Aber konzeptionell passt das.

Viel Erfolg,
Florian
07.09.2011
ffordermaier 8,4k 3 9
2
Naja, du müßtest vielleicht die TextBoxen mit übergeben?
Aber dafür brauchst du keine Klasse, eine statische Methode reicht:
public static void ColorTextboxes(List<TextBox> textboxes, Color color)
{
foreach(TextBox textBox in textboxes)
textBox.BackColor = color;
}

Arrays werden in C# übrigens mit eckigen Klammern indiziert.
Grüße,
Daniel
07.09.2011
puls200 3,8k 7
1
Wow der Florian tippt schneller als ich .. ;)
puls200 07.09.2011
Muss wohl an diesem neuen Espresso liegen...
ffordermaier 07.09.2011
2
Wenn du es noch etwas dynamischer haben möchtest, kannst du deine Steuerelemente in einem Container z.B. Panel gruppieren und danach die Hintergrundfarbe aller Steuerelemente eines bestimmten Typs ändern:
private void BackColorChange(Control parentPanel,Type type,string color)
{
foreach (Control control in parentPanel.Controls)
{
if (control.GetType() == type)
{
control.BackColor = Color.FromName(color);
}
}
}

BackColorChange(panel1, typeof(Label), "Blue");
BackColorChange(panel1, typeof(TextBox), "Red");

Der erste Aufruf ändert die Hintergrundfarbe aller Label auf blau und der zweite Aufruf ändert die Hintergrundfarbe aller TextBox auf rot.

PS: Das ganze kann auch rekursiv über verschachtelte Container (Panel) aufgerufen werden.

PPS: Dieses Vorgehen hat den Vorteil, dass ein neues Steuerelement nicht einer Liste/Array hinzugefügt werden muss, damit es von der Farbänderung betroffen ist, sondern es wird automatisch erfasst.
07.09.2011
Jürgen Luhr 7,1k 1 9
1
Omg, Danke.
Das mit den [ ] statt ( ) ... ja das kommt davon wenn man ohne Brille :)
Das habe ich schlichtweg überlesen - glaube es wird Zeit für eine Neue Brille ;)
Das zweite Zauberwort war Array - da hätte man selber drauf kommen müssen !
Und die <> habe ich auch immer überlesen - ist das Peinlich - das sah für mich alles imemr gleich aus ...

Super - recht vielen Dank nochmal !
07.09.2011
DieterOG 63 1 5
0
Hallo,

zu Deinem ersten Problem:

textBox1.BackColor = Color.Green;


Wobei "Color" aus dem Namesraum System.Drawing kommt. Kann man so machen...

Zu Deiner zweiten Fragen: Das ist vom Ansatz her schon völlig in die falsche Richtung. Wo kommt den das textBox Array her und woher weis die Klasse, dass es fünf Elemente sein werden. Außerdem fangen Aufzählung in C# immer bei 0 an, return value sollte nicht String sonder Boolean sein, bei der Method brauchst Du aber eigentlich gar keinen.

Ich würde erstmal ein gutes Buch durcharbeiten: http://openbook.galileocomputing.de/visual_csharp_2010/

Gruß
07.09.2011
LutzJ 1,3k 1 8
0
Also ich habe dazu nochmal eine Frage (obwohl ich eigentlich in vb.net code, aber dank Converter ist das ja weniger ein Problem):
Wenn ich die Routine von puls200 nehme, kommt beim Konvertieren das raus:

Public Shared Sub ColorTextboxes(textboxes As List(Of TextBox), color As Color)
For Each textBox As TextBox In textboxes
textBox.BackColor = color
Next
End Sub

Entweder steh ich grad sowas von auf dem Schlauch - aber wie ruf ich das Ding jetzt auf, wenn ich z. B. 100 Textboxen habe (ok, in dem einen Formular ist 100 sogar untertrieben)? Und als Erweiterung dazu: wie rufe ich nur die Textboxen von panel1 auf?
07.09.2011
muffi 1,4k 1 9
Du kannst folgende Methode schreiben:
private void collectTextboxes(System.Collections.Generic.List<TextBox> tbList, System.Windows.Forms.Control control)
{
foreach (System.Windows.Forms.Control subControl in control.Controls)
{
if (subControl is TextBox) tbList.Add(subControl as textBox );
else collectTextboxes(tbList, subControl);
}
}

Wenn du alle Textboxen der Form haben willst, dann rufst du die Methode so auf:
System.Collections.Generic.List<TextBox> tbList = new List<TextBox>();
collectTextboxes(tbList, this);

KN 07.09.2011
Ergänzung zu meinem Kommentar von eben:
Wenn du nur die Textboxen in Panel1 haben willst, dann rufst du die Methode so auf:
collectTextboxes(tbList, panel1);
KN 07.09.2011
Oder du siehst dir meine Antwort an und verzichtest auf das Einsammeln von Textboxen in einer Collection.
Jürgen Luhr 07.09.2011
stimmt, habe ich nicht genau genug gelesen :-)
KN 07.09.2011
Definitiv danke an Beide - das ist beides ohne Weiteres brauchbar!
muffi 07.09.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH