Autor Beitrag
bd.cole
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 46

Win XP, Vista
C# (VS 2005)
BeitragVerfasst: Mi 08.08.07 08:47 
Hallo, ich bin noch c# Anfänger und bekomm es nicht hin Text von einem ListView in einen Panel per Drag & Drop zu ziehen. Hat da vielleicht einer eine Lösung oder kann mir Irgendwelche Tips geben. Danke
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 08.08.07 10:41 
Hallo!

Du braucht drei Ereignisse:
(1) Das MouseMove-Ereignis des TreeView
(2) Das DragEnter-Ereignis des Panel
(3) Das DragDrop-Ereignis des Panel

Außerdem muss die AllowDrop-Eigenschaft des Panels auf True gesetzt werden.

Das MouseMove-Ereignis muss folgendes machen:
(1.1) Prüfen, ob eine Maustaste gedrückt ist (geht über den Parameter e).
(1.2) Prüfen, ob ein Node ausgewählt wurde
(1.3) Wenn das alles stimmt, die DoDragDrop-Methode des TreeView aufrufen. Als data-Parameter nimmst Du den selektierten TreeNode, als AllowedEffects-Parameter alles außer None.

Das DragEnter-Ereignis muss folgendes machen:
(2.1) Prüfen, ob die korrekten Daten auf das Panel gezogen werden und nix anderes. Macht man über e.Data.GetDataPresent(typeof(..)).
(2.2) Wenn die Daten den richtigen Typ haben, den e.Effect auf den erlaubten Effect setzen, ansonsten auf None.

Das DragDrop-Ereignis muss folgendes machen:
(3.1) Nochmal schauen, ob's die richtigen Daten sind (wie in (2.1))
(3.2) Wenn dem so ist, die Daten in einen TreeNode casten und die Text-Eigenschaft verarbeiten.

--> Fertig.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bd.cole Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 46

Win XP, Vista
C# (VS 2005)
BeitragVerfasst: Do 09.08.07 09:44 
Gibts nicht irgendwo ein Programm Beispiel für so ein Problem. Drag & Drop ist doch eine Sache die öfter gebraucht wird. Kann ich denn das Element, dass ich aus dem ListView dragge auf einer bestimmten Position auf meinem panel ablegen? Oder brauch ich da ein anderes Element wie einen panel?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 09.08.07 09:48 
user profile iconbd.cole hat folgendes geschrieben:
Gibts nicht irgendwo ein Programm Beispiel für so ein Problem.
Ich habe Dir haarklein geschrieben, was Du tun musst. :roll: Ein bisschen programmieren muss man schon, wenn man programmieren will.

user profile iconbd.cole hat folgendes geschrieben:
Kann ich denn das Element, dass ich aus dem ListView dragge auf einer bestimmten Position auf meinem panel ablegen? Oder brauch ich da ein anderes Element wie einen panel?
Du kannst die Mausposition abfragen und das Panel an der Position erzeugen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bd.cole Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 46

Win XP, Vista
C# (VS 2005)
BeitragVerfasst: Do 09.08.07 09:58 
Hallo Christian, danke schonmal für die Antwort.
Wegen dem dragdrop auf dem Panel nochmal. Also ich habe einen großen panel auf dem ich mehrere elemente aus meinem Listview dropen will, an bestimmten positionen. kann ein panel mehrere bilder an bestimmten positionen aufnehmen oder muss ich immer einen neuen panel an der mausposition erzeugen?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 09.08.07 10:11 
user profile iconbd.cole hat folgendes geschrieben:
kann ein panel mehrere bilder an bestimmten positionen aufnehmen
Ja, kann es. Einfach im Quelltext entsprechend eine PictureBox erzeugen und die Parent-Eigenschaft auf das Panel setzen. So oft Du willst ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bd.cole Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 46

Win XP, Vista
C# (VS 2005)
BeitragVerfasst: Do 09.08.07 13:04 
So habs jetzt ein bisschen anders gemacht. Und zwar mach ich jetzt einen Drag & Drop von meinem ListView in ein DataGrid.
Nur kommt leider ein Fehler: Fehler 1 Der Typ "object" kann nicht implizit in "System.Windows.Forms.ListViewItem" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
    private void listView2_ItemDrag(object Sender, ItemDragEventArgs e) {
        ListViewItem lvItem;
        lvItem = ((ListViewItem)(e.Item));
        string importantData;
        importantData = lvItem.Text;
        DragDropEffects foo;
        foo = listView2.DoDragDrop(e.Item, DragDropEffects.Copy);
        MessageBox.Show(foo.ToString());
    }
    
    private void DataGrid3_DragEnter(object Sender, DragEventArgs e) {
        e.Effect = DragDropEffects.None;
        object o;
        if (e.Data.GetDataPresent(DataFormats.Serializable)) {
            o = e.Data.GetData(DataFormats.Serializable);
            if ((o.GetType() == typeof(ListViewItem))) {
                e.Effect = DragDropEffects.Copy;
            }
        }
    }
    
    private void DataGrid3_DragDrop(object Sender, DragEventArgs e) {
        string message;
        ListViewItem lvItem;
        lvItem = e.Data.GetData(DataFormats.Serializable);
        message = ("The drop text is: " + lvItem.Text);
        MessageBox.Show(message);
    }


kann mir einer den Fehler sagen, den ich gemacht hab? Danke
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 09.08.07 13:15 
Hallo!

Der Fehler ist doch eigentlich selbst erklärend.

Richtig ist, das hatte ich übersehen, das ItemDrag-Event anstatt des MouseMove-Event zu nehmen. Alles andere ist deutlich komplizierter, als ich das geschrieben habe. Insbesondere im ItemDrag-Event reicht eigentlich der Aufruf von DoDragDrop.

Wie kommst Du auf DataFormats.Serializable? Ich hab bei GetDataPresent nicht umsonst das "typeof" mit rein geschrieben ;-) Du musst nur noch überlegen, welcher Type es denn sein soll.


Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bd.cole Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 46

Win XP, Vista
C# (VS 2005)
BeitragVerfasst: Di 14.08.07 08:36 
Danke erstmal Christian für die ganzen Antworten.

Hab das mit dem ListView Text auf Panel hinbekommen. Jetzt wollt ich aus einem ListView nur die jeweils Selektierten Bilder aus der Imaglist draggen. Aber wenn ich das mit DoDragDrop(SelectedItem, DragDropEffects.Copy) usw weiter mach, merkt er schon im DragEnter bei der Typüberprüfungen dass es kein Bild ist. Wie übergebe ich denn nur das Bild? Bei einem Label kann ich ja z.B. DoDragDrop(label.image,....) machen. geht das irgendwie beim ListView auch?