日期:2014-05-18  浏览次数:20811 次

请问,这种轮询功能如何实现?
private void button26_Click(object sender, EventArgs e)
  {
  listBox1.Items.Add("万万2邻期和尾");
  listBox1.Items.Add("万万3邻期和尾");
  ..
  ..
  .. //加了很多项  

  while(...) //轮询,如果listBox1每一项都自绘之后,就执行里面的代码
  {
  textBox1.Text = "熊俊";
  }
  }
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
  {
  // listBox1自绘
  }


请问,上面的代码, listBox1添加项,会导致自绘,如何轮询,当listBox1每一项都自绘了之后,就执行textBox1.Text = "熊俊";
 


------解决方案--------------------
没必要轮询,直接调用Application.DoEvents()后,自绘就自然完成,之后就可以执行其它方法了。当然,如果你不调用“Application.DoEvents()”,说不定还不肯自绘,先执行其它后续过程。
------解决方案--------------------
对,执行一次Add就自绘一次,如果看不到效果,那只是因为UI线程还得不到响应,必须执行完你的所有代码,你如果插入一行Application.DoEvents()的话,自绘效果就立刻可以看到了。当然,正因为每次调用Add就会自绘,因此为了提高效率,可以屏蔽它频繁的自绘过程,可以在Add方法之前执行listBox1.BeginUpdate();,所有Add方法之后执行listBox1.EndUpdate();,这样添加速度大大提高。
例如你的代码:
C# code
listBox1.BeginUpdate();
listBox1.Items.Add("万万2邻期和尾");
listBox1.Items.Add("万万3邻期和尾");
..
..
.. //加了很多项 
listBox1.EndUpdate();
Application.DoEvents();//此时界面立刻显示所有添加的内容。
textBox1.Text = "熊俊";//自绘之后,就执行里面的代码

------解决方案--------------------
自己做一个listview,继承自系统自带的listview
添加一个属性或者方法来接受item,并且在这个属性或方法在add的时候,触发一个event,这个event在外面执行自绘

这样说
新建一个mylistview控件,继承自listview。
增加一个属性items{get;set}
在set的时候,判断item的数量是增加还是减少,反正就是item变化了,如果变化了数量,那么就触发一个自定义的event,这样就达到了每次新增或者减少item的时候,event会自动触发自绘。
或者增加一个方法,add,用于新增item。在每次调用这个item的时候,方法中就触发event自绘。
------解决方案--------------------
我是没有看太明白你的问题,感觉你是想要在每次新增一个item的时候就自绘
------解决方案--------------------
真要提高效率就 listBox1.Items.AddRange
listBox1.BeginUpdate() 基本没用, Add 不立即执行,我估计它只是发出了要重绘的消息给 ListBox ,想要立即效果就在所有的添加完了后 Application.DoEvents() ,把积压的重绘消息处理掉。
------解决方案--------------------
探讨
引用:

对,执行一次Add就自绘一次,如果看不到效果,那只是因为UI线程还得不到响应,必须执行完你的所有代码,你如果插入一行Application.DoEvents()的话,自绘效果就立刻可以看到了。当然,正因为每次调用Add就会自绘,因此为了提高效率,可以屏蔽它频繁的自绘过程,可以在Add方法之前执行listBox1.BeginUpdate();,所有Add方法之后执行li……

------解决方案--------------------
探讨
引用:

引用:
引用:

对,执行一次Add就自绘一次,如果看不到效果,那只是因为UI线程还得不到响应,必须执行完你的所有代码,你如果插入一行Application.DoEvents()的话,自绘效果就立刻可以看到了。当然,正因为每次调用Add就会自绘,因此为了提高效率,可以屏蔽它频繁的自绘过程,可以在Add方法之前执行listBox1.……

------解决方案--------------------
引用
当运行 Windows 窗体时,它将创建新窗体,然后该窗体等待处理事件。
该窗体在每次处理事件时,均将处理与该事件关联的所有代码。
所有其他事件在队列中等待。
当代码处理事件时,应用程序不会响应。
例如,如果将甲窗口拖到乙窗口之上,则乙窗口不会重新绘制。


如果在代码中调用 DoEvents,则您的应用程序可以处理其他事件。
例如,如果您有向 ListBox 添加数据的窗体,并将 DoEvents 添加到代码中,那么当将另一窗口拖到您的窗体上时,该窗体将重新绘制。
如果从代码中移除 DoEvents,那么在按钮的单击事件处理程序执行结束以前,您的窗体不会重新绘制。

------解决方案--------------------
代码
C# code
private void button26_Click(object sender, EventArgs e)
{
    listBox1.DrawMode = DrawMode.OwnerDrawFixed;
    listBox1.Items.Add("万万2邻期和尾");
    Application.DoEvents();
    textBox1.Text = "熊俊";
}

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    // listBox1自绘
}

------解决方案--------------------