Benutzer mit den meisten Antworten
Drag/Drop zwischen listviews: Bug?

Frage
-
Moin,
auf der Grundlage von vb-Helper frage ich in der dragdrop-Methode die listviewitems des Ursprungs-Listviews ab: (LVW_DragDrop ist ein sub, für das ich einen handler gesetzt habe für alle .DragDrop-Ereignisse aller meiner listviews.)
Private Sub LVW_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) 'sender ist nun das ziel-listview Dim lvw As ListView = CType(sender, ListView) Dim dragged_items As List(Of ListViewItem) = e.Data.GetData("List(Of " & "ListViewItem)")
Dim li As ListViewItemKlappt alles prima, ich kann mit
For Each li In dragged_items
auf alle Eigenschaften meiner items zugreifen AUßER AUF .name.
Habe es überprüft, im Ausgangs-Listitem ist die .name-Eigenschaft gesetzt.
Ist das ein Bug?
Gibts einen workaround? (Also wie kriege ich die listview-items des drag-from-listviews ansonsten)
Gruß und Dank!
TH- Bearbeitet Migration Sucks Samstag, 9. November 2013 15:25
Antworten
-
Hallo,
die Name Eigenschaft ist bei allen Steuerelementen primär für die Entwurfszeit gedacht[1].
Für "vollwertige" Steuerelemente wird zwar oft von den Designern erzeugt.
Bei ListViewItems - die keine Steuerelemente sind - jedoch nicht und Namen bei ListViewSubItems, die im Editor hinterlegt werden können werden, werden nicht gespeichert. Dort und bei allen Elementen, die zur Laufzeit erzeugt werden, muss man sie immer selbst setzen / erzeugen.
Nachtrag: ListViewItem.Name reflektiert den Wert aus ListViewSubItem(0).Name. Der Wert wird u. a. beim ListViewItem.Clone() nicht übernommen. Wenn man eine "Identifikation" braucht, sollte man eher die Tag-Eigenschaft nutzen, die wird übertragen.
Gruß Elmar
[1] In der Urfassung (.NET 1.0 Beta) gab es gar keine Namen; die kam erst rein, weil sich die Visual Basic Fraktion beschwerte.
- Bearbeitet Elmar BoyeEditor Samstag, 9. November 2013 16:49 Nachtrag
- Als Antwort markiert Migration Sucks Samstag, 9. November 2013 20:07
Alle Antworten
-
Hi
bei mir Funktioniert das.
Dim li As List(Of ListViewItem) = New List(Of ListViewItem)() For Each item As ListViewItem In li Dim Name = item.Name Next
Las mal die erste definition vor der Schleife weg.
Dim li As ListViewItem
Wenn das noch nicht klappt, zeig bitte mal den Quellcode der oben fehlt (fals da welcher ist.)
Ansonsten bitte noch mal die Framework Version angeben. Ich hab es jetzt mit 4.0 ausprobiert.
MFG
Björn
-
Danke Björn.
das was Du schreibst ist glaub ich nicht mein Problem.
Es scheint mir, dass beim Übergeben von
Dim dragged_items As List(Of ListViewItem) = e.Data.GetData("List(Of " & "ListViewItem)")
die .name-Eigenschaft verloren geht.
Framework ist 3.5
Gruß TH
-
Hallo,
die Name Eigenschaft ist bei allen Steuerelementen primär für die Entwurfszeit gedacht[1].
Für "vollwertige" Steuerelemente wird zwar oft von den Designern erzeugt.
Bei ListViewItems - die keine Steuerelemente sind - jedoch nicht und Namen bei ListViewSubItems, die im Editor hinterlegt werden können werden, werden nicht gespeichert. Dort und bei allen Elementen, die zur Laufzeit erzeugt werden, muss man sie immer selbst setzen / erzeugen.
Nachtrag: ListViewItem.Name reflektiert den Wert aus ListViewSubItem(0).Name. Der Wert wird u. a. beim ListViewItem.Clone() nicht übernommen. Wenn man eine "Identifikation" braucht, sollte man eher die Tag-Eigenschaft nutzen, die wird übertragen.
Gruß Elmar
[1] In der Urfassung (.NET 1.0 Beta) gab es gar keine Namen; die kam erst rein, weil sich die Visual Basic Fraktion beschwerte.
- Bearbeitet Elmar BoyeEditor Samstag, 9. November 2013 16:49 Nachtrag
- Als Antwort markiert Migration Sucks Samstag, 9. November 2013 20:07
-
Nachtrag: ListViewItem.Name reflektiert den Wert aus ListViewSubItem(0).Name. Der Wert wird u. a. beim ListViewItem.Clone() nicht übernommen.
Oh, Elmar, das isses!! Habe vorher natürlich das listviewitem geclont, dabei ist der .name verloren gegangen.
Der Vorteil gegenüber .tag ist halt, dass der .name gleichzeitig der .key ist...
Gruß!
TH