Problem mit Drivelistbox unter NET

19/03/2009 - 08:10 von Thomas Huebner | Report spam
Hi NG,

ich habe mal wieder ein ganz verrücktes Problem. In VB2008 einer Form
über den Designer eine Drivelistbox zugefügt (ohne Code). Zur Laufzeit
gibt ein Klick auf die drivelistbox sofort eine IndexOutOfRangeExeption.
Ist was bekannt das Die Drivelistbox unter .NET nicht geht? Gibt es
Alternativen?

Gruß,
Thomas

Stacktrace:
bei
Microsoft.VisualBasic.Compatibility.VB6.DirDriveDrawing.Draw(Graphics g,
Int32 xLeft, Int32 yTop, Int32 cyHeight, Bitmap WhichBitmap, Int32&
cxWidthDrawn)
bei
Microsoft.VisualBasic.Compatibility.VB6.DriveListBox.OnDrawItem(DrawItemEventArgs
e)
bei System.Windows.Forms.ComboBox.WmReflectDrawItem(Message& m)
bei System.Windows.Forms.ComboBox.WndProc(Message& m)
bei
Microsoft.VisualBasic.Compatibility.VB6.DriveListBox.WndProc(Message& m)
bei
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr
hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef
hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
bei System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr
wparam, IntPtr lparam)
bei System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd,
Message& m)
bei System.Windows.Forms.Control.WmOwnerDraw(Message& m)
 

Lesen sie die antworten

#1 Peter Götz
19/03/2009 - 09:18 | Warnen spam
Hallo Thomas,

ich habe mal wieder ein ganz verrücktes Problem.
In VB2008 einer Form über den Designer eine
Drivelistbox zugefügt (ohne Code).



Im .net-Framework gibt es keine DriveListBox.
Zum Auswàhlen von Laufwerken, Pfaden, Dateien
verwende besser die entsprechenden moderneren
Windows-Dialoge.

Wenns aber unbedingt eine "DriveListBox" sein
soll, dann kannst Du Dir diese mit .net-Mitteln
sehr einfach selber bauen:

' /// Code in einem leeren Formmodul (Form1)
Public Class Form1

Private WithEvents ListBox1 As ListBox

Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

' ListBox erzeugen
ListBox1 = New ListBox
Dim Fmt As String = "#,##0.000"
With ListBox1
.Font = New Font("Arial", 12)
.SetBounds _
(10, 10, _
Me.ClientSize.Width - 20, _
Me.ClientSize.Height - 20)

.Anchor = _
AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom
End With
Me.Controls.Add(ListBox1)


ListBox1.DisplayMember = "Name"

' Listbox mit den DriveInfos aller
' verfügbaren Laufwerke füllen
Dim DI As IO.DriveInfo
For Each DI In IO.DriveInfo.GetDrives
ListBox1.Items.Add(DI)
Next
End Sub

Private Sub ListBox1_SelectedIndexChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles ListBox1.SelectedIndexChanged

If ListBox1.SelectedIndex > -1 Then
' Anzeige des in der Listbox ausgewàhlten Laufwerks

Dim Fmt As String = "#,##0.000"
Dim NL As String = ControlChars.CrLf
Dim Di As IO.DriveInfo
Dim strBuffer As String = ""
Dim Div As Long = 1024 * 1024

Di = DirectCast(ListBox1.SelectedItem, IO.DriveInfo)

strBuffer &= _
Di.Name & " [" & Di.DriveType.ToString & "]"
If Di.IsReady Then
strBuffer &= _
NL & _
" Total Size: " & _
(Di.TotalSize / Div).ToString(Fmt) & _
" MB"

strBuffer &= _
NL & _
"Avail.Free Space: " & _
(Di.AvailableFreeSpace / Div).ToString(Fmt) & _
"MB"
End If
MsgBox(strBuffer, MsgBoxStyle.Information)
End If

End Sub
End Class
' \\\

Nach dem Programmstart auf eines der in der Listbox
angezeigten Laufwerke klicken um Laufwerksname
und Laufwerkstyp in einer MsgBox zu sehen.
Ist das entspr. Laufwerk bereit (DriveInfo.IsReady),
dann bekommst Du auch noch die Gesamtgrösse
und die Grösse des verfügbaren freien Speicherplatzes
für auf diesem Laufwerk. Was Du sonst noch alles geliefert
bekommen kannst, siehst Du in der OH zur
DriveInfo-Klasse (System.IO.DriveInfo )

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen