I’m still getting to grips with C Sharp and .NET and I am working on an application to display data being continually read from a USB device. I have all the USB code working and it is receiving the data updates every 5ms. The data consists of a set of sensor values for a number of units, say 50 units with 12 sensors per unit.
Currently I am using a ListBox object to display 50 rows of data. I’m setting the listbox mode to OwnerDrawFixed and my datasource to my data array of objects that represents the data read from the USB device (one object per row of the ListBox) and I’m using the DrawItem event to actually graphically draw each row of the list box as requested by the listbox (I’m doing it this way to enable text colouring, formatting, tidy layout etc).
In order to get the ListBox to refresh the data being displayed I’m calling periodically calling Invalidate to force it to redraw, but this is horrendously slow, and flicker unacceptably even at low frequecies such as 1 second updates never mind getting anywhere near the 5ms refresh of the sensors.
Can anyone suggest a better approach to updating the data on screen, perhaps one where I’m not drawing everything everytime or perhaps a way to tell the ListBox to only redraw a single row perhaps if the data on that row has changed?
I’m not tied to a ListBox in anyway, it’s just my unfamiliarity with the .Net framework – perhaps the best solution might be to render everything to a bitmap and then blit it to the screen in a single action.
I’ve already read a similar question but the suggestions in there didn’t really help…
c# – fast ListBox data update
Any alternative suggestions from experienced .net developers greatly appreciated…
Inherit the ListBox control and enable double-buffering is, I think, your best bet. I don’t know how the ListBox paints but that should reduce flicker.
(If that doesn’t work, a hack is to invalidate only a tiny rectangle on the corner and hope it paints properly. That most likely won’t work with the original set of controls, though.)