Установите несколько кнопок. Контент в цикле for (каждый)

РЕДАКТИРОВАТЬ: РЕШЕНО

Я нашел свое решение до сих пор:

        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

что мне сейчас нужно:

  • Кнопка1.Содержимое = значение1;
  • Кнопка2.Содержимое = значение2;
  • Кнопка3.Содержимое = значение3;

person DeMama    schedule 14.03.2013    source источник
comment
Как насчет того, чтобы поместить кнопки в список или массив вместо того, чтобы давать им одинаковые имена? Это цель массивов   -  person Benjamin Gruenbaum    schedule 15.03.2013
comment
почему бы просто не связать SPItems с ItemsControl, полным Buttons?   -  person sa_ddam213    schedule 15.03.2013
comment
Этот начальный процесс макс. 8 значений (8 кнопок), если нажать другую кнопку, следующие 8 значений будут извлечены из моей базы данных...   -  person DeMama    schedule 15.03.2013
comment
кажется, есть какое-то недоразумение, я думаю.. У меня уже есть мои кнопки, мне просто нужно, чтобы их содержимое было установлено из списка Button1.Content = "my value1"; Button2.Content = "my value 2"; и т. д.   -  person DeMama    schedule 15.03.2013


Ответы (4)


Если ваши кнопки названы как Button1,Button2,Button3....

вы можете использовать FindChild<T>()
здесь вы получите метод

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
person WiiMaxx    schedule 15.03.2013
comment
Если бы у меня было больше представителей, я бы дал вам +1, потому что этот ответ помог мне больше всего. Мне нужно было использовать это в моих for loop: SubItem1txt.Text = SPItems[i]; i++; И SubItem2txt.Text = SPItems[i]; i++; и т. д. Конечно, у меня есть 8 кнопок, которые нужно заполнить. Теперь, если SPItems.Count имеет индекс меньше 8, создается исключение. Могу я как-то сказать if (SPItems.Count == 1) =>> fill 1 button ИЛИ if (SPItems.Count == 2) =>> fill 2 buttons ? Кстати, спасибо!! - person DeMama; 15.03.2013
comment
@DeMama какое у тебя исключение? потому что, если вы просто скопируете его и замените TextBlock на Button, единственная проблема может быть, если у вас есть 7 кнопок и SPItems.Count>7, тогда вы получите NullReferencExeptoin, потому что он не проверяет, foundButton != null - person WiiMaxx; 15.03.2013
comment
я нашел решение, спасибо за вашу помощь, я отправил ответ :) ура! - person DeMama; 15.03.2013

НЕ манипулируйте элементами пользовательского интерфейса в коде для этих простых задач. Это способ 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);
        }
    }
}

Вот как это выглядит на моем экране:

введите здесь описание изображения

person Federico Berasategui    schedule 14.03.2013
comment
Хм, хорошо.. Но у меня уже есть кнопки.. Я просто хочу установить content или text inside those buttons - person DeMama; 15.03.2013
comment
Затем @DeMama создайте правильную ViewModel для хранения ваших значений string и привяжите свойство Buttons Content. <Button Content="{Binding SomeStringInTheViewModel}"/> - person Federico Berasategui; 15.03.2013

Это своего рода грязное решение, но если вы собираетесь манипулировать всеми кнопками в форме, оно того стоит. Самый простой способ, который я знаю, это добавить все кнопки в ArrayList (да, вручную, это болезненная часть), а затем просто перебирать этот список.

person evanmcdonnal    schedule 14.03.2013
comment
Или List<Button> вместо ArrayList. - person Mohammad Dehghan; 15.03.2013
comment
@ MD.Unicorn Да, изначально я просто сказал «список», но ArrayList имеет гораздо лучшую производительность, поэтому я решил указать это конкретно. Очевидно, что здесь есть несколько структур данных, которые отлично подойдут. - person evanmcdonnal; 15.03.2013

Благодаря WiiMaxx я нашел решение!

Используя этот метод, я успешно установил текст кнопок с данными, полученными из моей базы данных.

Это стало циклом 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++;
    }
person DeMama    schedule 15.03.2013