Veröffentlicht 27. Oktober 200915 j 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
27. Oktober 200915 j 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
27. Oktober 200915 j 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
27. Oktober 200915 j 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?
27. Oktober 200915 j 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...
28. Oktober 200915 j 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 200915 j von Kworth
28. Oktober 200915 j 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 200915 j von Byteloser
28. Oktober 200915 j 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???
28. Oktober 200915 j 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 }
28. Oktober 200915 j Stimmt. Ich kenn das auch von meiner Arbeit wo man nicht immer das neueste nehmen darf.....
28. Oktober 200915 j 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
28. Oktober 200915 j 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".
28. Oktober 200915 j 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
28. Oktober 200915 j Hab mich geirrt. So wie du es beschrieben hast muss es eigentlich funktionieren. Habs grad selbst mal versucht und es funktioniert einwandfrei
28. Oktober 200915 j 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
28. Oktober 200915 j 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 200915 j von 0815FIA
28. Oktober 200915 j Ja dann mußt du deinen Controls Ids zuweisen, dann kannst Du die System.Web.UI.Control.FindControl(string) Methode nutzen.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.