2009-11-05 8 views
6

Winforms uygulamasında bir dizi düğme nasıl oluştururum?C# Düğme Array nasıl oluşturulur?

Yapmaya çalıştığım şey şudur: Takvim düzeninde, zaman aralıklarını gösteren çok fazla düğmem var. IE: Pazartesi0700Button, Pazartesi0730Düğme, Pazartesi0800Düğme, vb. 30dk aralıklarla.

Randevular alanlarından birinin <Duration> olduğu bir xml veritabanım var. Süre = 0,5saat ve <Time> alanı "07:00" olduğunda, "Monday0700Button" öğesinin rengi. Süre 1.0 saat olduğunda, 'Monday0700Button' ve 'Monday0730Button' aşağıdaki zaman dilimi düğmesini doldurmasını istiyorum.

Herhangi bir fikrin var mı? Teşekkürler.

+3

Soruyla tamamen ilgili değil, sadece biraz ileriye bakmak gerekirse, http: //www.devexpress.com/Ürünler/NET/Kontroller/WinForms/Zamanlayıcı /, kendi yazmak yerine bir takvim planlayıcısı olarak kullanmak için, daha az çaba için çok daha fazla kazanacaksınız – RC1140

+0

+1 stalkerh: Biz bu kontrolü kullanıyoruz (tüm işletme Suite) bazı harika sonuçlarla çalışıyorum. Yeterince tavsiye etmem. –

cevap

5

Evet, aşağıdaki gibi bir düğme listesi oluşturabilirsiniz.

List<Button> listOfButtons = new List<Button>(); 
listOfButtons.Add(yourButton); 
+1

Sanırım cevabınız eksik olabilir. Düğmeler bir formda görüntülenip kullanılamazsa, düğme nesnelerinin bir listesi kullanılamaz. Her düğme için olayları nasıl bir araya getiriyorsunuz? –

+0

@Robert Harvey: Bu örnekte, olay işleyicilerini programatik olarak eklemelisiniz. – FrustratedWithFormsDesigner

+3

On notumu almak için bundan daha iyisini yapmanız gerekecek. –

3

Evet, bir dizi Düğme veya herhangi bir nesne oluşturmak sorun değildir. Görsel stüdyo tasarımcısında bunları göremezsiniz, ancak iyi çalışırlar.

Uzun zaman önce bir hesap makinesi uygulaması için kullanıcı arayüzünü oluşturmak üzere 2 boyutlu bir dizi düğme kullandım. Uzun bir süre HP-15C kullandım ve onu özledim.

alt text

dizi yaklaşım iyi çalıştı.

Button[] numberButtons=new Button[] { btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btnDecimalPt}; 
    Button[] operationButtons=new Button[] { btnDiv, btnMult, btnSubtract, btnAdd }; 

    foreach (var b in numberButtons) 
     b.Click += new System.EventHandler(this.Number_Click); 

    foreach (var b in operationButtons) 
     b.Click += new System.EventHandler(this.Operation_Click); 

    // etc 

    Button[][] allButtons= 
    { 
     new Button[] {btnSqrt, btnExp, btn10x, btnPow,btnMultInverse, btnCHS, null, null, null, null}, 
     new Button[] {btnN, btnInterest, btnPMT, btnPV, btnFV, null, btn7, btn8, btn9, btnDiv}, 
     new Button[] {btnLn, btnLog, btnSine, btnCosine, btnTangent, btnPi, btn4, btn5, btn6, btnMult}, 
     new Button[] {btnRoll, btnSwap, btnCLRfin, btnCLX, btnCLR, btnEnter, btn1, btn2, btn3, btnSubtract}, 
     new Button[] {btnInt, btnFrac, btnFix, btnStore, btnRecall, null, btn0, btnDecimalPt, btnNotUsed, btnAdd} 
    }; 

    // programmatically set the location 
    int col,row; 
    for(row=0; row < allButtons.Length; row++) 
    { 
     Button[] ButtonCol= allButtons[row]; 
     for (col=0; col < ButtonCol.Length; col++) 
     { 
      if (ButtonCol[col]!=null) 
      { 
       ButtonCol[col].TabIndex = col + (row * allButtons.Length) +1; 
       ButtonCol[col].Font = font1; 
       ButtonCol[col].BackColor = System.Drawing.SystemColors.ControlDark; 
       ButtonCol[col].Size=new System.Drawing.Size(stdButtonWidth, stdButtonHeight); 
       ButtonCol[col].Location=new Point(startX + (col * stdButtonWidth), 
               startY + (row * stdButtonHeight)) ; 
      } 
     } 
    } 
+0

Bunu yaptığımda, foreach'a ulaştığı anda bir çalışma zamanı hatası alıyorum (numberButtons'ta var b) b.Click + = new System.EventHandler (this.Number_Click); – user1747567

0

Düğmeler, tüm GUI öğeleri gibi tıpkı diğer nesneler gibi nesnelerdir (bu, aynı zamanda görüntülenebilir). Yani evet, diziler, listeler, sözlükler olabilir. Taylor L'nin response bazı örnek koduna sahiptir.

0

Evet, bu, Taylor L'nin gösterdiği gibi mümkündür. Tek yakalama, kontrolü kopyalayıp yapıştırarak oluşturulan VB6 tarzı kontrol dizilerinin artık form düzenleyicide yapılamayacağıdır.

3

Evet, kesinlikle mümkün, ama muhtemelen gereksiz.

Sizi doğru anlıyorsanız, Formunuza bir FlowLayoutPanel ekleyebilmeniz ve ardından XML'iniz arasında geçiş yapabilmeniz ve gerektiğinde yeni bir Düğme başlatmanız gerekir. Click olayı için olay işleyicisini bağlayın, daha sonra FlowLayoutPanel'inizdeki Controls özelliğindeki Add() yöntemini çağırarak düğmeyi FlowLayoutPanel'e ekleyin.

while (reader.Reader()) 
{ 
    // Parse XML here 

    // Instantiate a new button that will be added to your FlowLayoutPanel 
    Button btn = new Button(); 

    // Set button properties, as necessary 
    btn.Text = "Foo"; 
    btn.Click += new EventHandler(SomeButton_Click); 

    // Add the button to the FlowLayoutPanel 
    flowLayoutPanel.Controls.Add(btn); 
} 

bir FlowLayoutPanel kolay sizin düğmeler için düzenini yapmak kılarken

, bu sizin için işe yaramayabilir. Eğer durum buysa, XML'de dolaşırken düğmeleriniz için X ve Y koordinatlarını çalıştırmanız gerekecektir.

Yukarıdaki yaklaşımla karşılaşacağınız bir sorun, her zaman aynı olay işleyicisini çağırmasıdır. Sonuç olarak, hangi düğmenin tıklandığını belirlemek için bir yol bulmak zorunda kalacaksınız. Bir yaklaşım, zaman periyodunu kabul etmek için kullanılabilecek ek özellikler sağlamak için Düğme kontrolünü genişletmek olabilir.