Zum Inhalt springen

Get Control by Name


Kworth

Empfohlene Beiträge

Kann mir einer sagen wie ich folgenden Code in eine while schleife reinbekomme und die Controls mit dynamischen Namen lade?


if (produkt_1.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_1.Text, preis_1.Text, rb_zahlung.Text, 1);

            }

            if (produkt_2.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_2.Text, preis_2.Text, rb_zahlung.Text, 2);

            }

            if (produkt_3.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_3.Text, preis_3.Text, rb_zahlung.Text, 3);

            }

            if (produkt_4.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_4.Text, preis_4.Text, rb_zahlung.Text, 4);

            }

            if (produkt_5.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_5.Text, preis_5.Text, rb_zahlung.Text, 5);

            }

            if (produkt_6.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_6.Text, preis_6.Text, rb_zahlung.Text, 6);

            }

            if (produkt_7.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_7.Text, preis_7.Text, rb_zahlung.Text, 7);

            }

            if (produkt_8.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_8.Text, preis_8.Text, rb_zahlung.Text, 8);

            }

            if (produkt_9.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_9.Text, preis_9.Text, rb_zahlung.Text, 9);

            }

            if (produkt_10.Text != "")

            {

                bestellposten_hinzufuegen(sCurrentUser, produkt_10.Text, preis_10.Text, rb_zahlung.Text, 10);

            }

Vielen Dank im vorraus,

Gruß,

Kworth

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde behaupten, dass dies ein klassischer Fall für Arrays bzw. Collections ist.

Allerdings sind die Informationen bisschen mau. Ich schätze jetzt einfach mal, dass das alles Textboxen sind.

In dem Fall erstellst du am besten zur Laufzeit des Programms diese Textbox-Objekte, speicherst sie in einer Collection und zeigst diese auf deiner Form an.

Zur Auswertung überprüfst du jedes Element der Collection mittels einer Schleife.

Eine detailliertere Lösung knobelst du am besten auf Basis dieses Ansatzes selbst aus, oder du gibst uns mehr Input ;)

Gruß, Sturm

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe da ne Lösung ist aber nicht grad die sauberste

Gruß Hans-Jörg

(Achtung VB.NET Code)


Dim alFelder as new ArrayList

Dim inZaehler as Integer


alFelder.Add(produkt_1)

alFelder.Add(produkt_2)

alFelder.Add(produkt_3)

usw. usw.

alFelderPreis.Add(preis_1)

alFelderPreis.Add(preis_2)

alFelderPreis.Add(preis_3)

usw. usw.


For inZaehler = 0 to alFelder.Count -1

    IF  NOT alFelder(inZaehler).Text = "" then

       bestellposten_hinzufuegen(sCurrentUser, alFelder(inZaehler).Text, alFelderPreis(inZaehler).Text, rb_zahlung.Text, 2)

    END IF

Next

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde behaupten, dass dies ein klassischer Fall für Arrays bzw. Collections ist.

Allerdings sind die Informationen bisschen mau. Ich schätze jetzt einfach mal, dass das alles Textboxen sind.

In dem Fall erstellst du am besten zur Laufzeit des Programms diese Textbox-Objekte, speicherst sie in einer Collection und zeigst diese auf deiner Form an.

Zur Auswertung überprüfst du jedes Element der Collection mittels einer Schleife.

Eine detailliertere Lösung knobelst du am besten auf Basis dieses Ansatzes selbst aus, oder du gibst uns mehr Input ;)

Gruß, Sturm

Danke für die Antwort.

Ich würde gern mein bestehendes Formular verwenden und ich dachte ich könnte irgendwie dynamisch diese Textfelder ansprechen.

Über "get Control by Name" oder so ähnlich?

Link zu diesem Kommentar
Auf anderen Seiten teilen

eventuell hilft dir folgender kleiner Anhaltspunkt:


foreach( Textbox tb in this.Controls)

{

     string textboxtext = tb.Text.ToString();

}

das "this.Controls" kann auch anderes aussehen. Kommt halt drauf an, wo die Textboxen drin sind...

Hoffe das hilft...

Leider sind nicht nur Textboxen vorhanden sondern auch ein Literal,

