这是怎么抛出InvalidCastException的

Wjd*_*is5 1 .net c# anonymous-methods

以下代码片段在foreach循环上抛出InvalidCastException:

无法将类型为"System.Windows.Forms.StatusStrip"的对象强制转换为"System.Windows.Forms.GroupBox".

我只是不明白这是怎么可能的......然后我又是一个菜鸟所以它可能是愚蠢的东西.

     private void doSlide(GroupBox MoveThis)
    {
        //location 12,27
        var t = Task.Factory.StartNew(() =>
            {
                ExecuteSecure(() =>
                    {
                            foreach (GroupBox box in this.Controls)
                            {
                                if (box != MoveThis)
                                {
                                    box.Left = (-1) * box.Width;
                                }
                                else
                                {
                                    do
                                    {
                                        if (box.Left > 12)
                                            box.Left--;
                                        else
                                            box.Left++;
                                    }
                                    while (box.Left != 12);
                                }
                            }

                    });
            });
    }
Run Code Online (Sandbox Code Playgroud)

这是Execute Secure的代码

private void ExecuteSecure(Action a)
        {
            if (InvokeRequired)
                BeginInvoke(a);
            else a();
        }
Run Code Online (Sandbox Code Playgroud)

基本上我有一个固定大小的表单和表单上的几个组框,其中只有一个在任何给定点可见.当我们需要创建一个新的GroupBox时,我们调用DoSlide(GroupBox)并指定我们想要显示的组框.然后它应该将窗体上的每个GroupBox移动到位置(-Box.Width,27),除了指定的窗体(滑动(递增或递减box.left)到视图中).

Joh*_*aft 11

你想用

this.Controls.OfType<GroupBox>()
Run Code Online (Sandbox Code Playgroud)

在你的foreach.This.Controls返回所有控件,而不仅仅是GroupBoxes.该OfType<T>扩展方法过滤收集到您指定的类型.