动态生成控件问题

狂彪的蜗牛 2014-04-02 04:13:46
动态生成了81个lable,81个button,button,覆盖lable,都没问题,但是在改变lable的text属性时出现问题了,我改变10个lable的text值,但结果只有一个改变,不晓得是怎么回事,求高人指点


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace saolei
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<Label> lblList = new List<Label>(81);
List<Button> btnList = new List<Button>(81);
private void Form1_Load(object sender, EventArgs e)
{
//初始化
//生成标签并添加到集合
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
Label l1 = new Label();
l1.Size = new Size(20, 20);
l1.Name = "lbl" + i + j;
l1.Text = "空";
Point p1 = new Point(20 * i, 20 * j);
l1.Location = p1;
l1.Visible = false;
//l1.MouseClick += new MouseEventHandler(btnLei_MouseClick);
lblList.Add(l1);
Controls.Add(l1);

}
}
//用按钮挡住雷
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
Button b1 = new Button();
b1.Size = new Size(20, 20);
b1.Name = "button" + i + j;
Point p1 = new Point(20 * i, 20 * j);
b1.Location = p1;
b1.MouseClick += new MouseEventHandler(btnLei_MouseClick);
btnList.Add(b1);
Controls.Add(b1);
}
}
//将10个雷随机放入雷区
for (int i = 0; i < 10; i++)
{
Random rd = new Random();
int k = rd.Next(0, 80);
lblList[k].Visible = true;
lblList[k].Text = "雷";
btnList[k].Visible = false;
}

}
private void btnLei_MouseClick(object sender, EventArgs e)
{

}
}
}

结果如图:
...全文
174 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
没花鹿 2014-04-15
  • 打赏
  • 举报
回复
由于 label 长度问题,重新做了一个,仅供参考:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace SaoLei
{
public partial class Form1 : Form
{
private const int ControlsCount = 9;
private PictureBox[,] pict = new PictureBox[ControlsCount,ControlsCount];
private MyButton[,] btn = new MyButton[ControlsCount, ControlsCount];
private int LocalLift = 10;
private int LocalTop = 10;
private int ControlsSizeX = 20;
private int ControlsSizeY = 20;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
loadControls();
}

private void loadControls()
{
for (int i = 0; i < ControlsCount; i++)
{
for (int j = 0; j < ControlsCount; j++)
{
pict[i, j] = new PictureBox();
pict[i,j].Location = new Point(LocalLift + i * ControlsSizeX + 1, LocalTop + j * ControlsSizeY);
pict[i, j].Width = ControlsSizeX;
pict[i, j].Height = ControlsSizeY;
pict[i, j].Visible = false;
pict[i, j].SizeMode = PictureBoxSizeMode.StretchImage;
this.Controls.Add(pict[i,j]);

btn[i, j] = new MyButton(pict[i, j]);
btn[i, j].Location = new Point(LocalLift + i * ControlsSizeX + 1, LocalTop + j * ControlsSizeY);
btn[i, j].Width = ControlsSizeX;
btn[i, j].Height = ControlsSizeY;
this.Controls.Add(btn[i, j]);
btn[i, j].BringToFront();
}
}
set雷();
}

private void set雷()
{
for (int i = 0; i < ControlsCount; i++)
{
Random rd = new Random(10);
long tick = DateTime.Now.Ticks;
Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
pict[ran.Next(ControlsCount), i].Image = Image.FromFile(string.Format("{0}\\Image\\雷1.jpg", Application.StartupPath));
Thread.Sleep(10);
}
}
}

public class MyButton : Button
{
public MyButton(PictureBox pictureBox)
{
this.Click += (s, e) => { this.Visible = false; };
pictureBox.Visible = true;
}
}
}


PS:系统用图如下:

没花鹿 2014-04-14
  • 打赏
  • 举报
回复
int i 换成 Point p
peng_1111 2014-04-14
  • 打赏
  • 举报
回复
楼主,你的问题是不是由于random导致的,你直接运行的话,程序费时少,cpu时间基本没变,导致random值循环时是一致的,但是你调试的话,费时长,所以就没问题
没花鹿 2014-04-12
  • 打赏
  • 举报
回复
又错了,请把第10楼的 int i 删除掉,没有用
没花鹿 2014-04-12
  • 打赏
  • 举报
回复
伙计,对不住啊,好象给你的代码不能用,现在给你一个改进了的,希望你能看到:

    public class MyButton : Button
    {
        public MyButton(int i)
        {
            this.Click += (s, e) => { this.Visible = false; };
        }        
    }
请: 1.把上面的代码加入到你的代码中。 2.把我给你的代码中的 Button 全部改成 MyButton
assky124 2014-04-10
  • 打赏
  • 举报
回复
Random 生成随机数应该就是查表,一般应该是new的时候生成表,你采用的种子一样,应该是每次生成的表都一样,而你只取第一个,所以值都是一样的。(我猜的) 用Reflector看看Random的代码是怎么写的
狂彪的蜗牛 2014-04-03
  • 打赏
  • 举报
回复
求大神帮忙解释下为什么循环遍历改属性没效果。。
狂彪的蜗牛 2014-04-03
  • 打赏
  • 举报
回复
引用 5 楼 resigner 的回复:

private int ControlsCount = 9;
private Button[,] btn = new Button[ControlsCount, ControlsCount];
private Label[,] lab = new Label[ControlsCount, ControlsCount];
private int LocalLift = 10;//你自己改之
private int LocalTop = 10;//你自己改之
private int ControlsSizeX = 20;//你自己改之
private int ControlsSizeY = 20;//你自己改之

private Timer timer = new Timer();