daher spukt er mir ein Error aus, dass er das Literal nicht umwandeln kann in eine Textbox.

Aber ich glaub das ist die richtige Spur, ich müsste jetzt nur noch die Textboxen rausfiltern aus allen Controls.

Framework ist

Microsoft Visual Studio 2008

Bearbeitet von Kworth
Link zu diesem Kommentar
Auf anderen Seiten teilen

Microsoft Visual Studio 2008 ist eine IDE, kein Framework.

Welche .NET-Version benutzt DU? .NET 1.1/2.0/3.0/3.5?

Btw: für 2.0


      foreach (Object item in this.Controls)

      {

        if (item is TextBox)

        {

          if ((item as TextBox).Text != String.Empty)

          {

            //Hier weiter verarbeiten

          }

        }

      }

Bearbeitet von Byteloser
Link zu diesem Kommentar
Auf anderen Seiten teilen

Weil der Entwickler nicht immer bestimmen kann, das bestimmte Voraussetzungen auf den Zielclient erfüllt werden müssen.

Bei mittelständischen und Grossunternehmen werden oft die Versionen von deren IT diktiert.

Aber zurück zum Thread. :-)

Für 3.5 kannst du das wunderbar mit Linq erledigen:


      var query = this.Controls.OfType<TextBox>().Where(x => x.Text != String.Empty);


      foreach (var item in query)

      {

        //weiter verarbeitem

      }


Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank für eure Hilfe,

habe nun folgenden Code:


foreach (Control tb in this.Controls)

            {

                if (tb is TextBox)

                {

                    TextBox tb1 = ((TextBox)tb);


                    //WENN FELD IST GLEICH PREISFELD

                    if (tb1.Width == 50)

                    {

                        if (tb1.Text != "")

                        {

                          bestellposten_hinzufuegen(sCurrentUser, tb2.Text, tb1.Text, rb_zahlung.Text, iCounter);

                        }

                        iCounter++;

                    }

                    //FELD IST GLEICH PRODUKTFELD

                    tb2 = ((TextBox)tb);

                }

            }

Dieser funktioniert für mein Teilproblem das ich beschrieben habe wunderbar, allerdings nur weil die 2 Felder immer hintereinander liegen und eine unterschiedliche Width haben woran ich sie erkennen kann. Das Framework ist übrigens 3.5. Ich komme nun noch zu Teilproblem B) wo es sich nicht so einfach verhält.

            if (Request.Form["produkt_4"] != null || Request.Form["preis_4"] != null)

            {

                produkt_4.Visible = true;

                preis_4.Visible = true;

                lb_euro_4.Visible = true;

                lb_empty_4.Visible = true;


                produkt_4.Text = Request.Form["produkt_4"];

                preis_4.Text = Request.Form["preis_4"];


                lt_addInput.Text = "5";

            }

            if (Request.Form["produkt_5"] != null || Request.Form["preis_5"] != null)

            {

                produkt_5.Visible = true;

                preis_5.Visible = true;

                lb_euro_5.Visible = true;

                lb_empty_5.Visible = true;


                produkt_5.Text = Request.Form["produkt_5"];

                preis_5.Text = Request.Form["preis_5"];


                lt_addInput.Text = "6";

            }

            if (Request.Form["produkt_6"] != null || Request.Form["preis_6"] != null)

            {

                produkt_6.Visible = true;

                preis_6.Visible = true;

                lb_euro_6.Visible = true;

                lb_empty_6.Visible = true;


                produkt_6.Text = Request.Form["produkt_6"];

                preis_6.Text = Request.Form["preis_6"];


                lt_addInput.Text = "7";

            }

            if (Request.Form["produkt_7"] != null || Request.Form["preis_7"] != null)

            {

                produkt_7.Visible = true;

                preis_7.Visible = true;

                lb_euro_7.Visible = true;

                lb_empty_7.Visible = true;


                produkt_7.Text = Request.Form["produkt_7"];

                preis_7.Text = Request.Form["preis_7"];


                lt_addInput.Text = "8";

            }

            if (Request.Form["produtk_8"] != null || Request.Form["preis_8"] != null)

            {

                produkt_8.Visible = true;

                preis_8.Visible = true;

                lb_euro_8.Visible = true;

                lb_empty_8.Visible = true;


                produkt_8.Text = Request.Form["produkt_8"];

                preis_8.Text = Request.Form["preis_8"];


                lt_addInput.Text = "9";

            }

            if (Request.Form["produkt_9"] != null || Request.Form["preis_9"] != null)

            {

                produkt_9.Visible = true;

                preis_9.Visible = true;

                lb_euro_9.Visible = true;

                lb_empty_9.Visible = true;


                produkt_9.Text = Request.Form["produkt_9"];

                preis_9.Text = Request.Form["preis_9"];


                lt_addInput.Text = "10";

            }

            if (Request.Form["produkt_10"] != null || Request.Form["preis_10"] != null)

            {

                produkt_10.Visible = true;

                preis_10.Visible = true;

                lb_euro_10.Visible = true;

                lb_empty_10.Visible = true;


                produkt_10.Text = Request.Form["produkt_10"];

                preis_10.Text = Request.Form["preis_10"];


                lt_addInput.Text = "11";

            }


