Zum Inhalt springen

Get Control by Name


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben
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?

Geschrieben

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...

Geschrieben (bearbeitet)
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
Geschrieben (bearbeitet)

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
Geschrieben

Btw: für 2.0


      foreach (Object item in this.Controls)

      {

        if [COLOR="Red"](item is TextBox)[/COLOR]

        {

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

          {

            //Hier weiter verarbeiten

          }

        }

      }

Funktioniert das Rote so??? Müsste des ned eher
if( item.GetType() == typeof(TextBox))

lauten???

Geschrieben

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

      }


Geschrieben

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

Geschrieben

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".

Geschrieben

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

Geschrieben

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

Geschrieben (bearbeitet)


private Control[] GetControlsByName(string name)

{

    return Controls.Find(name, true);

}

EDIT: Ach so, es geht hier um System.Web.UI.Control :roll:

Bearbeitet von 0815FIA

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...