昨天刚结贴,今天又接着开新贴

ELement_DG 2010-02-02 01:24:42
id = rand.Next(0,this._bitMap.Length-1);
foreach(Control c in this.Controls)
{
if(c is PictureBox)
{
((PictureBox)c).Image = (Image)this._bitMap[id];
}
if (c is Label)
{
((Label)c).Text = users.Rows[id]["Name"] as string;
}
}

在界面上,图片在快速进行替换,同时名字也在快速替换着 ,但是有个问题,就是图片和名称对应不上,什么问题
...全文
300 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiayp004 2010-02-02
  • 打赏
  • 举报
回复
把Picture和Label做成一个UserControl
songsu 2010-02-02
  • 打赏
  • 举报
回复
哦耶,友情UP,接分。
ckl881003 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 element_dg 的回复:]
引用 44 楼 ckl881003 的回复:
引用 42 楼 element_dg 的回复:
引用 41 楼 strwangfan 的回复:
引用 38 楼 element_dg 的回复:
引用 37 楼 strwangfan 的回复:
你为什么要放50个PictureBox,50个Label呢?
只放一个PictureBox一个Label
然后循环赋不同的值不可以么?


我们头要求界面上必须有50个图片进行同时滚动,还不能相同,然后滚动停止时,抽出50名中奖者
后台有1500张用户照片


那样应该还有pictureBox1和pictureBox2不能重复的问题,你前面那种取法pictureBox1和pictureBox2可能会取到同一个人。


你可以+我QQ吗?  我现在就困在这个问题上,不知道如何解决

其实这个问题也很好解决的,你在滚动的时候就随便显示,最后停的时候取50个不同的随机数,然后分别显示就可以了


我最早是这样写的,但是图片在停止的时候,会顿一下,然后再翻一次,中间会有时间差,你可以试试看,所以我换了一种方法
[/Quote]

顿一下?时间停在哪了?是刷新50张图还是在计算需要哪50张图?如果是计算的话那你就再开始前就算好,然后就滚啊滚得,停的时候直接把最先算好的50张显示就可以了,如果显示会顿一下。。应该不会顿,你的图和文字都在内存里吧
ELement_DG 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 ckl881003 的回复:]
引用 42 楼 element_dg 的回复:
引用 41 楼 strwangfan 的回复:
引用 38 楼 element_dg 的回复:
引用 37 楼 strwangfan 的回复:
你为什么要放50个PictureBox,50个Label呢?
只放一个PictureBox一个Label
然后循环赋不同的值不可以么?


我们头要求界面上必须有50个图片进行同时滚动,还不能相同,然后滚动停止时,抽出50名中奖者
后台有1500张用户照片


那样应该还有pictureBox1和pictureBox2不能重复的问题,你前面那种取法pictureBox1和pictureBox2可能会取到同一个人。


你可以+我QQ吗?  我现在就困在这个问题上,不知道如何解决

其实这个问题也很好解决的,你在滚动的时候就随便显示,最后停的时候取50个不同的随机数,然后分别显示就可以了
[/Quote]

我最早是这样写的,但是图片在停止的时候,会顿一下,然后再翻一次,中间会有时间差,你可以试试看,所以我换了一种方法
-汪帆- 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 element_dg 的回复:]
引用 41 楼 strwangfan 的回复:
引用 38 楼 element_dg 的回复:
引用 37 楼 strwangfan 的回复:
你为什么要放50个PictureBox,50个Label呢?
只放一个PictureBox一个Label
然后循环赋不同的值不可以么?


我们头要求界面上必须有50个图片进行同时滚动,还不能相同,然后滚动停止时,抽出50名中奖者
后台有1500张用户照片


那样应该还有pictureBox1和pictureBox2不能重复的问题,你前面那种取法pictureBox1和pictureBox2可能会取到同一个人。


