| Autor |
Beitrag |
VampireSilence
      
Beiträge: 109
Erhaltene Danke: 5
C# (VS 2008 Express), PHP/MySQL, Windows XP
|
Verfasst: 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:
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"); foreach (string format in formats) { MessageBox.Show("2"); msg += "\n" + format + ": ";
MessageBox.Show("3"); string[] Links = (string[])e.Data.GetData(format, true);
MessageBox.Show("4"); foreach (string Link in Links) { msg += Link; }
MessageBox.Show("5"); }
MessageBox.Show("6"); 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
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 109
Erhaltene Danke: 5
C# (VS 2008 Express), PHP/MySQL, Windows XP
|
Verfasst: 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:
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
      
Beiträge: 203
Erhaltene Danke: 18
Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
|
Verfasst: Di 14.09.10 12:58
C#-Quelltext 1: 2: 3: 4: 5:
| foreach (object o in (object[])Links) { if (o is string) msg = (string)o; } |
so mal versucht?
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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 
      
Beiträge: 109
Erhaltene Danke: 5
C# (VS 2008 Express), PHP/MySQL, Windows XP
|
Verfasst: Mi 15.09.10 00:37
Necaremus hat folgendes geschrieben : | 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.
Yogu hat folgendes geschrieben : | | 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 15.09.10 15:23
VampireSilence hat folgendes geschrieben : | | 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 
      
Beiträge: 109
Erhaltene Danke: 5
C# (VS 2008 Express), PHP/MySQL, Windows XP
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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:
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.
|
|
|