Autor Beitrag
VampireSilence
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109
Erhaltene Danke: 5


C# (VS 2008 Express), PHP/MySQL, Windows XP
BeitragVerfasst: So 12.09.10 15:12 
Hallo zusammen !

Bin gerade mal per Google zu euch gestoßen, da ich ein wirklich merkwürdiges Problem habe, dass ich nicht lösen kann.

Und zwar versuche ich mich gerade an Drag&Drop. Zunächst wollte ich jetzt schauen, an welche Daten ich überhaupt alles komme. Dazu habe ich folgenden Code geschrieben:

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
        private void frmMain_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }

        private void frmMain_DragDrop(object sender, DragEventArgs e)
        {
            string msg = "";
            string[] formats = e.Data.GetFormats(true);

            MessageBox.Show("1");  //  debug

            foreach (string format in formats)
            {
                MessageBox.Show("2");  //  debug

                msg += "\n" + format + ": ";

                MessageBox.Show("3");  //  debug

                string[] Links = (string[])e.Data.GetData(format, true);

                MessageBox.Show("4");  //  debug

                foreach (string Link in Links)
                {
                    msg += Link;
                }

                MessageBox.Show("5");  //  debug
            }

            MessageBox.Show("6");  //  debug

            this.label1.Text = msg;
        }


Zunächst möchte ich die Formate auslesen und dann alle erhaltenen Daten nach Formaten sortiert ausgeben. Man sollte meinen, dass es mit diesem Code funktioniert, aber hier kommen die vielen MessageBoxen ins Spiel: Diese gehören nicht dazu, aber ich musste sie einfügen, da mir die IDE keine Hinweise auf einen Fehler geben konnte. Die Nachrichten 1, 2 und 3 werden korrekt generiert, aber die Nachricht 4 nicht und alles was danach kommt auch nicht. Folglich muss der Code bei der Funktion "string[] Links = (string[])e.Data.GetData(format, true);" abbrechen. Ich frage mich allerdings, warum er das tut, denn weder steht dort ein "return", noch wird auch nur der geringste Fehler ausgegeben, daher habe ich keine Anhaltspunkte, wo ich den Fehler suchen müsste.

Ich stehe vor einem Rätsel, bitte helft mir.

mfg
- VampireSilence
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 12.09.10 20:09 
Setze mal einen try-catch-Block in deine Drag&Drop-Methode. Der Drag&Drop-Mechanismus von .NET unterbindet jedliche Exception, so daß kein Fehler angezeigt wird.
Ich nehme an, daß dein Cast (string[]) falsch ist, da ja je nach Format ein entsprechendes Objekt von GetData() zurückgegeben wird (nicht immer nur string[] !).
VampireSilence Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109
Erhaltene Danke: 5


C# (VS 2008 Express), PHP/MySQL, Windows XP
BeitragVerfasst: So 12.09.10 20:50 
Das ist ja echt mal sehr bescheiden gemacht. Wozu um alles in der Welt unterdrückt man Exceptions ?!

Wie dem auch sei, Folgendes ist schonmal einen Schritt weiter:

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
        private void frmMain_DragDrop(object sender, DragEventArgs e)
        {
            string msg = "";
            this.label1.Text = "";

            string[] formats = e.Data.GetFormats(true);

            MessageBox.Show("1");

            foreach (string format in formats)
            {
                MessageBox.Show("2");

                msg += "\n" + format + ": ";

                MessageBox.Show("3");

                object Links = e.Data.GetData(format, true);

                MessageBox.Show("4");

                foreach (string Link in Links as object[])
                {
                    msg += Link.ToString() + "\n";
                }

                MessageBox.Show("5");
            }

            MessageBox.Show("6");

            this.label1.Text = "Drop !\n" + msg;
        }


Hier kommt der Code bis zur Nachricht 4. Offensichtlich liegt es hier wieder daran, dass ich das erhaltene Object wiederrum als object[] behandeln möchte. Mir ist nun klar, dass dies nicht geht, aber die nächste Frage, die jetzt offen ist, wäre:

Wie komme ich dann an die Daten, wenn nicht als String ?

mfg
- VampireSilence
Necaremus
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: Di 14.09.10 12:58 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
foreach (object o in (object[])Links)
{
    if (o is string)
        msg = (string)o;
}

so mal versucht?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 14.09.10 18:04 
Wenn du den Code im Einzelschrittmodus durchgehst, wird dir dann vielleicht die Exception angezeigt? Normalerweise sieht man dann irgendwo einen roten Kreis mit einem Ausrufezeichen, das nach einem Klick die Exception anzeigt.
VampireSilence Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109
Erhaltene Danke: 5


C# (VS 2008 Express), PHP/MySQL, Windows XP
BeitragVerfasst: Mi 15.09.10 00:37 
user profile iconNecaremus hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
foreach (object o in (object[])Links)
{
    if (o is string)
        msg = (string)o;
}

so mal versucht?


So ähnlich, ja. Das Problem hierbei ist, das auch so nur die Strings erfasst werden und bspw. keine BLOBs.


user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du den Code im Einzelschrittmodus durchgehst, wird dir dann vielleicht die Exception angezeigt? Normalerweise sieht man dann irgendwo einen roten Kreis mit einem Ausrufezeichen, das nach einem Klick die Exception anzeigt.


Habe ich noch nicht gemacht, aber der Fehler ist ja nun klar. Das Problem liegt in der Konvertierung eines oder mehrerer der Formate in einen string[]. Ich kenne bislang nur leider keine Alternative dafür. Ich hatte gehofft, ihr könnt mir da helfen.

mfg
- VampireSilence
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 15.09.10 15:23 
user profile iconVampireSilence hat folgendes geschrieben Zum zitierten Posting springen:
Das Problem hierbei ist, das auch so nur die Strings erfasst werden und bspw. keine BLOBs.

Du kannst doch auch auf Blobs testen (vorausgesetzt, es gibt eine Klasse dafür), dann nach Blob casten und schließlich eine Methode verwenden, um die String-Repräsentation zu erhalten.
VampireSilence Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109
Erhaltene Danke: 5


C# (VS 2008 Express), PHP/MySQL, Windows XP
BeitragVerfasst: Do 16.09.10 00:50 
Ok, soweit hab ich das schonmal verstanden. Ich dachte nur, es gäbe eine Möglichkeit, wie ich alle Datentypen gleichermaßen kanalisieren könnte. Denn wenn ich mal den MIME-Katalog grob überschlage, sind das Tausende von Typen, die ich sonst seperat behandeln (und dann natürlich auch für jeden einen Case schreiben) müsste.

Das tue ich mir aber nicht mehr an, es ging ja auch wie gesagt nur um meine Neugier und was sich mit DragDrop alles anstellen lässt.

mfg
- VampireSilence
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 16.09.10 19:19 
Ok, ich habe mir jetzt die Drag&Drop-Implementation von .NET einmal angeschaut.

Willst du wirklich alle Inhalte akzeptieren? Dann musst du wohl tatsächlich Fallunterscheidungen für tausende Fälle implementieren.

Etwas einfacher wird es, wenn du nur z.B. Inhalte akzeptierst, die in einen String konvertiert werden können. Das geht sogar viel einfacher als dein Code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        private void Form1_DragEnter(object sender, DragEventArgs e) {
            if (e.Data.GetDataPresent(typeof(string)))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;
        }

        private void Form1_DragDrop(object sender, DragEventArgs e) {
            string text = (string)e.Data.GetData(typeof(string));
            MessageBox.Show(text);
        }

(natürlich mit aktiviertem AllowDrop)

Um Dateien zu akzeptieren, siehe DataFormats.FileDrop, und für ein paar andere nützliche Datentypen die vollständige Liste.