groupBox.Controls.Add(Lb2(a));
timer1(a,Lb2(a));// a是遍历数据库出来的数字 12345678这些 ,然后把生成出来的label标签传过去
private Label Lb1(int a)//根据数据库的数生成一个label标签
{
Label label = new Label();
label.Name = "L" + a;
label.Text = "压力:";
label.Font = new Font("宋体", 14);
label.Location = new System.Drawing.Point(25, 25);
label.Size = new System.Drawing.Size(77, 30);
return label;
}
private Timer timer1(int a,Label b)//根据数据库的数字生成timer
{
Timer timer = new Timer();
timer.Interval = 1000;
timer.Tag = "t" + a;
timer.Enabled = true;
timer.Tick += new EventHandler(labelTxt);//问题在这里,在创建timer.tick的事件中将label参数传过去
return timer;
}
private void labelTxt(object sender, EventArgs e)// 这是tick要运行的事件,如果直接运行是把timer参数传过去的
{
Label label = (Label)sender;
label.Text = label.Name;
}
首先,你这个代码有问题,为什么每次要创建一个定时器来创建一个Label,这不合理啊。其次,因为Tick只能传timer本身,但是a是label的序号啊,并且timer的tag正好是t+a呀,这时候,我们在调用timer之前,先用一个键值对数组存一下a,然后再labelTxt里面,通过把获取sender.Tag然后再把t这个字符拆出去,剩下的就是a了,再通过a这个键获取键值对里面的label就好定了。
说的很明白了,希望你能懂!
已经回复过很多次这类问题了,我都懒得回复了
还是尽义务回回把
我个人认为如果把代码写成这样,并且还卡住了不知道怎么弄了的。
还不如乘着卡住的时间,花3天时间看看js的vue们怎么解决。vue入门很快的1天时间入门,只是vue搭建开发环境稍微麻烦点,需要用2天时间搭环境,做配置。从来没有上手过的能跑起一个hello world需要2天,但搭好后1天入门
为啥会这样呢,因为实际上前端开发方式从已经不是你现在这种代码了,他是mvvm的方式了,操作数据本身,操作逻辑本身才是他们现在的常态,而控制dom根dom较劲件很吃亏的事情
同样你这个东西,就是我们现在winform开发也这样看,我们不根控件较劲。我们只控制数据就好
如果你对此没有概念,我都不说08年的wpf,我们来看看12年左右vue这类东西还没出来的,一个最原始的mvvm js的开发方式
https://knockoutjs.com/
ps:以前我都还不怎么提这些,你们想这么写就这么罢了,反正头疼是自己。但是现在不提都不行,毕竟MaUI,Blazlor都是MVVM的,你要还死抱着根控件较劲的玩法,到时候就很难转向了
1.如果你一定要动态的放label,你可以先建立一个全局变量List<Label>,然后建好的label顺手塞list里,这样再找就方便多了,不用到处去find控件
2.你只需要一个timer,为什么timer里又建timer,你是初学者也好,是老手也好,总是要先弄明白自己想干什么,规划好了再去干,不能先瞎干一气碰碰运气再看效果调整,那成什么了