Atur beberapa tombol. Konten dalam loop for (setiap).

EDIT: TERpecahkan

Saya menemukan solusi saya sejauh ini:

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

Sekarang untuk memperjelas, saya menggunakan kueri seperti: SELECT * FROM table LIMIT 8 untuk mengisi List<string> SPItems = new List<string>(); saya yang berarti daftar saya selalu berisi 8 nilai atau kurang.

Sekarang tentu saja di for loop saya, loop akan mencoba mengisi semua 8 tombol.

Tetapi jika jumlah nilai dalam daftar saya kurang dari katakanlah... 5 atau 6, maka akan muncul ArgumentOutOfRangeException : Index was out of range

Bagaimana saya bisa mengatasi ini?


Saya memiliki daftar List<string> SPItems = new List<string>(); yang berisi data yang diambil dari database.

Saya ingin mengulang daftar, dan untuk setiap item di SPItems, saya ingin mengatur button's content yang berbeda.

Jadi katakanlah daftar saya berisi:

  • nilai1
  • nilai2
  • nilai3

yang saya butuhkan sekarang adalah:

  • Tombol1.Konten = nilai1;
  • Tombol2.Konten = nilai2;
  • Button3.Konten = nilai3;

person DeMama    schedule 14.03.2013    source sumber
comment
Bagaimana dengan menempatkan tombol Anda dalam daftar atau array alih-alih memberinya nama yang mirip? Inilah tujuan dari array   -  person Benjamin Gruenbaum    schedule 15.03.2013
comment
mengapa tidak mengikat SPItems saja ke ItemsControl penuh Buttons?   -  person sa_ddam213    schedule 15.03.2013
comment
Proses awal ini maksimal. 8 nilai (8 tombol), jika tombol lain ditekan, 8 nilai berikutnya akan diambil dari database saya...   -  person DeMama    schedule 15.03.2013
comment
sepertinya ada beberapa kesalahpahaman menurut saya.. Saya sudah memiliki tombol, saya hanya perlu kontennya disetel dari daftar Button1.Content = "my value1"; Button2.Content = "my value 2"; dll...   -  person DeMama    schedule 15.03.2013


Jawaban (4)


Jika Tombol Anda Dinamakan seperti Button1,Button2,Button3....

Anda dapat menggunakan FindChild<T>()
di sini Anda mendapatkan metodenya

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

Sunting

seperti biasa:

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

sebagai cara yang Menyakitkan:

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
Jika saya memiliki lebih banyak perwakilan, saya akan memberi Anda +1, karena jawaban ini paling membantu saya. Saya perlu menggunakan ini di for loop: SubItem1txt.Text = SPItems[i]; i++; DAN SubItem2txt.Text = SPItems[i]; i++; dll. Tentu saja, saya memiliki 8 tombol untuk diisi.. sekarang jika SPItems.Count memiliki indeks kurang dari 8, pengecualian akan diberikan. Bisakah saya mengatakan if (SPItems.Count == 1) =>> fill 1 button ATAU if (SPItems.Count == 2) =>> fill 2 buttons ? Terima kasih btw!! - person DeMama; 15.03.2013
comment
@DeMama pengecualian apa yang Anda dapatkan? karena jika Anda hanya menyalinnya dan mengganti TextBlock dengan Button satu-satunya masalah adalah jika Anda memiliki 7 Tombol dan SPItems.Count>7 maka Anda akan mendapatkan NullReferencExeptoin karena tidak memeriksa apakah foundButton != null - person WiiMaxx; 15.03.2013
comment
saya menemukan solusinya, terima kasih atas bantuan Anda, saya mengirimkan jawabannya :) bersorak! - person DeMama; 15.03.2013

JANGAN memanipulasi elemen UI dalam kode untuk tugas sederhana ini. Ini adalah cara WPF untuk melakukan apa yang Anda minta:

<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>

Kode Dibalik:

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

Ini adalah apa yang terlihat di layar saya:

masukkan deskripsi gambar di sini

person Federico Berasategui    schedule 14.03.2013
comment
Hmm oke.. Tapi saya sudah punya tombolnya.. Saya hanya ingin mengatur content atau text inside those buttons - person DeMama; 15.03.2013
comment
@DeMama kemudian buat ViewModel yang tepat untuk menampung nilai string Anda dan mengikat properti Buttons Content. <Button Content="{Binding SomeStringInTheViewModel}"/> - person Federico Berasategui; 15.03.2013

Ini semacam solusi yang kotor tetapi jika Anda ingin memanipulasi semua tombol pada formulir, itu sepadan. Cara paling sederhana yang saya tahu adalah menambahkan semua tombol ke ArrayList (ya, secara manual, itu bagian yang menyakitkan) dan kemudian mengulangi daftar itu.

person evanmcdonnal    schedule 14.03.2013
comment
Atau List<Button> bukannya ArrayList. - person Mohammad Dehghan; 15.03.2013
comment
@MD.Unicorn ya, awalnya saya hanya mengatakan 'daftar' tetapi ArrayList memiliki kinerja yang jauh lebih baik jadi saya memutuskan untuk menyatakannya secara spesifik. Jelas ada beberapa struktur data yang berfungsi dengan baik di sini. - person evanmcdonnal; 15.03.2013

Berkat WiiMaxx saya menemukan solusinya!

Dengan menggunakan metode ini saya berhasil mengatur teks tombol saya dengan data yang diambil dari database saya.

Ini menjadi loop foreach, tapi sekarang berfungsi persis seperti yang diperlukan. edit: menemukan versi for

Saya memiliki WrapPanel, yang berisi buttons saya, yang lagi-lagi berisi TextBlock's saya.

Karena TextBlock's saya tidak dimulai dengan 0 tetapi dengan 1 (misal: SubItem1txt) saya perlu membuat int tambahan. Saya harap ini bermanfaat bagi seseorang.

Terima kasih untuk semuanya :)!

versi depan:

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

untuk versi:

    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