c# - 如何制作具有相同行为的不同面板?

标签 c# winforms

你好,我正在制作带面板的 10x10 立方体,当你点击面板 X 次时面板需要改变颜色,但代码太大了,有没有其他方法可以让代码不那么长?

这是我的代码:

int cont1 = 0, cont2 = 0, cont3 = 0, cont4 = 0, cont5 = 0, cont6 = 0, cont7 = 0, cont8 = 0, cont9 = 0, cont10 = 0;

然后是更改颜色的事件(我所有的面板都有相同的代码,但区别在于“cont”和面板名称):

 private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            cont1++;
            if (cont1 <= 5)
            {
                panel1.BackColor = Color.SlateBlue;
            }
            if (cont1 >=5)
            {
                panel1.BackColor = Color.Cyan;
            } 
            if (cont1 >= 10)
            {
                panel1.BackColor = Color.Lime;
            }
            if (cont1 >= 15)
            {
                panel1.BackColor = Color.Yellow;
            }
            if (cont1 >= 20)
            {
                panel1.BackColor = Color.Red;
            } 
        }

//other panel 
private void panel2_MouseClick(object sender, MouseEventArgs e)
        {
            cont2++;
            if (cont2 <= 5)
            {
                panel2.BackColor = Color.SlateBlue;
            }
            if (cont2 >= 5)
            {
                panel2.BackColor = Color.Cyan;
            }
            if (cont2 >= 10)
            {
                panel2.BackColor = Color.Lime;
            }
            if (cont2 >= 15)
            {
                panel2.BackColor = Color.Yellow;
            }
            if (cont2 >= 20)
            {
                panel2.BackColor = Color.Red;
            }
        }

注意:每个面板都会改变颜色,不是同时发生的 实际上使用 4x4,但 10x10 对我来说很大

最佳答案

您实际上不需要创建大量变量,因为您需要跟踪控制状态。您可以利用 control Tags 的存在并减少您编写的代码量。

Be it 1000 x 1000 panels the below method would work flawlessly for your usecase. All you need do is point all target panel mouseClick to it and allow it handle the rest.

private void panel_MouseClick(object sender, MouseEventArgs e)
{
    Control ctrl = sender as Control;

    //get previous value from control tag or start at 0
    int count = ctrl.Tag == null ? 0 : (int)ctrl.Tag;

    //set backcolor of control based on tag number             
    if (count >= 20) ctrl.BackColor = Color.Red;
    else if (count >= 15) ctrl.BackColor = Color.Yellow; 
    else if (count >= 10) ctrl.BackColor = Color.Lime;
    else if (count >= 5)  ctrl.BackColor = Color.Cyan;
    else ctrl.BackColor = Color.SlateBlue; 

   // if (count == xx)
    //{// you may want to reset count after a certain number. Do that here...}

    ctrl.Tag = ++count;
}

关于c# - 如何制作具有相同行为的不同面板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57367360/

相关文章:

c# - 动态创建/加载用户控件只能工作一次!

c# - 在没有 Ajax 的 asp.net 回发后执行 javascript 函数

c# - 异步操作完成,但结果未发送到浏览器

c# - 如何从尚未创建的控件创建事件?

c# - 您如何在不引用数据访问层的情况下使分层解决方案的UI项目解析EF实体

c# - 如何在for循环中保留变量的位数

c# - 如何在 ListView 的图像列表中添加系统图标

c# - 从数据 GridView 当前选定单元格的正下方打开一个弹出窗口

c# - RDP 客户端 - AxHost.InvalidActiveXStateException

c# - 具有多列的 WinForms 组合框 (C#)?