2012-10-21 13 views
5

C# Winform'umda bir panelde bir grup metin kutusu var. Metin kutuları her satırı şöyle adlandırılır: vbÇağrılar (Düğme) gönderen (düğme #) yöntemini kullanarak çağrıya göre değişken adlarını nasıl işlerim?

ve

tb1 tbNickName1 comboBox1
TB2 tbNickName2 comboBox2
TB3 tbNickName3 comboBox3
.

Her bir metin kutusu satırının yanında bir düğme var. Ancak, düğmenin her bir düğme için farklı bir etkinliğe sahip olması yerine, düğmeyi yalnızca button1_Click olayıyla işaretlemek ve buradaki tüm işlemleri gerçekleştirmesini istiyorum. Bunu nasıl yapacağımı biliyorum ve tüm düğmelerim button1_Click olayına işaret ediyor.

Ancak hangi düğmeden çağrılabileceğimi belirlemeliyim (ki bunu yapabiliyorum), ancak olaydaki metin kutularının ismini kullanmam gerekiyor, böylece işleme ne yaptığına göre satır aradığım/butonum var.

Örneğin, tb2 tbNickName2 comboBox2 metin kutularının bulunduğu satır 2 numaralı satırdayım, bu durumda button1_Click olayının bunu bilmesi ve tb2 tbNickName2 comboBox2 değerlerini kullandığım tmp değişkenlerine otomatik olarak atayabilmem gerekir. Aşağıdaki örnekte.

private void button1_Click(object sender, EventArgs e) 
{ 
     Button bt = (Button) sender; //will return 'button1' 

     string tmpEmail = null; 
     string tmpNickName = null; 
     string tmpGroup = null; 

     //I don't want to hard code the tb1.Text value here, I want to have 
     // the namechange based on which (Button) sender it was called from. 

     // For example button1 should assign all the 
     // tb1 tbNickName1 comboBox1 values 

     //If called from button2, then it should assign the 
     //tb2 tbNickName2 comboBox2 values instead 

     //How can I do this so tb1.Text is based off of the button # that I am 
     //calling for example tb(bt).Text would be cool but that does not work. 

     tmpEmail = tb1.Text; //What do I change tb1.Text to based on button #? 

     tmpNickName = tbNickName1.Text; //What do I change tbNickName1.Text to? 

     tmpGroup = comboBox1.Text;//What do I change comboBox1.Text to? 
} 


ben bunu çok iyi izah değil biliyorum, ama bunu yapabilirim en iyisidir. düğmeleri üzerinde

+0

Kullanım düğmelerinin CommandArgument-özelliğini kullanabilir ve EventHandler o değerlendirebilirsiniz gerekmeyebilir ait olabilir. – mboldt

+0

Lütfen bunu nasıl yapacağınıza dair bir örnek gösterebilir misiniz? – fraXis

+0

Küçük bir kod parçacığını yanıt olarak gönderiyorum. – mboldt

cevap

1
Button button = sender as Button; 
string buttonIndex = button.Name.Substring(6); 
string tempEmail = (this.Controls["tb" + buttonIndex] as TextBox).Text; 
string tmpNickName = (this.Controls["tbNickName" + buttonIndex] as TextBox).Text; 
string tmpGroup = (this.Controls["comboBox" + buttonIndex] as ComboBox).Text; 
+0

string tempEmail = (Bu, ["tb" + buttonIndex] öğesini TextBox olarak denetler.); "Nesne başvurusu bir nesnenin örneğine ayarlanmadı" hatasına neden olur. – fraXis

+0

Yani TextBox with tb + buttonIndex, WinForm – Denis

+0

'da bulunmadı. Hatayı çözdüm. Panel adımı eklemek için kod satırını değiştirdim ve şimdi iyi çalışıyor: string tempEmail = (this.panel1.Controls ["tb" + buttonIndex] TextBox olarak) .Text; – fraXis

0

