Kworth Geschrieben 27. Oktober 2009 Geschrieben 27. Oktober 2009 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 Zitieren
Sturm Geschrieben 27. Oktober 2009 Geschrieben 27. Oktober 2009 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 Zitieren
HJST1979 Geschrieben 27. Oktober 2009 Geschrieben 27. Oktober 2009 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 Zitieren
Kworth Geschrieben 27. Oktober 2009 Autor Geschrieben 27. Oktober 2009 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? Zitieren
Rekon1602 Geschrieben 27. Oktober 2009 Geschrieben 27. Oktober 2009 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... Zitieren
Byteloser Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 Welches Framework benutzt Du? Zitieren
Kworth Geschrieben 28. Oktober 2009 Autor Geschrieben 28. Oktober 2009 (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 28. Oktober 2009 von Kworth Zitieren
Byteloser Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 (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 28. Oktober 2009 von Byteloser Zitieren
Rekon1602 Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 Beim Visual Studio 2008 ist normalerweiße .net 3.5 dabei Zitieren
Byteloser Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 Nein, bei VS 2008 kannst Du zwischen den 3 Versionen auswählen. Zitieren
Rekon1602 Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 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??? Zitieren
Rekon1602 Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 aber warum sollte man nicht das 3.5er nehmen, wenn man es haben kann... Zitieren
Byteloser Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 Probier es doch aus. :-) Zitieren
Byteloser Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 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 } Zitieren
Rekon1602 Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 Stimmt. Ich kenn das auch von meiner Arbeit wo man nicht immer das neueste nehmen darf..... Zitieren
TDM Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 Man könnte auch einfach in der Iteration den Namen dynamisch abfragen... Zitieren
Kworth Geschrieben 28. Oktober 2009 Autor Geschrieben 28. Oktober 2009 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 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 Zitieren
Kworth Geschrieben 28. Oktober 2009 Autor Geschrieben 28. Oktober 2009 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". Zitieren
grueni Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 Wozu eigentlich der neue Thread? Ich habe den "alten" Thread hier angehängt Zitieren
Rekon1602 Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 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 Zitieren
Rekon1602 Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 Hab mich geirrt. So wie du es beschrieben hast muss es eigentlich funktionieren. Habs grad selbst mal versucht und es funktioniert einwandfrei Zitieren
Kworth Geschrieben 28. Oktober 2009 Autor Geschrieben 28. Oktober 2009 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 Zitieren
0815FIA Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 (bearbeitet) private Control[] GetControlsByName(string name) { return Controls.Find(name, true); } EDIT: Ach so, es geht hier um System.Web.UI.Control :roll: Bearbeitet 28. Oktober 2009 von 0815FIA Zitieren
0815FIA Geschrieben 28. Oktober 2009 Geschrieben 28. Oktober 2009 Ja dann mußt du deinen Controls Ids zuweisen, dann kannst Du die System.Web.UI.Control.FindControl(string) Methode nutzen. Zitieren
Empfohlene Beiträge
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.