你可以+我QQ吗?  我现在就困在这个问题上,不知道如何解决
[/Quote]
你可以取完一个,就将它从可取集合中删除,然后再取下一个
ckl881003 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 element_dg 的回复:]
引用 41 楼 strwangfan 的回复:
引用 38 楼 element_dg 的回复:
引用 37 楼 strwangfan 的回复:
你为什么要放50个PictureBox,50个Label呢?
只放一个PictureBox一个Label
然后循环赋不同的值不可以么?


我们头要求界面上必须有50个图片进行同时滚动,还不能相同,然后滚动停止时,抽出50名中奖者
后台有1500张用户照片


那样应该还有pictureBox1和pictureBox2不能重复的问题,你前面那种取法pictureBox1和pictureBox2可能会取到同一个人。


你可以+我QQ吗?  我现在就困在这个问题上,不知道如何解决
[/Quote]
其实这个问题也很好解决的,你在滚动的时候就随便显示,最后停的时候取50个不同的随机数,然后分别显示就可以了
ckl881003 2010-02-02
  • 打赏
  • 举报
回复
问下LZ 你的PICTUREBOX的数量是固定的么?如果是固定的话那应该在IDE里面都放好了吧?既然这样那就把这些东西手动关联起来啊,别懒,代码都一样,就复制粘贴的,再改个数字10分钟都不要就好了,一共也就100个控件
如果不是固定的,那你应该是在程序里直接生成放窗体上,那直接关联不就更简单了。
同样的,你还是得用LIST<T>来存这些东西

顺便支持你的代码的一些问题


id = rand.Next(0,this._bitMap.Length-1); //你先取了个随机的ID值
foreach(Control c in this.Controls) //然后开始遍历所有的控件! 问题!你把50个控件都显示一样的东西干嘛?这里你的ID又没有改变,
{
if(c is PictureBox) //这里,如果是picturebos则改他的图
{
((PictureBox)c).Image = (Image)this._bitMap[id];
}
if (c is Label) //同时,如果上面成立,这里还要判断干嘛? 应改为else if
{
((Label)c).Text = users.Rows[id]["Name"] as string;
}
}



综合一下,我认为应该参照20楼的写法,他已经写的很详细了,如果还有哪里不懂得我在帮你解答
ELement_DG 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 strwangfan 的回复:]
引用 38 楼 element_dg 的回复:
引用 37 楼 strwangfan 的回复:
你为什么要放50个PictureBox,50个Label呢?
只放一个PictureBox一个Label
然后循环赋不同的值不可以么?


我们头要求界面上必须有50个图片进行同时滚动,还不能相同,然后滚动停止时,抽出50名中奖者
后台有1500张用户照片



那样应该还有pictureBox1和pictureBox2不能重复的问题,你前面那种取法pictureBox1和pictureBox2可能会取到同一个人。
[/Quote]

你可以+我QQ吗? 我现在就困在这个问题上,不知道如何解决
-汪帆- 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 element_dg 的回复:]
引用 37 楼 strwangfan 的回复:
你为什么要放50个PictureBox,50个Label呢?
只放一个PictureBox一个Label
然后循环赋不同的值不可以么?


我们头要求界面上必须有50个图片进行同时滚动,还不能相同,然后滚动停止时,抽出50名中奖者
后台有1500张用户照片


[/Quote]
那样应该还有pictureBox1和pictureBox2不能重复的问题,你前面那种取法pictureBox1和pictureBox2可能会取到同一个人。
khjian 2010-02-02
  • 打赏
  • 举报
回复
不太懂,帮你顶啊
sklkitty 2010-02-02
  • 打赏
  • 举报
回复
xuexi ..学习。。
ELement_DG 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 strwangfan 的回复:]
你为什么要放50个PictureBox,50个Label呢?
只放一个PictureBox一个Label
然后循环赋不同的值不可以么?
[/Quote]

我们头要求界面上必须有50个图片进行同时滚动,还不能相同,然后滚动停止时,抽出50名中奖者
后台有1500张用户照片

-汪帆- 2010-02-02
  • 打赏
  • 举报
