C# 控件。强制转换为组合框[]时,Find方法不返回任何内容

C# 控件。强制转换为组合框[]时,Find方法不返回任何内容,c#,winforms,combobox,C#,Winforms,Combobox,我有一个方法,可以在选项卡工作表上的所有控件中搜索并返回匹配字符串(方法)的控件。因为我确信只有一个控件会被找到,而这个控件是一个组合框,所以我试着将其转换,但它的行为很奇怪 此代码正确执行: private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; String Name = cb.Name;

我有一个方法,可以在选项卡工作表上的所有控件中搜索并返回匹配字符串(方法)的控件。因为我确信只有一个控件会被找到,而这个控件是一个组合框,所以我试着将其转换,但它的行为很奇怪

此代码正确执行:

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"
            }
        }
    }
private void组合框\u SelectedIndexChanged(对象发送方,事件参数e)
{
ComboBox cb=发送方作为ComboBox;
String Name=cb.Name;
名称=名称。替换(“排名”、“目标”);
Control[]ar=cb.Parent.Controls.Find(Name,false);
Show(ar.Length.ToString());
如果(ar长度>1)
{
Show(“找到多个\“Target\”组合框作为最后修改的\“Rank\”组合框的对应项”);
}
其他的
{
for(int i=cb.SelectedIndex;i
此代码的控件.Find方法不返回任何内容:

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]);
            }
        }
    }
private void enchanments\u组合框\u SelectedIndexChanged(对象发送方,事件参数e)
{
ComboBox cb=发送方作为ComboBox;
String Name=cb.Name;
名称=名称。替换(“排名”、“目标”);
ComboBox[]ar=(ComboBox[])cb.Parent.Controls.Find(Name,false);//如果有必要,也尝试“作为ComboBox,而不是“(ComboBox)”
MessageBox.Show(ar.Length.ToString());//在arr[]为null时引发异常
如果(ar长度>1)
{
Show(“找到多个\“Target\”组合框作为最后修改的\“Rank\”组合框的对应项”);
}
其他的
{
for(int i=cb.SelectedIndex;i
我想知道为什么它在转换为组合框时不返回任何内容,以及如何减轻这种行为。

请看方法签名:

public Control[] Find(string key, bool searchAllChildren)
结果是控件数组的类型。即使数组的所有控件都是
ComboBox
类型,结果也不是
ComboBox[]
类型,因此强制转换返回null

如果需要组合框
数组,只需使用:

ComboBox[] result = cb.Parent.Controls.Find(Name, false).OfType<ComboBox>().ToArray();
ComboBox[]result=cb.Parent.Controls.Find(Name,false).OfType().ToArray();
另外,如果您确定所有返回的元素都是
组合框的类型,您还可以使用
Cast()
而不是
of type()


当所有元素都是同一类型时,您可以使用
Cast
,当某些元素可能是
K
类型,但您只需要
T
类型的元素时,您可以使用
类型的

非常感谢!因此,我的错误是不知道将某个类型转换为某个类型并不代表方法将返回的类型rn?当您尝试将
SomeValue转换为SomeType
时,只有当
SomeValue
确实属于
SomeType
类型时,转换才会成功。您的错误是,您希望转换可以将
控件[]
转换为
组合框[]
。包含某些组合框的控件数组不是
组合框[]类型
。要将其转换为组合框列表,如果您知道所有元素的类型都是
ComboBox
,则可以使用
Cast()
如果元素可能还包含一些其他控件,则可以使用
OfType()
将结果仅限于组合框。