c# - System.InvalidCastException C#

标签 c# winforms

我设计了一个包含面板和标签的表单。 我手工制作了面板的光标属性。 但是当我点击面板时,我得到了这个异常:

Unable to cast object of type 'System.Windows.Forms.Panel' to type 'System.Windows.Forms.Label'

这是我的代码:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Mancula
{

    public partial class Form2 : Form
    {  
        private System.Windows.Forms.Panel[] pan;
        private System.Windows.Forms.Label[] lab;
        Graphics g;
        Pen pen = new Pen(Color.Red);
        SolidBrush br = new SolidBrush(Color.Red);
        Rectangle rec = new Rectangle(10, 10, 30, 30);

        int player1 = 49;
        int player2 = 49;
        int playerturn = 0;

        public Form2()
        {
            InitializeComponent();

            label1.Text = "0";
            label2.Text = "0";

        }

        public void startgame()
        {
            if (radioButton1.Checked == true)
            {
                playerturn = 1;
            }
            else
            {
                playerturn = 2;
            }

        }

        private void button15_Click(object sender, EventArgs e)
        {
            button1.Enabled = button2.Enabled = true;
            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;

            for (int i = 0; i < 14; i++)
            {
                 pan [i].Click += new System.EventHandler(this.ClickHandler);
            }

        }

        private void ClickHandler(object sender, EventArgs e)
        {
            Panel temppanel = (Panel)sender;             
            Label templab = (Label)sender;

            if (playerturn == 1)
            {
                if (player1 == 0)
                {
                    playerturn = 2;
                }
                else
                {
                    player1 = player1 - 1;
                    if (templab.Text != "7")
                    {
                        g = temppanel.CreateGraphics();
                        g.DrawRectangle(pen, rec);
                        label1.Text = player1.ToString();
                    }
                }
            }
            else
            {
                if (player2 == 0)
                {
                    playerturn = 1;
                }
                else
                {
                    player2 = player2 - 1;
                    if (templab.Text != "7")
                    {
                        g = temppanel.CreateGraphics();
                        g.DrawRectangle(pen, rec);
                        label2.Text = player2.ToString();
                    }
                }
            }
        }
        private void Form2_Load(object sender, EventArgs e)
        {
            pan = new Panel[14] { panel1, panel2, panel3, panel4, panel5, panel6,panel7,
                                  panel8,panel9,panel10,panel11,panel12,panel13,panel14
                                };
            lab = new Label[14] { lab1,lab2,lab3,lab4,lab5,lab6,lab7,lab8,lab9,lab10,lab11,lab12,lab13,lab14};

        }
    }
}

最佳答案

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

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

你应该在进行转换之前检查类型。

你可以这样做:

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

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

关于c# - System.InvalidCastException C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41350726/

相关文章:

c# - 按钮的继承

c# - 单击文本框时,如何给它焦点但不更改其中的光标位置

.net - 将自定义属性添加到标准控件

c# - 在 NHibernate 中急切加载子集合和子集合

c# - 避免递归

c# - 使用 LINQ 从字符串中删除字符

c# - 将两个不同的异常处理程序附加到程序中?

C# 带有水平文本的垂直选项卡控件

c# - 单列中新行上的删除和编辑按钮

c++ - 将鼠标悬停在图片框上时,如何显示带有 x-y 坐标的十字线光标?