| |
VB.NET - Ein- und UmsteigerListView sortieren nach SubItem - Inhalt | | | Autor: Dirk.B | Datum: 08.10.12 16:35 |
| Hallo zusammén!
Ich bin dabei von VBA/VB6 auf VB.Net umzusteigen.
Da scheint es ja doch so einige Unterschiede zu geben.
Um das mal vergleichen zu können, bin ich gerde dabei eins meiner VBA Programme
auf VB.Net zu schreiben.
In dem benötige ich ein LiestView um Daten aus einer SQL - Datenbank zu übernehmen.
Das ListView wird auch befüllt, so weit so gut.
Nun möchte ich das ListView sortieren nach den Eintragungen aus der Spalte 15.
Unter VBA war das ein 5 - zeiler.
With ListView1
.Sorted = True
.SortKey = 15
.SortOrder = lvwDescending
End With Kann mir da jemand sagen, wie das unter VB.Net funktioniert?
Mit dem, was ich bislang im Forum bzw. im WWW gefunden habe komme ich noch nicht klar.
Auch die Gestalltung des ListViews an sich mit Icons und unterschiedlichen Zeilenfarben
find ich frecht aufwendig, zumindest dass was ich dazu gefunden habe.
ist das so ok, oder könnte man dass auch noch anders schreiben.
Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As _
System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles _
ListView1.DrawColumnHeader
e.DrawDefault = True
End Sub
Private Sub ListView1_DrawItem(ByVal sender As Object, ByVal e As _
System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem
Dim flags As TextFormatFlags = TextFormatFlags.Left
If Not (e.State And ListViewItemStates.Selected) = 0 Then
e.Graphics.FillRectangle(Brushes.GreenYellow, e.Bounds)
e.DrawFocusRectangle()
Else
With ListView1.Items
If .IndexOf(e.Item) Mod 2 = 0 Then
e.Graphics.FillRectangle(Brushes.White, e.Bounds)
Else
e.Graphics.FillRectangle(Brushes.Beige, e.Bounds)
End If
End With
e.DrawText(flags)
End If
If Not Me.ListView1.View = View.Details Then
e.DrawText(flags)
End If
End Sub
Private Sub ListView1_DrawSubItem(ByVal sender As Object, ByVal e As _
System.Windows.Forms.DrawListViewSubItemEventArgs) Handles _
ListView1.DrawSubItem
Dim flags As TextFormatFlags = TextFormatFlags.HorizontalCenter
Dim flags1 As TextFormatFlags = TextFormatFlags.SingleLine
If e.ColumnIndex = 0 Then
If ListView1.Items(e.ItemIndex).SubItems(15).Text.Length > 0 Then
e.Graphics.DrawImage(Me.ImageList1.Images(20), New Point( _
e.Bounds.X, e.Bounds.Y))
Else
e.DrawText(flags)
End If
ElseIf e.ColumnIndex = 1 Then
If ListView1.Items(e.ItemIndex).SubItems(16).Text.Length > 0 Then
e.Graphics.DrawImage(Me.ImageList1.Images(19), New Point( _
e.Bounds.X, e.Bounds.Y))
Else
e.DrawText(flags)
End If
ElseIf e.ColumnIndex = 2 Then
If ListView1.Items(e.ItemIndex).SubItems(15).Text.Length > 0 Then
e.Graphics.DrawImage(Me.ImageList1.Images(0), New Point( _
e.Bounds.X, e.Bounds.Y))
Else
e.DrawText(flags)
End If
Else
e.DrawText(flags1)
End If
End Sub VG
Dirk | |
Re: ListView sortieren nach SubItem - Inhalt | | | Autor: Dirk.B | Datum: 09.10.12 15:04 |
| Hallo zusammen!
Vielen Dank für die Infos.
Ich habe nun so einiges in diese Richtung ausprobiert, aber ohne Erfolg.
Mir geht es bei der Sortierung um folgendes:
- laden von Datenbankinformationen in das ListView
- Sortierung nach Spalte (15) DWG - Pfad
- alle Zeilen mit einem Stringinhalt (N:/...) sollen nach oben verschoben werden
Nach dem befüllen des ListView soll automatisch nach der Spalte (15) sortiert werden, ohne das
ich auf den Spaltenkopf (15) klicken muß.
'per ButtonClick die Infos aus der Datenbank laden
Private Sub cmdDBLoad_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles _
cmdDBLoad.Click
'...
'...
Dim da As New SqlDataAdapter(SQL, conn)
Dim cmdB As New SqlCommandBuilder(da)
Dim ds As New DataSet()
'--ListView / Grundeinstellungen-------------
With ListView1
.Columns.Clear()
.Items.Clear()
.FullRowSelect = True
.View = View.Details
.LabelEdit = True
.AllowColumnReorder = True
.GridLines = True
.Sorting = Forms.SortOrder.None
.OwnerDraw = True
End With
With ListView1.Columns
.Add("DWG", 20) '(00)DWG / Zeichnung vorhanden
.Add("PDF", 20) '(01)PDF / Dokument vorhanden
.Add("Prüfung", 20) '(02)Prüfung / Ok - Nein
'...
.Add("Einheit", 30) '(14)Bestelleinheit
.Add("DWG - Pfad", 150) '(15)DWG - Verzeichnis
.Add("PDF - Pfad", 150) '(16)PDF - Verzeichnis
'...
End With
Try
conn.Open()
da.Fill(ds, "Tabellenname")
conn.Close()
Dim dt As DataTable = ds.Tables("Tabellenname")
Dim dr As DataRow
For Each dr In dt.Rows
Dim LItem As ListViewItem = ListView1.Items.Add("") '(00)DWG /
' Zeichnung vorhanden
LItem.SubItems.Add("").ToString() '(01)PDF /
' Dokument vorhanden
LItem.SubItems.Add("").ToString() '(02)Prüfung /
' Ok - Nein
LItem.SubItems.Add(dr("PD_NUM").ToString()) '(
' 03)Artikelnummer Hoffmann
'...
LItem.SubItems.Add(dr("M_Best_Einheit_ID").ToString()) '(
' 14)Bestelleinheit
LItem.SubItems.Add(dr("M_ZNAME_PLINE").ToString()) '(15)DWG -
' Verzeichnis
LItem.SubItems.Add(dr("M_ZEICHNUNGSNAME").ToString()) '(16)PDF -
' Verzeichnis
'...
Next
Catch ex As Exception
MsgBox(ex.Message)
Return
Finally
'reader.Close()
'con.Close()
End Try
AddHandler Me.ListView1.ColumnClick, AddressOf ColumnClick
End Sub ... dann habe ich diesen - ColumnClick event handler - angelegt.
Private Sub ColumnClick(ByVal o As Object, ByVal e As ColumnClickEventArgs)
Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column)
End Sub ... und diese separate Class.
Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Collections
Class ListViewItemComparer
Implements IComparer
Private col As Integer
Public Sub New()
col = 0
End Sub
Public Sub New(ByVal column As Integer)
col = column
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements IComparer.Compare
Return [String].Compare(CType(x, ListViewItem).SubItems(col).Text, _
CType(y, ListViewItem).SubItems(col).Text)
End Function
End Class Wie schon gesagt, klick ich nach dem befüllen des ListView auf die Spalte (15), so wird nach unten hin sortiert.
Wie bekomme ich es nun hin, dass diese Sortierung automatisch nach dem befüllen des ListView passiert?
Vielen Dank im voraus.
VG
Dirk | |
Re: ListView sortieren nach SubItem - Inhalt | | | Autor: Dirk.B | Datum: 19.10.12 12:38 |
| Hallo zusammen!
Als Umsteiger bzw. Anfänger benötige ich eure Hilfe.
Ich hab mal das mit dem DataGridView aufgenommen und so einiges probiert.
Das DataGridView mit Daten aus einer Datenbank zu füllen habe ich nun hinbekommen.
Hier die Code - Auszüge:
'#####--Spaltenköpfe füllen------------------------------------
'#####--diese kann man sicherlich auch eleganter machen ???????
With DataGridView1
.ColumnHeadersHeightSizeMode = _
DataGridViewColumnHeadersHeightSizeMode.DisableResizing
.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Sunken
.ColumnHeadersHeight = 22
.RowHeadersVisible = False
.DefaultCellStyle.WrapMode = DataGridViewTriState.False
.RowsDefaultCellStyle.BackColor = Drawing.Color.White
.AlternatingRowsDefaultCellStyle.BackColor = Drawing.Color.Beige
.Columns.Add("0", "DWG")
.Columns(0).Width = 15
.Columns.Add("1", "PDF")
.Columns(1).Width = 15
.Columns.Add("2", "Prüfung")
.Columns(2).Width = 15
.Columns.Add("3", "Artikelnummer Hoffmann")
.Columns(3).Width = 150
.Columns(3).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleLeft
'....
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.MultiSelect = False
End With Hier die Datenübernajme aus der Datenbank:
For Each dr In dt.Rows
DataGridView1.Rows.Add("", "", "", dr("PD_NUM").ToString(), _
dr("MS_SORTIERUNG").ToString(), _
dr("M_Bestelltext").ToString(), _
dr("M_Breite").ToString(), _
dr("M_Dicke").ToString(), _
dr("M_WANDUNG").ToString(), _
dr("M_Laenge").ToString(), _
dr("M_LIEF_PD_NUM").ToString(), _
'....
Next
'#####--mit dieser Schleife wollte ich den ersten 3 Cellen Bilder zuorden---
'#####--wenn die Cellen (15) bzw. (16) werte enthalten----------------------
'#####--dieses funktioniert aber nicht--------------------------------------
Dim IntI, intC As Integer
intC = DataGridView1.Rows.Count
For IntI = 0 To intC - 1
Dim CellImage(1) As DataGridViewImageCell
CellImage(0).Value = ImageList1.Images(20)
CellImage(0).ImageLayout = DataGridViewImageCellLayout.Normal
CellImage(1).Value = ImageList1.Images(19)
CellImage(1).ImageLayout = DataGridViewImageCellLayout.Normal
If DataGridView1.Rows(IntI).Cells(15).Value.ToString > 0 Then
DataGridView1.Rows(IntI).Cells(0) = CellImage(0)
End If
If DataGridView1.Rows(IntI).Cells(16).Value.ToString > 0 Then
DataGridView1.Rows(IntI).Cells(1) = CellImage(1)
End If
Next Ferner habe ich versucht, wenn ich eine Zeile anklicke, dann sollen bestimmte
Celleninhalte an bestimmte Formularfelder übergeben werden, dieses funktioniert leider auch nicht.
Private Sub DataGridView1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles DataGridView1.Click
Try
Dim n = DataGridView1.CurrentCellAddress.Y
Dim BildPfad(4) As String
If CB_Datenbank.Checked Then
With Me.DataGridView1
If .Rows(n).Cells(16).Value.ToString > 0 Then
cmdPDF.Visible = True
Else
cmdPDF.Visible = False
End If
Bezeichnung.Text = .Rows(n).Cells(17).Value
TB_Preis.Text = .Rows(n).Cells(12).Value.ToString
BildPfad(1) = .Rows(n).Cells(15).Value.ToString.Replace( _
"D.dwg", "D.wmf")
End With
'.... Es wäre schön, wenn mir als Neuling hierbei jemand helfen könnte.
VG
Dirk | |
Re: ListView sortieren nach SubItem - Inhalt | | | Autor: Dirk.B | Datum: 06.11.12 13:40 |
| Hallo zusammen!
Sorry, dass ich ich erst jetzt wieder melde, aber leider hatte es mich einige Tage
gesundheitlich niedergeschlagen.
Vielen Dank noch mal an euch für die Tipps.
@DaveS
Ich hab mir mal das DataGridView vorgenommen und muß sagen, dass funktioniert super.
Ich möchte ja nach der Stalte 15 sortieren und so gehts:
DataGridView1.Sort(DataGridView1.Columns(15), _
System.ComponentModel.ListSortDirection.Descending) VG
Dirk | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|