到目前为止我找到了我的解决方案:
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++;
}
现在为了清楚起见,我使用SELECT * FROM table LIMIT 8
这样的查询来填充我的List<string> SPItems = new List<string>();
,这意味着我的列表总是包含8个或更少的值。
现在当然在我的for loop
中,循环将尝试填充所有8个按钮。
但如果我的列表中的值小于让我们说... 5或6,则会抛出ArgumentOutOfRangeException : Index was out of range
我该如何解决这个问题?
我有一个List<string> SPItems = new List<string>();
列表,其中包含从数据库中检索到的数据。
我想循环播放列表,对于SPItems
中的每个项目,我想设置不同的button's content
。
所以我要说我的清单包含:
我现在需要的是:
答案 0 :(得分:2)
如果您的按钮命名为Button1,Button2,Button3 ....
你可以使用FindChild<T>()
here you get the method
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];
}
}
正常方式:
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];
}
}
痛苦的方式:
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
答案 1 :(得分:1)
请勿在代码中操作这些简单任务的UI元素。这是WPF执行您所要求的方式:
<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>
代码背后:
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);
}
}
}
这就是我的屏幕中的样子:
答案 2 :(得分:0)
这是一种肮脏的解决方案,但如果您要操作表单上的所有按钮,那是值得的。我所知道的最简单的方法是将所有按钮添加到ArrayList
(是的,手动,这是痛苦的部分),然后循环遍历该列表。
答案 3 :(得分:0)
感谢WiiMaxx我找到了解决方案!
使用this method我成功地将我的按钮文本设置为从我的数据库中检索的数据。
它成为foreach
循环,但现在它完全按照需要运行。 修改:找到for
版本
我有一个WrapPanel
,其中包含我的buttons
,其中再次包含我的TextBlock's
。
因为我的TextBlock's
不是以0
开头,而是1
(例如SubItem1txt
),我需要创建一个额外的int
。我希望这对某人有用。
感谢大家:)!
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++;
}
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++;
}