设置多个buttons.Content in(每个)循环

时间:2013-03-14 21:03:51

标签: c# wpf list foreach

编辑:已解决

到目前为止我找到了我的解决方案:

        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

所以我要说我的清单包含:

  • 值1
  • 值2
  • 值3

我现在需要的是:

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

4 个答案:

答案 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);
        }
    }
}

这就是我的屏幕中的样子:

enter image description here

答案 2 :(得分:0)

这是一种肮脏的解决方案,但如果您要操作表单上的所有按钮,那是值得的。我所知道的最简单的方法是将所有按钮添加到ArrayList(是的,手动,这是痛苦的部分),然后循环遍历该列表。

答案 3 :(得分:0)

感谢WiiMaxx我找到了解决方案!

使用this method我成功地将我的按钮文本设置为从我的数据库中检索的数据。

它成为foreach循环,但现在它完全按照需要运行。 修改:找到for版本

我有一个WrapPanel,其中包含我的buttons,其中再次包含我的TextBlock's

因为我的TextBlock's不是以0开头,而是1(例如SubItem1txt),我需要创建一个额外的int。我希望这对某人有用。

感谢大家:)!

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++;
    }

for version:

    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++;
    }