Diesen Code möchte ich nun verkürzen, und nun muss ich wirklich irgendwie per Name ansprechen können. lb_euro, lb_empty sind Labels. Produkt und Preis sind textboxen lt_addInput ist ein Literal. ich würde am liebsten sowas ähnliches machen

for(int i=0; i<=10; i++)

{

  string produktfeldname = "produkt_" + i;

  produktfeldname.Visible = true;

  ...

}

Wäre dankbar wenn ihr mir auch hier helfen würdet eine Lösung zu finden

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde gerne mein Control per name ansprechen:

Folgender Code habe ich hierfür gefunden:


Control GetControlByName(string Name)

{

    foreach(Control c in this.Controls)

        if(c.Name == Name)

            return c;


    return null;

}

Allerdings kennt mein VisualStudio 2008 mit Framework 3.5 "c.Name" nicht.

Woran kann das liegen?

Oder hat jemand eine ähnliche Lösung für das Problem ohne "c.Name".

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das c.Name klappt nicht, weil das bei Controls nicht geht. Wenn du den Namen haben willst musst du es vorher in einen bestimmten Typ umwandeln/auf einen Typ vergleichen:

z.B:

 ((Button)c).Name

Das sollte dann funktionieren.

Würd halt vorher noch ne prüfung machen ob es sich bei dem control um nen Button handelt

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke ich muss über die ID gehen und nicht über den Namen

Habe nun folgenden Code der noch nicht funktioniert


        Control GetControlById(string Name)

        {

            Control c_return = new Control();


            foreach (Control c in this.Controls)

            {

                    if (c.ID == Name)

                    {

                        c_return = c;

                    }


            }


            return c_return;

        }


            for (int iCounter2 = 4; iCounter2 <= 10; iCounter2++)

            {

                string sProdukt_Field_Name = "produkt_" + iCounter2;

                string sPreis_Field_Name = "preis_" + iCounter2;

                string sEuro_Field_Name = "lb_euro_" + iCounter2;

                string sEmpty_Field_Name = "lb_empty_" + iCounter2;


                if (Request.Form[sProdukt_Field_Name] != null || Request.Form[sPreis_Field_Name] != null)

                {

                    GetControlById(sProdukt_Field_Name).Visible = true;

                    GetControlById(sPreis_Field_Name).Visible = true;

                    GetControlById(sEuro_Field_Name).Visible = true;

                    GetControlById(sEmpty_Field_Name).Visible = true;


                    ((TextBox)GetControlById(sProdukt_Field_Name)).Text = Request.Form[sProdukt_Field_Name];

                    ((TextBox)GetControlById(sPreis_Field_Name)).Text = Request.Form[sPreis_Field_Name];


                    lt_addInput.Text = Convert.ToString((iCounter2+1));

                }

            }


Ich bekomme keine Fehlermeldung, allerdings tut der Code immer noch nicht dass was der längere Code vorher tut, warum auch immer.

Hoffe ihr findet den Fehler.

Danke nochmals

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...