回复
你为什么要放50个PictureBox,50个Label呢?
只放一个PictureBox一个Label
然后循环赋不同的值不可以么?
ELement_DG 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 exiori 的回复:]
这代码逻辑就不对。
[/Quote]

有没有什么好的建议?
q7q7c 2010-02-02
  • 打赏
  • 举报
回复
看了一下,只有strWangFan的逻辑比较清楚
ELement_DG 2010-02-02
  • 打赏
  • 举报
回复
我在做抽奖系统,一次抽出50个人来,如果不放50个PictureBox 如何让50个照片同时滚动起来?

另外如果用20楼的话
我是不是要写一大段的

A a = new A();
a.PictureBox = this.pictureBox1;
a.Label = this.label1;
list.add(A);

用循环把这句话一直重复?
exiori 2010-02-02
  • 打赏
  • 举报
回复
这代码逻辑就不对。
hhc123 2010-02-02
  • 打赏
  • 举报
回复
从数据库中读出来的吗?
直接拉个DataGridView控件上去不就得了,还这么麻烦看嘛
-汪帆- 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 element_dg 的回复:]
string imgPic = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"img\";
FileInfo[] fis;
DirectoryInfo di;
Bitmap[] _bitMap;
Random rand = new Random();
Bizz bz = new Bizz();
DataTable users;
int id;
 
public Form1()
{
  InitializeComponent();
  users = bz.GetUsers();
  di = new DirectoryInfo(imgPic);
  fis = di.GetFiles();
  this._bitMap = new Bitmap[fis.Length];
  for (int i = 0; i < fis.Length;i++ )
  {
    this._bitMap[i] = new Bitmap(fis[i].FullName);
    this._bitMap[i].Tag = fis[i].Name.Substring(0,fis[i].Name.IndexOf("."));
  }
}

bool isKeyDown = false;
private void timer1_Tick(object sender, EventArgs e)
{
  if(isKeyDown  == false)
  {             
    foreach(Control c in this.Controls)
    {
      id = rand.Next(0, this._bitMap.Length - 1);
      if(c is PictureBox)
      {                       
        ((PictureBox)c).Image = (Image)this._bitMap[id];
      }
      if (c is Label)
      {
        ((Label)c).Text = GetName(Convert.ToInt32(this._bitMap[id].Tag));
      }
                   
    }
  }
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
  isKeyDown = !isKeyDown;               
}

public string GetName(int id)
{
  id--;
  return users.Rows[id]["Name"].ToString();
}
     

我发现
foreach(Control c in this.Controls)
    {
      id = rand.Next(0, this._bitMap.Length - 1);
      if(c is PictureBox)
      {                       
        ((PictureBox)c).Image = (Image)this._bitMap[id];
      }
      if (c is Label)
      {
        ((Label)c).Text = GetName(Convert.ToInt32(this._bitMap[id].Tag));
      }
                   
    }
这样id肯定不一致,照片和人名肯定对不上,可是如果写成这样
foreach(Control c in this.Controls)
    {
      id = rand.Next(0, this._bitMap.Length - 1);
      if(c is PictureBox)
      {                       
        ((PictureBox)c).Image = (Image)this._bitMap[id];
        if (c is Label)
        {
          ((Label)c).Text = GetName(Convert.ToInt32(this._bitMap[id].Tag));
        }
      }                 
    }
这样写也肯定不对,c is PictureBox 如果为真;那么 c is Label 必然为假。 那么Label上面肯定一直是没赋值的,等于是照片还在滚动、停止、滚定、停止这样....  我要达到的效果就是,图片不管滚动不滚动,Label上面都会有相应照片人物的名称
[/Quote]
你这样每次循环都赋一个新的id,id当然是不一致的了。后面那个就不说了,很无语..
建议参照20楼
hhc123 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 element_dg 的回复:]
我的窗体中最多有50个PictureBox  50个Label  我难道要
pictureBox1.Tag = 1
Label1.Tag = 1

....


依次这样写?
[/Quote]
你的程序好大啊,50个pictureBox。
........
加载更多回复(29)

110,571

社区成员

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

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

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