my CSharp .de
»
Community
|
Diskussionsforum
Auf sämtliche Komponenten der Form zugreifen
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo,
wie kann ich auf sämtliche Komponenten der Form zugreifen? Zum Beispiel möchte ich die Texte aller Komponenten bearbeiten können.
Ist so etwas möglich?
Form.Container.Components
...ist bei mir immer null.
Danke für eure Hilfe!
Gruß Dennis
08.09.2008 - 15:44
private Nachricht
|
Beiträge des Benutzers
GMLOD
myCSharp.de - Member
Dabei seit:
30.11.2007
Beiträge: 1.200
Bist du dir sicher, dass du nicht Controls meinst?
Die ControlsCollection kannst du einfach über das Controls Property einer Control abgreifen.
Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!
YARRRRRR!
08.09.2008 - 15:45
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo GMLOD,
ich bin auch zuallererst auf Controls gestoßen, allerdings ändert sich seltsamerweise immer nur ein einzige Button.
Gruß Dennis
08.09.2008 - 15:51
private Nachricht
|
Beiträge des Benutzers
GMLOD
myCSharp.de - Member
Dabei seit:
30.11.2007
Beiträge: 1.200
Du musst rekursiv da durchsteigen:
z.B.
private void SetTextForAllControls(String text, Control root)
{
foreach(Control c in root.Controls)
{
SetTextForAllControls(text, c);
}
root.Text = text;
}
Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!
YARRRRRR!
08.09.2008 - 15:54
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo GMLOD,
Zitat Du musst rekursiv da durchsteigen
Das habe ich gerade herausbekommen
Nun bekomme ich alle Buttons etc umbenannt.
Doch wie mache ich das z.B. mit dem HeaderText bei Columns?
Wenn ich ein Control erzeuge,
Control control = new Control();
enthält dieses Control das Propertie "Text", aber nicht "HeaderText". Wie könnte ich auf so etwas zugreifen?
Mal als Hintergrund: Ich möchte mir ein kleines Lokalisierungstool schreiben.
Gruß Dennis
08.09.2008 - 15:59
private Nachricht
|
Beiträge des Benutzers
GMLOD
myCSharp.de - Member
Dabei seit:
30.11.2007
Beiträge: 1.200
Mmmh, Du könntest ein switch Statement für den Typen (aControl.GetType()) einbauen und danach casten, bzw. spezielle Handler für bestimmte Controls einbauen.
Vielleicht kennt da jemand aber noch ne bessere Methoden.
Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!
YARRRRRR!
08.09.2008 - 16:01
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo GMLOD,
ich denke ich werde es mit einem Switch machen, mir bleibt vorläufig wohl nicht viel mehr übrig.
Ich hoffe, dass ich alle Typen soweit abgedeckt bekomme und es nicht zu viele sind.
if (root.GetType() == typeof(DataGridViewColumn))
{
DataGridViewColumn dataGridViewColumn = (DataGridViewColumn)root;
dataGridViewColumn.HeaderText = "sdffg";
}
root ist bei mir ein object. "In Wirklichkeit" natürlich ein Control. Allerdings lässt es sich nicht in ein DataGridViewColumn umwandeln.
Gruß Dennis
08.09.2008 - 16:16
private Nachricht
|
Beiträge des Benutzers
GMLOD
myCSharp.de - Member
Dabei seit:
30.11.2007
Beiträge: 1.200
An die Column wirst du auch nicht rankommen, nur an die DataGridView. Über die kannst du dann die Columns bekommen.
Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!
YARRRRRR!
08.09.2008 - 16:19
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo GMLOD,
stimmt - klingt zumindestens um einiges logischer.
Allerdings funktioniert es nicht
if (root.GetType() == typeof(DataGridView))
{
DataGridView dataGridView = (DataGridView)root;
foreach (DataGridViewColumn column in dataGridView.Columns)
{
column.HeaderText = "sdffg";
}
}
Gruß Dennis
08.09.2008 - 16:24
private Nachricht
|
Beiträge des Benutzers
GMLOD
myCSharp.de - Member
Dabei seit:
30.11.2007
Beiträge: 1.200
Was funktioniert denn nicht? Was für eine Exception bekommst du?
Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!
YARRRRRR!
08.09.2008 - 16:25
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo GMLOD,
(root.GetType() == typeof(DataGridView)
trifft niemals zu.
private void SetTextForAllControls(object root)
{
Control root2 = (Control)root;
foreach (object control in root2.Controls)
{
SetTextForAllControls(control);
}
if (root.GetType() == typeof(DataGridView))
{
DataGridView dataGridView = (DataGridView)root;
foreach (DataGridViewColumn column in dataGridView.Columns)
{
column.HeaderText = "sdffg";
}
}
root2.Text = LG(root2.Text); // "sdffg";// LG(root2.Text);
}
Gruß Dennis
08.09.2008 - 16:28
private Nachricht
|
Beiträge des Benutzers
GMLOD
myCSharp.de - Member
Dabei seit:
30.11.2007
Beiträge: 1.200
Das ist komisch. Ist deine DataGridView in einem UserControl untergebracht oder so?
Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!
YARRRRRR!
08.09.2008 - 16:31
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo GMLOD,
sorry - mein Fehler.
Ich benutze ja das Krypton-ToolKit.. das heißt ich muss auf "KryptonDataGridView" abfragen. Nun funktionert es.
Gibt es eigentlich die Möglichekt, bei einem Object schon zu überprüfen, ob es ein Propertie namens "HeaderText" enthält? Oder geht das zu weit in den Code hinein?
Weil das wäre natürlich genial.. ich könnte alles viel automatisierter machen.
Gruß Dennis
08.09.2008 - 16:33
private Nachricht
|
Beiträge des Benutzers
GMLOD
myCSharp.de - Member
Dabei seit:
30.11.2007
Beiträge: 1.200
Mit Reflection könntest du das schon tun. Aber da müsste ich jetzt erst die MSDN wälzen um das genau zu sagen. Mach doch einfach nen neuen Thread dafür auf.
Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!
YARRRRRR!
08.09.2008 - 16:35
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo GMLOD,
das werde ich tun.
Vielen Dank für deine Hilfe!
Gruß Dennis
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von dennisspohr am 08.09.2008 - 16:45 .
08.09.2008 - 16:37
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo,
abschweifend nochmal meine Frage:
Zitat Gibt es eigentlich die Möglichekt, bei einem Object schon zu überprüfen, ob es ein Propertie namens "HeaderText" enthält? Oder geht das zu weit in den Code hinein?
Weil das wäre natürlich genial.. ich könnte alles viel automatisierter machen.
Ich möchte mir ein kleines Lokalisierungs-Tool schreiben.
Am besten wäre es, wenn ich automatisiert überprüfen könnte, ob ein Object (was z.B. ein Button, DataGridViewColumn, etc) ein Propertie wie z.B. "Text", "HeaderText", Description" enthält.
Ist so etwas möglich? Vielleicht per Reflection?
Danke für eure Hilfe!
Gruß Dennis
08.09.2008 - 16:44
private Nachricht
|
Beiträge des Benutzers
serial
myCSharp.de - Member
Dabei seit:
17.09.2007
Beiträge: 902
per reflection sicherlich, Eigesnchaften auslesen und schauen, ob eine entsprechend heisst!
mfg
serial
08.09.2008 - 16:47
private Nachricht
|
Beiträge des Benutzers
kyoko12
myCSharp.de - Member
Dabei seit:
06.03.2008
Beiträge: 36
Herkunft: Wels/Oberösterreich
class ReflectionHelper
{
static bool DoesObjectHaveProperty(object objObject, string strPropertyName)
{
return (objObject.GetType().GetProperty(strPropertyName) != null);
}
}
08.09.2008 - 17:29
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo ihr beiden,
erstmal vielen Dank für eure Antworten!
Ich habe es folgendermaßen versucht:
foreach (object control in (root as Control).Controls)
{
SetTextForAllControls(control);
}
PropertyInfo propertyInfo = root.GetType().GetProperty("Text");
if (propertyInfo != null)
{
propertyInfo.SetValue(root, "fdsgufghufigh", null);
}
Es funktioniert soweit
Ein kleine Frage noch:
Wenn ich nun den "HeaderText" eines DataGridViewColumns ändern möchte, wird es problematisch, da ich ja nur das DataGridView an sich erhalte. Dieses hat das Propertie "HeaderText" logischerweise nicht.
Gibt es eine Möglichkeit, an ALLE Properties des Controls zu kommen?
Gruß Dennis
08.09.2008 - 18:17
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Hallo,
PropertyInfo[] propertyInfos = root.GetType().GetProperties();
if (propertyInfos != null)
{
foreach (PropertyInfo propertyInfo in propertyInfos)
{
if (propertyInfo.Name.ToLower() == "headertext")
{
propertyInfo.SetValue(root, "fdsgufghufigh", null);
}
}
}
mit "text" funktioniert es bei den Buttons, allerdings nicht mit "headertext" bei den Columns des DataGridViews...
Gruß Dennis
08.09.2008 - 18:47
private Nachricht
|
Beiträge des Benutzers
kyoko12
myCSharp.de - Member
Dabei seit:
06.03.2008
Beiträge: 36
Herkunft: Wels/Oberösterreich
Wenn ich dich richtig verstanden habe, dann ist root dein Form oder? Dann kommst du mit deinem jetzige Code doch gar nicht auf die DataGridViewColumn?
08.09.2008 - 19:05
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
root ist ein Control. Und zwar alle Controls, die ich auf der Form finde, also z.B. auch ein DataGridView.
08.09.2008 - 19:07
private Nachricht
|
Beiträge des Benutzers
kyoko12
myCSharp.de - Member
Dabei seit:
06.03.2008
Beiträge: 36
Herkunft: Wels/Oberösterreich
Aber die DataGridViewColumn ist nicht direkt der Form, sonder dem DataGridView untergeordnet, richtig?
Also musst du darauf mit Hilfe von
foreach (DataGridViewColumn objColumn in root.dgvDataGridView.Columns)
{
PropertyInfo objInfo = objColumn.GetType().GetProperty("HeaderText");
//...
}
zugreiffen!
08.09.2008 - 19:18
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
ja, aber ich möchte ja gerade umgehen, dass ich die Ccntrols kenne. Sagen wir mal, ich weiß gar nicht, das ein DataGridView existiert...
Weißt du, was ich meine?
08.09.2008 - 19:38
private Nachricht
|
Beiträge des Benutzers
kyoko12
myCSharp.de - Member
Dabei seit:
06.03.2008
Beiträge: 36
Herkunft: Wels/Oberösterreich
Ja, ich denke, ich hab dich verstanden.
Das wird aber wohl schwer werden. Du könntest sämtliche Controls überprüfen, ob diese wiederum eine Eigenschaft "Controls" oder eben "Columns" oä. enthalten und dann diese ebenfalls durchgehen. Und das gegebenenfalls rekursiv, bis keine Objekte mehr mit eben jenen Propertys vorhanden sind.
08.09.2008 - 19:45
private Nachricht
|
Beiträge des Benutzers
dennisspohr
myCSharp.de - Member
Dabei seit:
07.08.2007
Beiträge: 420
Herkunft: Westerwald
Themenstarter:
Aber mir bleibt wohl nichts anderes übrig, oder gibt es eine bessere Lösung?
Ich sehe gerade, dass auch simple, aber sehr wichtige Controls wie ein MenuStrips nicht funktionieren. Da die Texte der einzelnen Einträge ja im ToolStripMenuItem sind, nicht im MenuStrip selber.
08.09.2008 - 19:48
private Nachricht
|
Beiträge des Benutzers
BerndFfm
myCSharp.de - Team
Dabei seit:
20.01.2006
Beiträge: 3.811
Herkunft: Frankfurt a.M.
Hallo Dennis,
statt
if (root.GetType() == typeof(DataGridView))
{
DataGridView dataGridView = (DataGridView)root;
foreach (DataGridViewColumn column in dataGridView.Columns)
{
column.HeaderText = "sdffg";
}
}
kannst Du
if (root is DataGridView)
foreach (DataGridViewColumn column in ((DataGridView)root).Columns)
column.HeaderText = "sdffg";
schreiben. Ist kürzer und übersichtlicher.
Habs aber nicht getestet.
Grüße Bernd
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von BerndFfm am 08.09.2008 - 20:28 .
Workshop :
Datenbanken mit ADO.NET
Xamarin Mobile App :
Finderwille Einsatz App
Unternehmenssoftware :
Quasar-3
08.09.2008 - 20:27
private Nachricht
|
Beiträge des Benutzers
kyoko12
myCSharp.de - Member
Dabei seit:
06.03.2008
Beiträge: 36
Herkunft: Wels/Oberösterreich
Ich denke nicht, dass du eine andere Möglichkeit als das rekursive Durchlaufen der Controls hast.
Du musst eben immer darauf achten, dass Propertys wie "Controls", "Items", "Columns" etc. wiederum weitere Controls enthalten können.
08.09.2008 - 20:33
private Nachricht
|
Beiträge des Benutzers