Reputation: 3515
I would like to populate a listbox with a list of installed printers in VB.net.
This works:
Dim printerList As System.Drawing.Printing.PrinterSettings.StringCollection
printerList = System.Drawing.Printing.PrinterSettings.InstalledPrinters
For Each printerName In printerList
ListBox1.Items.Add(printerName)
Next
This does not work:
ListBox1.Items.AddRange(printerList)
...because of the following type-conversion error:
Public Sub AddRange (value As System.Windows.Forms.ListBox.ObjectCollection)': Value of type 'System.Drawing.Printing.PrinterSettings.StringCollection' cannot be converted to 'System.Windows.Forms.ListBox.ObjectCollection'.
Is it possible to directly cast one to the other for use in AddRange() as shown? Or is the loop the only (or most efficient) way?
Upvotes: 2
Views: 954
Reputation: 36483
Well, you're dealing with 2 collections that were created before the more modern generic lists and enumerables, so their use is less fluid.
In this case, the AddRange
method accepts either another ObjectCollection
instance (not your case), or an array of Object
s. If you want to benefit from the latter, you'll need to transform the StringCollection
instance to an array of Object
s. Here is how this can be done:
ListBox1.Items.AddRange(printerList.Cast(Of Object)().ToArray())
That said, I would stick with your current For Each
loop. It is very readable, and doesn't create an intermediate array. But, I doubt either choice will make much difference, so pick your favorite.
Upvotes: 3