uso salir for español definicion codigo bucle array c# wpf list foreach

c# - salir - Establecer múltiples botones. Contenido en un ciclo for(each)



salir de un for c# (4)

EDITAR: SOLUCIONADO

Encontré mi solución hasta ahora:

for (int i = 0; i < SPItems.Count; i++) { SubItem1txt.Text = SPItems[i]; i++; SubItem2txt.Text = SPItems[i]; i++; SubItem3txt.Text = SPItems[i]; i++; SubItem4txt.Text = SPItems[i]; i++; SubItem5txt.Text = SPItems[i]; i++; SubItem6txt.Text = SPItems[i]; i++; SubItem7txt.Text = SPItems[i]; i++; SubItem8txt.Text = SPItems[i]; i++; }

Ahora, para aclarar las cosas, utilizo una consulta como: SELECT * FROM table LIMIT 8 para completar mi List<string> SPItems = new List<string>(); lo que significa que mi lista siempre contiene 8 valores o menos.

Ahora, por supuesto, en mi for loop , el ciclo intentará llenar los 8 botones.

Pero si la cantidad de valores en mi lista es menor que digamos ... 5 o 6, arroja ArgumentOutOfRangeException : Index was out of range

Cómo puedo resolver esto ?

Tengo una List<string> SPItems = new List<string>(); lista que contiene datos recuperados de una base de datos.

Quiero SPItems la lista, y para cada elemento en SPItems , quiero establecer button''s content diferentes button''s content .

Entonces digamos que mi lista contiene:

  • valor1
  • valor2
  • valor3

lo que necesito ahora es:

  • Button1.Content = value1;
  • Button2.Content = value2;
  • Button3.Content = value3;

Esta es una solución bastante sucia, pero si vas a manipular todos los botones del formulario, vale la pena. La forma más sencilla que conozco es agregar todos los botones a una ArrayList (sí, de forma manual, esa es la parte dolorosa) y luego simplemente pasar sobre esa lista.


NO manipule los elementos de la IU en el código para estas tareas simples. Esta es la forma de WPF de hacer lo que estás preguntando:

<Window x:Class="WpfApplication4.Window18" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window18" Height="300" Width="300"> <ItemsControl ItemsSource="{Binding}"> <ItemsControl.ItemTemplate> <DataTemplate> <Button Content="{Binding}" Margin="2"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Window>

Código detrás:

using System.Windows; using System.Linq; namespace WpfApplication4 { public partial class Window18 : Window { public Window18() { InitializeComponent(); DataContext = Enumerable.Range(0, 20).Select(x => "Item" + x); } } }

Esto es lo que parece en mi pantalla:


¡Gracias a WiiMaxx encontré la solución!

Al usar este método, establecí con éxito el texto de mis botones con datos recuperados de mi base de datos.

Se convirtió en un ciclo foreach , pero ahora funciona exactamente como se necesita. editar: encontré la versión for

Tengo un WrapPanel , que contiene mis buttons , en el que nuevamente aparece mi TextBlock''s .

Debido a que mi TextBlock''s no comienza con 0 pero con 1 (por ejemplo: SubItem1txt ) necesitaba crear una int extra. Espero que esto sea útil para alguien.

Gracias a todos :) !

Versión foreach:

int i = 1; int a = 0; foreach (string spi in SPItems) { WrapPanel pnl = UIHelper.FindChild<WrapPanel>(this, "SubItems"); Button btn = UIHelper.FindChild<Button>(pnl, "SubItem" + i); TextBlock tb = UIHelper.FindChild<TextBlock>(btn, "SubItem" + i + "txt"); btn.Visibility = Visibility.Visible; tb.Text = SPItems[a]; a++; i++; }

para la versión:

int i = 1; for (int a = 0; a < SPItems.Count; a++) { WrapPanel pnl = UIHelper.FindChild<WrapPanel>(this, "SubItems"); Button btn = UIHelper.FindChild<Button>(pnl, "SubItem" + i); TextBlock tb = UIHelper.FindChild<TextBlock>(btn, "SubItem" + i + "txt"); btn.Visibility = Visibility.Visible; tb.Text = SPItems[a]; i++; }


Si sus botones reciben el nombre de Button1, Button2, Button3 ...

podrías usar FindChild<T>()
aquí obtienes el método

for(int i =0; i< SPItems.Count;i++) // iterates for each item in your SPItems { Button foundButton = UIHelper.FindChild<Button>(Application.Current.MainWindow, "Button"+i); if(foundButton != null) //Protecteted agains trying to use Null-Reference { var foundButtonTextBlock =foundButton .Content as TextBlock if(foundButtonTextBlock != null)//Protecteted agains trying to add Text by Null-Reference foundButtonTextBlock.Text = SPItems[i]; } }

Editar

de manera normal:

for(int i =0; i< SPItems.Count;i++) // iterates for each item in your SPItems { TextBlock foundTextBlock = UIHelper.FindChild<TextBlock>(this, "SubItem"+1+i+"txt"); if(foundTextBlock != null) //Protecteted agains trying to add Text by Null-Reference { foundTextBlock .Text = SPItems[i]; } }

como manera dolorosa:

int i =0; if(SPItems.Count >0) { SubItem1txt.Text = SPItems[i]; i++; } if(SPItems.Count >1) { SubItem2txt.Text = SPItems[i]; i++; } if(SPItems.Count >2) { SubItem3txt.Text = SPItems[i]; i++; } if(SPItems.Count >3) { SubItem4txt.Text = SPItems[i]; i++; } if(SPItems.Count >4) { SubItem5txt.Text = SPItems[i]; i++; } if(SPItems.Count >0) { SubItem6txt.Text = SPItems[i]; i++; } if(SPItems.Count >5) { SubItem7txt.Text = SPItems[i]; i++; } if(SPItems.Count >6) { SubItem8txt.Text = SPItems[i]; i++; } //..... never ever do this