Announcement

Collapse
No announcement yet.

Problem mit Drag & Drop

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit Drag & Drop

    Hallo zusammen,

    ich habe ein Problem mit Drag&Drop von einem DataGrid zu einem anderen DataGrid.
    Die Problematik hierbei ist, das in dem 1. Grid Emails direkt aus Outlook (zb. Posteingang) dargestellt werden und per Doppelklick geöffnet werden können.
    Diese Emails möchste ich nun aus diesem Grid in ein 2. ziehen können. Und zwar genau so, als wenn ich sie direkt aus Outlook in mein Grid ziehen würde.

    Mein Versuch bisher:
    Code:
    Private Sub ctl_MailGrid_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ctl_MailGrid.MouseDown       
    
            Dim mailID As String
            Dim grid As DataGrid = CType(sender, DataGrid)
            Dim oKlasse As New C_Outlook
            Dim mail As Outlook.MailItem
    
            If oKlasse Is Nothing Then
                F_Meldung("FEHLEROUTLOOK", "A connection to Outlook couldn't be established.")
                Exit Sub
    
            End If
            Try
                mailID = grid(grid.CurrentRowIndex, 0)
                mail = oKlasse.OutlookNS.GetItemFromID(mailID)
                Me.ctl_MailGrid.DoDragDrop(mail, DragDropEffects.Copy)
            Catch ex As Exception
                MsgBox(ex.Message, vbOKOnly + vbExclamation)
            End Try
    
        End Sub
    C_Outlook ist hierbei eine Instanz von Interop.Outlook.

    Beim DragOver wird dann geprüft, woher das gezogene Objekt stammt und ob dieses dann auch gedroppt werden darf. Bisher dürfen nur Objekt direkt aus Outlook und aus dem Explorer gedropt werden.
    Das sieht dann so aus:
    Code:
     ' Ermittelt DragDrop-Quelle anhand der übergebenen Datenformate
        Public Function F_DragDropQuelle(ByVal devent As DragEventArgs) As Integer
    
            Dim FormatFeld() As String
            Dim OLFeld() As String = {"RenPrivateSourceFolder", "RenPrivateMessages", "FileGroupDescriptor", "FileContents", "Object Descriptor", "System.String", "UnicodeText", "Text"}
            Dim ExpFeld() As String = {"FileDrop", "FileNameW", "FileName"}
            Dim Retwert As Integer
    
            Dim Ipos As Integer, Fanz As Integer, ILauf As Integer
    
            FormatFeld = devent.Data.GetFormats
            Fanz = FormatFeld.GetLength(0)
    
            ' Formatliste Outlook prüfen
    
            Retwert = enum_DRAGDROP.Outlook
            For ILauf = 0 To OLFeld.GetLength(0) - 1
                Ipos = Array.IndexOf(FormatFeld, OLFeld(ILauf))
                If Ipos < 0 Then
                    Retwert = enum_DRAGDROP.Unknown
                Else
    
                    ' Darf überhaupt binär gespeichert werden?
    
                    If F_TPZeilenAnz("VP_Verweisart", "VERWEISART=4") < 1 Then
                        Return enum_DRAGDROP.Unknown
                    End If
                End If
            Next
    
            ' Kein Outlook-Element -> evtl. Datei?
    
            If Retwert = enum_DRAGDROP.Unknown Then
                Retwert = enum_DRAGDROP.Explorer
                For ILauf = 0 To ExpFeld.GetLength(0) - 1
                    Ipos = Array.IndexOf(FormatFeld, ExpFeld(ILauf))
                    If Ipos < 0 Then Retwert = enum_DRAGDROP.Unknown
                Next
            End If
    
            Return Retwert
    
    
        End Function
    An dieser Stelle versage ich dann leider. Mein mail-Objekt wird nicht als Outlook-Objekt erkannt (was ich auch verständlich finde) und somit darf es nicht gedropt werden.
    Hat jemand eine Idee, was ich machen muss, damit es klappt?

    Achja, und seit ich das Ziehen mit MouseDown starte, funktioniert auch der Doppelklick nicht mehr


    EDIT:
    Die Emails im 2. Grid liegen entweder als *.msg irgendwo aufm Dateisystem oder werden binär in der Datenbank gespeichert. Dies passiert beim Droppen ins 2. Grid.
    Zuletzt editiert von Andreas Mahr; 06.10.2008, 16:23.

  • #2
    ok, das Drag&Drop hab ich hinbekommen. Hab einfach die MailId zusammen mit einem Key (um es eindeutig zu machen) in einen Array gesteckt und gebe diesen Array als Data-Element mit.

    Hat jemand vielleicht eine Ahnung, wie ich jetzt wieder den Doppelclick im Grid 1 hinbekomme? Dadurch das ich dort jetzt mit einem MouseDown-Event arbeite, wird Doppelclick nicht mehr erkannt. Aber es sollte doch möglich sein, sowohl Drag&Drop als auch Doppelclick zu ermöglichen, oder täusche ich mich da?

    Comment


    • #3
      Hallo Andreas,

      in der MSDN ein Artikel wie dies mit Timern unterschieden werden kann: http://msdn.microsoft.com/de-de/library/ms171543.aspx


      Eine weitere und einfachere Möglichkeite ist die Auswertung des MouseEventArgs Clicks das die Anzahl der Tastendrücke wiedergibt.
      zB:
      [highlight=c#]
      private void pictureBox1_DoubleClick(object sender, EventArgs e)
      {
      this.Text = "Doppelklick";
      }

      private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
      {
      if (e.Clicks == 1)
      this.Text = "MouseDown";
      }
      [/highlight]
      Einziger Nachteil dabei ist dass auch der Code für MouseDown ausgeführt - also dein Drag & Drop beginnt - aber beim Loslassen der Maustaste um Schwung für den 2. Klick (den Doppelklick) zu holen wird das Drag & Drop wieder beendet.

      mfG Gü

      PS: Hier mit PictureBox getestet geht aber auch mit allen anderen Controls.
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4
        hmm...ja, der Nachteil den du nennst ist nicht schön, aber dein Beitrag hat mich auf eine andere Idee gebracht.
        Wenn ich mich vom MouseDown verabschiede und über MouseMove gehe und dort prüfe, ob während dem Move die Linke Maustaste gedrückt ist, kann ich das Drag&Drop starten und beeinflusse nicht das andere Click-Verhalten. Oder ist das auch unschön?
        Code:
        Private Sub ctl_MailGrid_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ctl_MailGrid.MouseMove
                If e.Button = Windows.Forms.MouseButtons.Left Then
                    StarteEmailDrag(sender)
                End If
            End Sub

        Comment


        • #5
          Hi,

          ist auch nicht "schön" da
          [highlight=vb.net]
          StarteEmailDrag(sender)
          [/highlight]
          bei jeder Bewegung aufgerufen wird.

          D.h. du könntest ein Flag setzten dass schon StarteEmailDrag durchgeführt wird, oder so etwas in dieser Art.

          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment


          • #6
            ich hab mir da mal ein Trace mit reingebaut und das zeigt mir, das (zumindest unter Vista) die Funktion nur einmal aufgerufen wird. Nur wenn ich den Mousbutton loslasse und erneut drücke und dann bewege wird es wieder aufgerufen.
            Werd das aber noch mit XP und auf einer Cyrix-Maschine testen. Das fensteverhalten ist ja leider immer anders

            Comment


            • #7
              Es war außerdem nur eine Vermutung meinerseits da ich deinen Code in StarteEmailDrag nicht kenne.

              Aber wenn's nur einmal aufgerufen wird ist eh in Ordnung.

              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                so hatte ich es auch verstanden
                in StartEmailDrag steht der Code der vorher in MouseDown gestanden hat

                Comment

                Working...
                X