C# System.InvalidCastException C

C# System.InvalidCastException C,c#,winforms,C#,Winforms,我设计了一个有面板和标签的表单。 我手工制作了面板的游标属性。 但当我点击面板时,我得到了一个例外: 无法将“System.Windows.Forms.Panel”类型的对象强制转换为“System.Windows.Forms.Label”类型 这是我的代码: 使用制度; 使用系统图; 使用System.Windows.Forms; 名称空间曼库拉 { 公共部分类表单2:表单 { private System.Windows.Forms.Panel[]pan; 私有系统.Windows.Fo

我设计了一个有面板和标签的表单。 我手工制作了面板的游标属性。 但当我点击面板时,我得到了一个例外:

无法将“System.Windows.Forms.Panel”类型的对象强制转换为“System.Windows.Forms.Label”类型

这是我的代码:

使用制度; 使用系统图; 使用System.Windows.Forms; 名称空间曼库拉 { 公共部分类表单2:表单 { private System.Windows.Forms.Panel[]pan; 私有系统.Windows.Forms.Label[]实验室; 图形g; 钢笔=新铅笔颜色。红色; SolidBrush br=新的SolidBrush颜色。红色; 矩形rec=新矩形10,10,30,30; int player1=49; int player2=49; int playerturn=0; 公共表格2 { 初始化组件; label1.Text=0; label2.Text=0; } 公共无效起始名 { 如果radioButton1.Checked==true { playerturn=1; } 其他的 { playerturn=2; } } 私有无效按钮15\u单击对象发送者,事件参数e { 按钮1.已启用=按钮2.已启用=真; button3.Enabled=button4.Enabled=true; button5.Enabled=button6.Enabled=true; button7.Enabled=button8.Enabled=true; button9.Enabled=button10.Enabled=true; button11.Enabled=button12.Enabled=true; button13.Enabled=button14.Enabled=true; panel1.Enabled=panel2.Enabled=true; panel3.Enabled=panel4.Enabled=true; panel5.Enabled=panel6.Enabled=true; panel7.Enabled=panel8.Enabled=true; panel9.Enabled=panel10.Enabled=true; panel11.Enabled=panel12.Enabled=true; panel13.Enabled=panel14.Enabled=true; label1.Text=player1.ToString; label2.Text=player2.ToString; startgame; panel15.Enabled=false; 对于int i=0;i<14;i++ { 平移[i]。单击+=new System.EventHandlerthis.ClickHandler; } } 私有无效ClickHandler对象发送者,事件参数e { Panel temppanel=Panelsender; 标签模板=Labelsender; 如果playerturn==1 { 如果player1==0 { playerturn=2; } 其他的 { player1=player1-1; 如果templab.Text!=7 { g=temppanel.CreateGraphics; g、 DrawRectanglepen,rec; label1.Text=player1.ToString; } } } 其他的 { 如果player2==0 { playerturn=1; } 其他的 { player2=player2-1; 如果templab.Text!=7 { g=temppanel.CreateGraphics; g、 DrawRectanglepen,rec; label2.Text=player2.ToString; } } } } 私有void Form2\u加载对象发送方,事件参数e { pan=新面板[14]{panel1,panel2,panel3,panel4,panel5,panel6,panel7, 小组8、小组9、小组10、小组11、小组12、小组13、小组14 }; lab=新标签[14]{lab1,lab2,lab3,lab4,lab5,lab6,lab7,lab8,lab9,lab10,lab11,lab12,lab13,lab14}; } } }
在事件处理程序中,您有:

Panel temppanel = (Panel)sender;             
Label templab = (Label)sender;

但发送方可以是面板或标签,这就是为什么此强制转换中的一个会失败的原因。

在事件处理程序中,您有:

Panel temppanel = (Panel)sender;             
Label templab = (Label)sender;

但发送方可以是面板或标签,这就是为什么此强制转换中的一个将失败的原因。

您的问题在这一行:

Label templab = (Label)sender;
    Panel temppanel = (Panel)sender;             
    Label templab = (Label)sender;

当您单击面板时,发件人是一个面板,而不是标签,因此您不能将其转换为面板。

您的问题在这一行:

Label templab = (Label)sender;
    Panel temppanel = (Panel)sender;             
    Label templab = (Label)sender;

当您单击面板时,发件人是一个面板,而不是一个标签,因此您不能将其转换为面板。

我认为您的错误是这一行:

Label templab = (Label)sender;
    Panel temppanel = (Panel)sender;             
    Label templab = (Label)sender;
在进行转换之前,您应该检查类型

您可以这样做:

if(sender.GetType() == typeof(Panel))
{
     Panel temppanel = (Panel)sender; 
}
else
{
     Label templab = (Label)sender;
}

无论如何,将同一个处理程序分配给不同类型的对象似乎不是一个好主意。我的建议是为每种类型的控件制作一个处理程序。

我认为您的错误在于这一行:

Label templab = (Label)sender;
    Panel temppanel = (Panel)sender;             
    Label templab = (Label)sender;
在进行转换之前,您应该检查类型

您可以这样做:

if(sender.GetType() == typeof(Panel))
{
     Panel temppanel = (Panel)sender; 
}
else
{
     Label templab = (Label)sender;
}
无论如何,将同一个处理程序分配给不同类型的对象似乎不是一个好主意。我的建议是为每种类型的控件制作一个处理程序。

谢谢。我怎样才能找到你
se面板和标签?谢谢。如何使用面板和标签?谢谢。我可以同时使用面板和标签吗?根据上面的代码,您可以这样做。你也可以使用IF。。。否则,如果条件,以确保它只会铸造标签和面板。非常感谢你们。你们明白了。谢谢。我可以同时使用面板和标签吗?根据上面的代码,您可以这样做。你也可以使用IF。。。否则,如果条件,以确保它只会铸造标签和面板。非常感谢你们。你们明白了。谢谢。