, kendi EventHandler bu

bt1.CommandArgument = "1"; 
bt2.CommandArgument = "2"; 

gibi bir şey olabilir hangi CommandArgument-Mülkiyet eklersek CommandArgument okuyup Sadece sözde kod buna göre

private void button1_Click(object sender, EventArgs e) 
    { 
     Button bt = (Button) sender; 
     if(bt.CommandArgument == "1") { 
      // bt1 was clicked, handle stuff accordingly 
     } else if(bt.CommandArgument == "2") { 
      // bt2 was clicked.. 
     } else { 
      //handle rest of possible cases 
     } 
    } 

hareket ama Bunun nereye gittiğini görebileceğinizi düşünüyorum. Bununla birlikte, değişken adlandırma işleminizin en uygun değerden uzak olduğunu unutmayın. Değişkenlerinizin ve kontrollerinizin isimlerini, sadece sayılarla isimlendirmek yerine, herhangi bir bilgi vermeyi seçti. Kodu daha sonra gözden geçirirseniz ve bunu anlamaya çalışırsanız, bu size çok yardımcı olacaktır. Bunun gibi, anlamlı CommanArgument değerleri de bulmaya çalışın.

+0

Ne demek istediğini anlıyorum, ancak geçici değişkenlerime atamak istediğim her bir metin kutusu sırasına dayanan çok fazla kodum var. Farklı if/else ifadeleri arasında tüm bu iki kodlu kodlardan kaçınmak istiyorum. Metin kutularını # olayının hangi düğmeyi çağırdığını temel alarak geçici değişkenlere atayan bir kod kümesine sahip olmak istiyorum. – fraXis

+0

Her bir durum için yürütülmesi gereken kod her zaman aynıysa, bunu yalnızca farklı bir yöntemle belirtin, geçici değişkenlerinizi CommandArgument öğesine göre ayarlayın ve bu geçici değişkenleri gerçek kodunuzu yürüten yönteme iletin. – mboldt

+0

Kodun çoğunluğu, değerleri atamak için gereken metin kutularına göre değişecek değişken adları dışında aynıdır. Birçok yöntemde hala çok sayıda kod var ve daha verimli ve bakımı kolay bir şey denemek istiyorum. – fraXis

1

Sen (paneldeki kontrollerin üzerinde yineleme) böyle bir şey yapabilirsiniz:

//Get the number of the button control (last digit of the name) 
    string strNum = bt.Name.Substring(bt.Name.Lenght -2); 
    foreach(Control ctrl in myPanel.Controls) 
    { 
     if(ctrl is ComboBox) { 
      if(ctrl.Name.EndsWith(strNum)) { 
      //Do Something with your found ComboBox ... 
      } 
     } 
    } 

Kod test ama size bir fikir vermelidir değil ...

-1

Öncelikle, kendi için, Bizimki ve kodlarınıza bakacak başka herkes, adlandırma kuralınızı değiştirir.

Bir çözüm olarak, onay kutularına ve metin kutularına, bunları oluştururken sözlük haline getirilmenizi öneririm. Düğmeler, CommandArgument'da kullandığınız anahtarı içermelidir. Artık sözlüğe erişerek satırı geri alabilirsiniz.

Örneğin, yapıcı içinde, etkinlik işleyicisi İşte

yılında, O zaman bu

_rowDictionary = new Dictionary<string, Row> { 
    { "identifier of first line", new Row { descriptiveNameOfFirstTextBox, descriptiveNameOfFirstTextBox, descriptiveNameOfButton } }, 
    // ... 
}; 
descriptiveNameOfButton.CommandArgument = "identifier of first line"; 

gibi bir şey eklemek istiyorum, bazı konteyner sınıfı kullandım. Bunu

class Row { 
    TextBox textBoxForInputOfA { get; set; } 
    TextBox textBoxForInputOfB { get; set; } 
    Button buttonForDoingWhatItDoes { get; set; } 
}