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