private void loadControls()
{
    for(int i=0;i<ControlsCount;i++)
    {
        for(int j=0;j<ControlsCount;j++)
        {

            lab[i, j] = new Label();
            lab[i, j].Location = new Point(LocalLift + i*ControlsSizeX, LocalTop + i*ControlsSizeY);//你自己改之
            lab[i, j].Text = "";

            btn[i, j] = new Button();
            btn[i, j].Location = new Point(LocalLift + i*ControlsSizeX, LocalTop + i*ControlsSizeY);//你自己改之            
            btn[i, j].Width = ControlsSizeX;
            btn[i, j].Height = ControlsSizeY;
            btn[i, j].Tag = 0;//赋初值

            this.Controls.Add(lab[i, j]);
            this.Controls.Add(btn[i, j]);
            btn[i, j].Click += (s, e) =>{btn[i, j].Visible = false;};//点该按钮时该按钮隐藏,露出 label.txt, 这样能保证每一个按钮都是可点击的
        }
    }

    set雷();
}

private void set雷()
{
    for(int i=0;i<ControlsCount;i++)
    {
        for(int j=0;j<ControlsCount;j++)
        {
            int iSeed = 10;
            Random rd = new Random(10);
            long tick = DateTime.Now.Ticks;
            Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> 32));
            lab[ran.Next(ControlsCount), j].Text = "雷";
        }
    }
}
以上代码没试过。。。
学习代码,膜拜中
狂彪的蜗牛 2014-04-03
  • 打赏
  • 举报
回复
引用 4 楼 assky124 的回复:
Random rd = new Random(); 放到循环外
有什么区别吗?
没花鹿 2014-04-03
  • 打赏
  • 举报
回复

private int ControlsCount = 9;
private Button[,] btn = new Button[ControlsCount, ControlsCount];
private Label[,] lab = new Label[ControlsCount, ControlsCount];
private int LocalLift = 10;//你自己改之
private int LocalTop = 10;//你自己改之
private int ControlsSizeX = 20;//你自己改之
private int ControlsSizeY = 20;//你自己改之

private Timer timer = new Timer();

private void loadControls()
{
    for(int i=0;i<ControlsCount;i++)
    {
        for(int j=0;j<ControlsCount;j++)
        {

            lab[i, j] = new Label();
            lab[i, j].Location = new Point(LocalLift + i*ControlsSizeX, LocalTop + i*ControlsSizeY);//你自己改之
            lab[i, j].Text = "";

            btn[i, j] = new Button();
            btn[i, j].Location = new Point(LocalLift + i*ControlsSizeX, LocalTop + i*ControlsSizeY);//你自己改之            
            btn[i, j].Width = ControlsSizeX;
            btn[i, j].Height = ControlsSizeY;
            btn[i, j].Tag = 0;//赋初值

            this.Controls.Add(lab[i, j]);
            this.Controls.Add(btn[i, j]);
            btn[i, j].Click += (s, e) =>{btn[i, j].Visible = false;};//点该按钮时该按钮隐藏,露出 label.txt, 这样能保证每一个按钮都是可点击的
        }
    }

    set雷();
}

private void set雷()
{
    for(int i=0;i<ControlsCount;i++)
    {
        for(int j=0;j<ControlsCount;j++)
        {
            int iSeed = 10;
            Random rd = new Random(10);
            long tick = DateTime.Now.Ticks;
            Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> 32));
            lab[ran.Next(ControlsCount), j].Text = "雷";
        }
    }
}
以上代码没试过。。。
assky124 2014-04-03
  • 打赏
  • 举报
回复
Random rd = new Random(); 放到循环外
狂彪的蜗牛 2014-04-03
  • 打赏
  • 举报
回复
楼上说的那种情况几乎没有出现过,我调试时最多重复3个数.关键是我循环改变控件的值失败,只能一项一项的改变,如下

 Random rd = new Random();
            int k1 = rd.Next(0, 80);
            int k2 = rd.Next(0, 80);
            int k3 = rd.Next(0, 80);
            int k4 = rd.Next(0, 80);
            int k5 = rd.Next(0, 80);
            int k6 = rd.Next(0, 80);
            int k7 = rd.Next(0, 80);
            int k8 = rd.Next(0, 80);
            int k9 = rd.Next(0, 80);
            int k10 = rd.Next(0, 80);
            lblList[k1].Text = "*";
            lblList[k1].BackColor = Color.Red;
            lblList[k2].Text = "*";
            lblList[k2].BackColor = Color.Red;
            lblList[k3].Text = "*";
            lblList[k3].BackColor = Color.Red;
            lblList[k4].Text = "*";
            lblList[k4].BackColor = Color.Red;
            lblList[k5].Text = "*";
            lblList[k5].BackColor = Color.Red;
            lblList[k6].Text = "*";
            lblList[k6].BackColor = Color.Red;
            lblList[k7].Text = "*";
            lblList[k7].BackColor = Color.Red;
            lblList[k8].Text = "*";
            lblList[k8].BackColor = Color.Red;
            lblList[k9].Text = "*";
            lblList[k9].BackColor = Color.Red;
            lblList[k10].Text = "*";
            lblList[k10].BackColor = Color.Red;
X_SpringSun 2014-04-02
  • 打赏
  • 举报
回复

Random rd = new Random();
int k = rd.Next(0, 80);
你的这个代码要是运气差,可能生成的是同一个K,然后一直改变的是一个Lable。这个随机分配是不合理的。
狂彪的蜗牛 2014-04-02
  • 打赏
  • 举报
回复
补充一下,我在调试的时候10个lable的text都改变并显示出来,但是运行时就不行了

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