请问,这种轮询功能如何实现?
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() ,把积压的重绘消息处理掉。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
代码
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自绘
}
------解决方案--------------------