Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Auf sämtliche Komponenten der Form zugreifen
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

Auf sämtliche Komponenten der Form zugreifen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
GMLOD
myCSharp.de - Member

Avatar #avatar-2654.jpg


Dabei seit:
Beiträge: 1.200

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

Hallo GMLOD,

ich bin auch zuallererst auf Controls gestoßen, allerdings ändert sich seltsamerweise immer nur ein einzige Button.

Gruß Dennis
private Nachricht | Beiträge des Benutzers
GMLOD
myCSharp.de - Member

Avatar #avatar-2654.jpg


Dabei seit:
Beiträge: 1.200

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
GMLOD
myCSharp.de - Member

Avatar #avatar-2654.jpg


Dabei seit:
Beiträge: 1.200

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
GMLOD
myCSharp.de - Member

Avatar #avatar-2654.jpg


Dabei seit:
Beiträge: 1.200

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
GMLOD
myCSharp.de - Member

Avatar #avatar-2654.jpg


Dabei seit:
Beiträge: 1.200

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
GMLOD
myCSharp.de - Member

Avatar #avatar-2654.jpg


Dabei seit:
Beiträge: 1.200

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
GMLOD
myCSharp.de - Member

Avatar #avatar-2654.jpg


Dabei seit:
Beiträge: 1.200

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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 .
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

Properties eines "object" herausfinden

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
serial
myCSharp.de - Member



Dabei seit:
Beiträge: 902

beantworten | zitieren | melden

per reflection sicherlich, Eigesnchaften auslesen und schauen, ob eine entsprechend heisst!

mfg
serial
private Nachricht | Beiträge des Benutzers
kyoko12
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Wels/Oberösterreich

beantworten | zitieren | melden


class ReflectionHelper
{
    static bool DoesObjectHaveProperty(object objObject, string strPropertyName)
    {
        return (objObject.GetType().GetProperty(strPropertyName) != null);
    }
}
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kyoko12
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Wels/Oberösterreich

beantworten | zitieren | melden

PropertyInfo[] objPropertyInfoArray = root.GetType().GetProperties();
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kyoko12
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Wels/Oberösterreich

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

root ist ein Control. Und zwar alle Controls, die ich auf der Form finde, also z.B. auch ein DataGridView.
private Nachricht | Beiträge des Benutzers
kyoko12
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Wels/Oberösterreich

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
kyoko12
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Wels/Oberösterreich

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.998

beantworten | zitieren | melden

Nurmal so, du weisst, das Localization schon im FW eingebaut ist?
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.811
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

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 .
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
private Nachricht | Beiträge des Benutzers
kyoko12
myCSharp.de - Member



Dabei seit:
Beiträge: 36
Herkunft: Wels/Oberösterreich

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers