向listbox控件里添加字符时,listbox已有的字符会闪烁。

问题描述

用C#的listbox控件,显示串口收到的数据,收到一个包就显示为一行,包的大小不超过10个字节。串口接收放在0.1秒定时器里,读到完整的包后,就送到listbox里去显示。(现在下位机1秒发一次)现在现象是:串口每收到一个包显示时,listbox里已有的数据就会闪一次。如果在界面上用按键测试,每按一次按键就在listbox里添加一行数据,这样操作不会导致listbox闪烁。各位帮忙分析分析,这是什么原因呀?

解决方案

解决方案二:
你是每次添加一行呢,还是从头到尾添加一遍呢
解决方案三:
引用1楼bdmh的回复:

你是每次添加一行呢,还是从头到尾添加一遍呢

--------------------------------------------------------------------------------------------每次得到一个包后,使用listBox1.Items.Add(newStr);只增加新的一行。
解决方案四:
自己顶下。少于6个字符。
解决方案五:
那把你代码贴上来看看,是不是哪边有刷新什么的
解决方案六:
你把定时器的间隔设为1s试试
解决方案七:
建议你用绑定数据源的方式,不每次现在数据后刷新下数据即可。
解决方案八:
listbox有没有beginupdate/endupdate?将add放在中间看看。
解决方案九:
如果频繁中断主线程而重复更新UI,应该使用SuspendLayout和ResumeLayout。
解决方案十:
其实更好的做法,是不要使用20年就基本未升级的winform,应该使用10年历史的wpf。
解决方案十一:
收到主机的数据就选中显示,收到从机的数据就正常显示。-----------------------------------------------------------------------------------------------------usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.IO.Ports;//uartusingSystem.Collections;//ArrayListnamespace串口测试{publicpartialclassForm1:Form{SerialPortUartPort=newSerialPort();publicList<byte>uartRevBuf=newList<byte>(100);ArrayListcolorMapBuf=newArrayList();string[]strBuf={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};boolUartInBufReading=false;privateColorRowBackColorAlt=Color.FromArgb(200,200,200);//交替色privateColorRowBackColorSel=Color.FromArgb(0,255,0);//选择项目颜色(R,G,B)publicForm1(){InitializeComponent();//listBox重画,不用系统自带listBox1.DrawMode=DrawMode.OwnerDrawFixed;this.listBox1.DrawItem+=newSystem.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);}privatevoidlistBox1_DrawItem(objectsender,DrawItemEventArgse){BrushmyBrush=Brushes.Black;//listBox的index必须与colorMapBuf的Index对应。if((e.State&DrawItemState.Selected)==DrawItemState.Selected){myBrush=newSolidBrush(RowBackColorSel);}elseif(colorMapBuf[e.Index].ToString()=="1"){myBrush=newSolidBrush(RowBackColorAlt);}else{myBrush=newSolidBrush(Color.White);}e.Graphics.FillRectangle(myBrush,e.Bounds);e.DrawFocusRectangle();//焦点框//文本e.Graphics.DrawString(listBox1.Items[e.Index].ToString(),e.Font,Brushes.Black,e.Bounds,StringFormat.GenericDefault);}privatevoidForm1_Load(objectsender,EventArgse){cbBandRate.SelectedIndex=3;cbDataBit.SelectedIndex=0;cbParity.SelectedIndex=0;cbStopBit.SelectedIndex=0;List<string>s12=newList<string>(1);//匹配出COM端口string[]s1=SearchDeviceNameClass.MulGetHardwareInfo(SearchDeviceNameClass.HardwareEnum.Win32_PnPEntity,"Name");string[]s2=SerialPort.GetPortNames();intuartIsNull=0;if(s1!=null){s12.AddRange(s1);}else{if(s2!=null){if(s2.Length!=0){s12.AddRange(s2);}else{uartIsNull=1;}}else//都为空{uartIsNull=1;}}if(uartIsNull==0)//有uart{foreach(stringttins12){cbUartName.Items.Add(tt);}}else{cbUartName.Items.Add("本计算机没有串口!");this.tabPage2.Parent=null;//隐藏串口配置页//this.tabPage2.Parent=this.tabControl1;//显示串口配置页btnOnOff.Enabled=false;}cbUartName.SelectedIndex=0;//默认显示第一个item}privatevoidbutton1_Click(objectsender,EventArgse){if(!UartPort.IsOpen)//当前串口为关闭,准备打开。{try{//设置串口号string[]strbuf=cbUartName.SelectedItem.ToString().Trim().Split('(',')');inti=0;for(i=0;i<strbuf.Length;i++){if(strbuf[i].Contains("COM")||strbuf[i].Contains("com"))break;}UartPort.PortName=strbuf[i];//配置串口参数UartPort.BaudRate=Convert.ToInt32(cbBandRate.SelectedItem);UartPort.DataBits=Convert.ToInt32(cbDataBit.SelectedItem);switch(cbParity.SelectedItem.ToString()){case"无":UartPort.Parity=Parity.None;break;case"奇校验":UartPort.Parity=Parity.Odd;break;case"偶校验":UartPort.Parity=Parity.Even;break;default:MessageBox.Show("Error:参数不正确!","Error");break;}switch(cbStopBit.SelectedItem.ToString()){case"1":UartPort.StopBits=StopBits.One;break;case"2":UartPort.StopBits=StopBits.Two;break;default:MessageBox.Show("Error:参数不正确!","Error");break;}uartRevBuf.Clear();UartPort.Open();UartPort.DiscardInBuffer();//清空串口输入buffer。btnOnOff.Text="关闭串口";cbUartName.Enabled=false;cbBandRate.Enabled=false;cbDataBit.Enabled=false;cbParity.Enabled=false;cbStopBit.Enabled=false;timer1.Enabled=true;//激活定时器}catch(System.Exceptionex){MessageBox.Show("Error:"+ex.Message,"Error");}}else//当前是开,准备关闭。{while(UartInBufReading);timer1.Enabled=false;UartPort.DiscardInBuffer();UartPort.Close();btnOnOff.Text="打开串口";cbUartName.Enabled=true;cbBandRate.Enabled=true;cbDataBit.Enabled=true;cbParity.Enabled=true;cbStopBit.Enabled=true;}}//定时器100ms中断,用于接收uart内容并处理。privatevoidtimer1_Tick(objectsender,EventArgse){UartInBufReading=true;intuartRevLength=UartPort.BytesToRead;if(uartRevLength!=0)//至少接收到一个字节{byte[]uartRevTmpBuf=newbyte[uartRevLength];//创建串口接收临时数组UartPort.Read(uartRevTmpBuf,0,uartRevLength);//读串口接收数据到数组里UartInBufReading=false;uartRevBuf.AddRange(uartRevTmpBuf);ProcessUartRevData();}UartInBufReading=false;}publicvoidProcessUartRevData()//处理完全部合规的包{while(true){intindexAA=uartRevBuf.IndexOf(0xAA);if(indexAA==-1){return;}if(indexAA==0){uartRevBuf.RemoveAt(0);return;}//没找到包的起始,此元素作废。if(uartRevBuf[indexAA-1]!=0xF0&&uartRevBuf[indexAA-1]!=0x0F){uartRevBuf.RemoveAt(indexAA);return;}//移除不合适的数据,(index=0,个数)if(indexAA>1){uartRevBuf.RemoveRange(0,(indexAA-1));}if((uartRevBuf[0]==0xF0||uartRevBuf[0]==0x0F)&&uartRevBuf[1]==0xAA){if(uartRevBuf.Count<4){return;}elseif(uartRevBuf[2]>uartRevBuf.Count-2){return;}else{//intcopyLenght=uartRevBuf[3];intcopyCnt=1;stringstrTmp=string.Empty;bytetmpp=0;do{tmpp=uartRevBuf[copyCnt++];strTmp+=strBuf[tmpp>>4]+strBuf[tmpp&0x0F]+"";}while(copyCnt<uartRevBuf[2]+2);if(uartRevBuf[0]==0xF0){colorMapBuf.Add(1);}//来自主机else{colorMapBuf.Add(0);}//来自从机listBox1.Items.Add(strTmp);//送出字符串uartRevBuf.RemoveRange(0,copyCnt);}}}}privatevoidbutton2_Click(objectsender,EventArgse){listBox1.Items.Clear();colorMapBuf.Clear();}privatevoidcbUartName_MouseClick(objectsender,MouseEventArgse){//点击comboBox的显示区就产生下拉条。cbUartName.DroppedDown=true;}privatevoidbutton4_Click(objectsender,EventArgse){listBox1.Items.Add("第xxxxxxxxxx");colorMapBuf.Add(0);}privatevoidbutton3_Click(objectsender,EventArgse){listBox1.Items.Add("第xxxxxxxxxx");colorMapBuf.Add(1);}}}
解决方案十二:
引用7楼ggw的回复:

listbox有没有beginupdate/endupdate?将add放在中间看看。

这个试过,没有改善。
解决方案十三:
引用6楼liuwei1128的回复:

建议你用绑定数据源的方式,不每次现在数据后刷新下数据即可。

可否详细说一下?

时间: 2024-11-01 19:14:45

向listbox控件里添加字符时,listbox已有的字符会闪烁。的相关文章

给Repeater控件里添加序号的5种才常见方法介绍_实用技巧

.net是目前非常热门的一种程序编译语言,在.net培训中的众多知识点中,给Repeater控件里添加序号的5种方法是非常重要的一个.下面就由达内的老师为大家介绍一下这方面的内容. Repeater是我们经常用的一个显示数据集的数据控件,经常我们希望在数据前显示数据的序号,那么我们该怎么为Repeater控件添加序号呢?下面编辑为大家介绍几种常用的为Repeater控件添加序号的方法: 方法一: 利用Container.ItemIndex属性,代码如下: 复制代码 代码如下: <Itemtemp

listbox控件如何添加小图标

问题描述 想在listbox里显示系统运行的信息,包括小图标和文字显示,怎么办? 解决方案 解决方案二:DrawItem的时候自己画参考http://www.codeproject.com/KB/combobox/glistbox.aspx解决方案三:谢谢呵,看一下~~解决方案四:引用1楼lovefootball的回复: DrawItem的时候自己画参考http://www.codeproject.com/KB/combobox/glistbox.aspx 解决方案五:不错,看了,学习了,会了,

可多选的ListBox控件如何套在DateGrid里编辑时显示并绑定多选后的值?

问题描述 现在我已经把ListBox控件放在DateGrid的EditItemTemplate里了,按编辑即可以绑定并显示出来,但是值无法指定上,因为我想把多个值3,4,5这种依次查找如果匹配则选择上相应的项,不知道该怎么办<EditItemTemplate><asp:ListBoxid=ListBox1runat="server"DataTextField="kname"DataSource="<%#showdeptList()%

ListBox控件添加数据慢

问题描述 winform开发,用listbox控件添加4000多条数据时,加载界面速度比较慢,要一次性加载,如何解决?目前是用for循环一条条添加,如:for(inti=0;i<4000;i++){ListBox1.Items.Add(XX);} 解决方案 本帖最后由 sven168 于 2015-09-05 20:27:43 编辑解决方案二:是否可以考虑通过线程加载listbox,这样不会导致主画面卡解决方案三:用virtualmodehttp://www.cnblogs.com/hcfala

为.net中的ListBox控件添加双击事件

控件 我在用dotnet做一个项目的过程中,遇到了一个ListBox的问题:通过在一个ListBox中双击,把选中的项添加到另一个ListBox中,但ListBox控件本身并没有该事件,那么如何实现呢?我就想到了客户端脚本javascrit,通过查阅相关资料,终于把这个问题解决了,现在写出来与大家分享,希望能对大家有所帮助.        这里有三个问题:        第一:双击所要执行的javascript代码是什么?                    注意:javascript代码的语

VB有没有列表条的控件,或者说把listbox放在toolbar里

问题描述 VB有没有列表条的控件,或者说把listbox放在toolbar里 VB有没有列表条的控件,我想把一个列表框控件放在工具条控件中,设置在窗口顶部,怎么实现? 解决方案 http://www.softwarehistory.net/h/msdn_VBCON98_CHM/vbconusingtoolbarcontrol.php

android里引入viewflow控件里放置listview控件,滑动过快时listview失去焦点

问题描述 android里引入viewflow控件里放置listview控件,滑动过快时listview失去焦点 我看91助手主UI做的就比较好,我模仿做一个,我在适配器里用来AsyncTask异步加载,加载成功时调用notifyDataSetChanged()更新UI,但效果出来了,就是listview不稳定,容易失去焦点,有没有对滑动标签viewflow比较熟悉的啊,该怎么解决啊? 解决方案 http://zhouzhenren163.blog.163.com/blog/static/654

解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”

很少写WinForm程序第一次使用ListBox控件就遇到了比较恶心的问题.因为我不想手 动绑定ListBox中的Item就使用了DataSource,但是当我进行一些添加.删除操作时就报 了这个错"设置DataSource属性后无法修改项集合".实在太恶心了,不知道 设计ListBox的人是怎么想的给了DataSource属性却不能随便更改,而我要实现在一个 ListBox中选中几项然后放到另一个ListBox中的功能,不能用DataSource的话太麻烦了. 上博客园查了下没有找到

vb.net的ListBox控件

ListBox(列表框)控件可以显示一组项目的列表,用户可以根据需要从中选择一个或多个选项.列表框可以为用户提供所有选项的列表.虽然也可设置列表框为多列列表的形式,但在缺省时列表框单列垂直显示所有的选项,如果项目数目超过了列表框可显示的数目,控件上将自动出现滚动条.这时用户可在列表中上.下.左.右滚动.ListBox控件在工具箱中的图标如图所示: 1.click和Double-click事件 对于列表框的事件,特别是当列表框参与触发应用程序的某一部分功能时,可以添加一个Button控件,并把该按