2016-04-17 2 views
1

Ich habe eine Methode, die in allen Steuerelementen auf einem Registerblatt sucht und eins zurückgibt, eine Zeichenfolge (Controls.Find Methode) entspricht. Da ich sicher bin, dass nur ein Steuerelement gefunden wird und dass die Kontrolle eine Combo-Box ist, habe ich versucht, es zu wirken, aber es verhält sich komisch.Controls.Find-Methode gibt nichts zurück, wenn Cast als ComboBox []

Dieser Code korrekt ausgeführt:

private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ComboBox cb = sender as ComboBox; 
     String Name = cb.Name; 
     Name = Name.Replace("Rank", "Target"); 
     Control[] ar = cb.Parent.Controls.Find(Name, false); 
     MessageBox.Show(ar.Length.ToString()); 
     if (ar.Length > 1) 
     { 
      MessageBox.Show("More than one \"Target\" combo box has been found as the corresponding for the lastly modified \"Rank\" combo box."); 
     } 
     else 
     { 
      for (int i = cb.SelectedIndex; i < Ranks.Count - 1; i++) 
      { 
       //ar[0].Items.Add(Ranks[i]); - this does not work, since Controls don't have a definition for "Items" 
      } 
     } 
    } 

dieses Controls.Find Methode der Code nichts zurückliefert:

private void Enchantments_ComboBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ComboBox cb = sender as ComboBox; 
     String Name = cb.Name; 
     Name = Name.Replace("Rank", "Target"); 
     ComboBox[] ar = (ComboBox[])cb.Parent.Controls.Find(Name, false); //Also tried "as ComboBox, instead of "(ComboBox)" if it matters 
     MessageBox.Show(ar.Length.ToString()); //Raises an exception as arr[] is null 
     if (ar.Length > 1) 
     { 
      MessageBox.Show("More than one \"Target\" combo box has been found as the corresponding for the lastly modified \"Rank\" combo box."); 
     } 
     else 
     { 
      for (int i = cb.SelectedIndex; i < Ranks.Count - 1; i++) 
      { 
       ar[0].Items.Add(Ranks[i]); 
      } 
     } 
    } 

Ich frage mich, warum es nichts gibt, wenn sie als ComboBox gegossen und wie kann ich lindern dieses Verhalten.

Antwort

2

Look at Find Methodensignatur:

public Control[] Find(string key, bool searchAllChildren) 

Das Ergebnis ist der Typ der Steueranordnung. Und selbst wenn alle Steuerelemente des Arrays vom Typ ComboBox waren, ist das Ergebnis nicht vom Typ ComboBox[], sodass der Cast null zurückgibt.

Wenn Sie eine ComboBox Array benötigen, können Sie einfach verwenden:

ComboBox[] result = cb.Parent.Controls.Find(Name, false).OfType<ComboBox>().ToArray(); 

Auch wenn Sie sicher sind, alle zurückgegebenen Elemente vom Typ der ComboBox sind, können Sie auch Cast<ComboBox>() statt OfTYpe<ComboBox>() verwenden.

Wenn alle Elemente des gleichen Typs sind, können Sie Cast<T>, verwenden, wenn einige Elemente der Art von K sein können, aber Sie wollen nur die Elemente vom Typ T, können Sie OfType<T> verwenden.

+0

Vielen Dank! Also, mein Fehler war nicht zu wissen, dass Casting etwas als einen bestimmten Typ nicht mehr weiß, welchen Typ eine Methode zurückgeben würde? – mathgenius

+1

Wenn Sie versuchen, 'SomeValue as SomeType' zu ​​erzeugen, ist der Cast nur dann erfolgreich, wenn der' SomeValue' wirklich vom Typ 'SomeType' ist. Dein Tipp ist hier, du hast erwartet, dass der Cast 'Control []' in 'ComboBox []' konvertieren kann. Ein Steuerelementarray, das eine Combobox enthält, ist nicht vom Typ von 'ComboBox []'. Wenn Sie wissen, dass alle Elemente vom Typ 'ComboBox' sind, können Sie' Cast () 'verwenden, wenn Elemente auch andere Steuerelemente enthalten können. Sie können das Ergebnis nur auf Kombinationsfelder beschränken , mit 'OfType ()'. –