Wie erhalten Sie programmgesteuert den Dateinamen beim Ziehen und Ablegen aus dem .Net Solution Explorer?

hannodb

Ich möchte eine Anwendung schreiben, die Zip-Dateien durch direktes Ziehen und Ablegen von Dateien aus Visual Studio Solution Explorer in meine App erstellt.

Ich habe das folgende Codefragment verwendet, um das eingehende DataObject abzufangen:

private void lblIncludedFiles_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        e.Effect = DragDropEffects.Copy;
    }
}

Ich habe jeden möglichen Wert von ausprobiert DataFormats, alle geben false zurück.

Jimi

Da diese Aufgabe möglicherweise etwas weniger einfach ist als auf dem Papier, finden Sie hier ein Beispielverfahren, mit dem Sie eine Liste der Dateien abrufen können, die aus dem Visual Studio Solution Explorer-Bedienfeld gezogen wurden.

Die von DataFormatsVisual Studio generierten Dateien sind teilweise üblich ( UnicodeTextund Text), aber die eigentliche Dateiliste wird in einem (klassischen) MemoryStream-Objekt weitergegeben, das kein Befehl ist DataFormat: CF_VSSTGPROJECTITEMS.

Der MemoryStream enthält Unicode-Text - die tatsächliche Liste der Projekt + Dateinamen-Tupel, die gelöscht werden - getrennt durch ein Pipe ( |) -Symbol - und einige andere Binärabschnitte, die ich hier nicht für nützlich halte.

Das andere nicht gebräuchliche / vordefinierte Format VX Clipboard Descriptor Formatist ebenfalls ein MemoryStream-Objekt, aber es ist nur eine Unicode-Zeichenfolge, die den Projektnamen enthält.


In diesem Beispiel werden die kombinierten Elemente, die Teil des Abwurfs sind, mithilfe eines benutzerdefinierten Klassenobjekts organisiert, das Informationen zu folgenden Themen enthält:

  • den Namen und die UUID des Projekts (der Projekte), von denen die Dateien stammen,
  • den Projektpfad und den Dateipfad ( .[xxx]prj),
  • den Namen des Objekts, das den Drag & Drop-Vorgang gestartet hat,
  • eine Liste aller Dateien , die das Projekt , sie sind Teil und ihre Ausgangstyp (fallen gelassen werden .cs, .vb, .h, .pngetc.)

Wählen Sie ein Steuerelement aus, das den Drop erhält, und fügen Sie die Handler hinzu:

private void ctlVSDrop_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetFormats().Contains("CF_VSSTGPROJECTITEMS"))
    {
        e.Effect = DragDropEffects.Copy;
    }
}

private void ctlVSDrop_DragDrop(object sender, DragEventArgs e)
{
    var vsObject = new VisualStudioDataObject(e.Data);
}

Das Klassenobjekt VisualStudioDataObjectenthält die Methoden, die zum Extrahieren der Informationen aus dem DataObjectvom DragDropEreignis referenzierten Objekt erforderlich sind DragEventArgs:

(Getestet mit Visual Studio 2017)

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

class VisualStudioDataObject
{
    public VisualStudioDataObject(IDataObject data)
    {
        if (data is null) {
            throw new ArgumentNullException("IDataObject data", "Invalid DataObject");
        }
        this.FileList = new List<FileObject>();
        GetData(data);
    }

    public List<FileObject> FileList { get; private set; }
    public string ProjectUUID { get; private set; }
    public string ProjectPath { get; private set; }
    public string ProjectFilePath { get; private set; }
    public string StartingObject { get; private set; }

    public class FileObject
    {
        public FileObject(string project, string path, string type) {
            this.SourceProject = project;
            this.FilePath = path;
            this.FileType = type;
        }
        public string SourceProject { get; }
        public string FilePath { get; }
        public string FileType { get; }
    }

    private void GetData(IDataObject data)
    {
        List<string> formats = data.GetFormats(false).ToList();
        if (formats.Count == 0) return;

        foreach (string format in formats) {
            switch (format) {
                case "UnicodeText":
                    this.StartingObject = data.GetData(DataFormats.UnicodeText, true).ToString();
                    break;
                case "VX Clipboard Descriptor Format":
                    var projectMS = (MemoryStream)data.GetData(format, false);
                    projectMS.Position = 0;
                    string prjFile = Encoding.Unicode.GetString(projectMS.ToArray()).TrimEnd("\0".ToCharArray());
                    this.ProjectFilePath = prjFile;
                    this.ProjectPath = Path.GetDirectoryName(prjFile);
                    break;
                case "CF_VSSTGPROJECTITEMS":
                    GetFileData((MemoryStream)data.GetData(format, false));
                    break;
            }
        }
    }

    private void GetFileData(MemoryStream ms)
    {
        string uuidPattern = @"\{(.*?)\}";
        string content = Encoding.Unicode.GetString(ms.ToArray());
        //Get the Project UUID and remove it from the data object
        var match = Regex.Match(content, uuidPattern, RegexOptions.Singleline);
        if (match.Success) {
            this.ProjectUUID = match.Value;
            content = content.Replace(this.ProjectUUID, "").Substring(match.Index);

            //Split the file list: Part1 => Project Name, Part2 => File name
            string[] projectFiles = content.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < projectFiles.Length; i += 2)
            {
                string sourceFile = projectFiles[i + 1].Substring(0, projectFiles[i + 1].IndexOf("\0"));
                this.FileList.Add(new FileObject(projectFiles[i], sourceFile, Path.GetExtension(sourceFile)));
            }
        }
        else
        {
            this.FileList = null;
            throw new InvalidDataException("Invalid Data content");
        }
    }
}

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Richten Sie die PictureBox nach dem Ziehen und Ablegen an den Schaltflächen aus

Zeigen Sie den Textcursor beim Ziehen und Ablegen in UITextView an

Halten Sie den Cursor beim Ziehen und Ablegen in Windows-Formularen in der Standardform c #

So stellen Sie den Fokus in der Anwendung nach dem Ziehen und Ablegen in das Raster wieder her

So erhalten Sie den Dateinamen schnell aus dem Dateipfad

Schwierigkeiten beim Ziehen und Ablegen

Scrollen Sie beim Ziehen und Ablegen eines Elements durch Elemente

Nach dem Ziehen und Ablegen des Sortierelements erstellen Sie Duplikate

So aktualisieren Sie Datensätze nach dem Ziehen und Ablegen

Wie verwende ich einen regulären Ausdruck, um den Schlüssel aus dem Dateinamen zu finden und den Wert nach dem Schlüssel aus dem Hash zu erhalten?

Os X Yosemite Qt Fehler beim Ziehen und Ablegen von Dateinamen

Verhindern Sie das Ablegen innerhalb eines untergeordneten Elements beim Ziehen und Ablegen mit JS

Wie verwende ich Steuerelemente (insbesondere eventAllow) aus dem Vollkalender in einer Winkelumgebung, um das Ziehen und Ablegen bestimmter Ereignisse einzuschränken?

Machen Sie die Steuerung transparent, um Ereignisse beim Ziehen und Ablegen zu ziehen

Ziehen und ablegen aus der ListView meiner App in externe Apps (z. B. Windows Explorer)

So erhalten Sie den ausgewählten Dateinamen und den Dateipfad aus der Eingabetypdatei mit jQuery

So erhalten Sie den Dateinamen aus dem Verzeichnis mit InputStream in Java

Spark - So erhalten Sie den Dateinamen mit dem übergeordneten Ordner aus der Datenrahmenspalte

So erhalten Sie den Start- und Endwert eines Div nach dem Ziehen

qt schnelles Ziehen und Ablegen von Elementen beim Ziehen

Beim Ziehen und Ablegen von Elementen aus der Palette in Android Studio wird nichts angezeigt

Warum kann ich keine Elemente aus dem Assets-Ordner auf den Spieleditor in Unity3D ziehen und dort ablegen?

So erhalten Sie den Speicherort und den Dateinamen von OCX in vb.net

Wie kann ich mehrere Widgets gleichzeitig ziehen und ablegen? Ich kann meine Beschriftungen ziehen, möchte sie aber gleichzeitig ziehen

Holen Sie sich den Dateinamen und den Pfad von der URI aus dem Mediastore

Android - Holen Sie sich den Dateinamen und den Pfad der URI aus dem Mediastore

SwiftUI: Ziehen und Ablegen eines Kontakts aus den Kontakten unter macOS

Wie kann man ein Geisterbild beim Ziehen und Ablegen über das Dialogfeld des Registerkartenfensters hinaus bewegen?

PySide Wie kann ich QLabel beim Ziehen und Ablegen sichtbar halten?

TOP Liste

  1. 1

    So verschieben Sie ein Bild in Flutter/Dart mit einem Draggable

  2. 2

    Unity Build-Fehler: Der Name 'EditorUtility' ist im aktuellen Kontext nicht vorhanden

  3. 3

    TypeAhead.js zeigt keine Ausgangsschienen an?

  4. 4

    Deklarieren einer nicht initialisierten Variablen in der Klassendefinition in Python

  5. 5

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  6. 6

    spring-data-jpa: ORA-01795: Die maximale Anzahl von Ausdrücken in einer Liste beträgt 1000

  7. 7

    Warum funktioniert Phantomjs nicht mit dieser Site?

  8. 8

    Interpolieren Sie mit Python die 2D-Matrix entlang der Spalten

  9. 9

    numpy: Berechnen Sie die Ableitung der Softmax-Funktion

  10. 10

    Wie vermeide ich, dass die gesamte App neu geladen wird, wenn Nav.Link von React-Bootstrap verwendet wird?

  11. 11

    MongoDB eingebettetes Dokument unterscheiden und filtern

  12. 12

    Aktualisieren des Werts im Json-Objekt in Python

  13. 13

    Warum funktioniert das Umgebungslicht in diesem Beispiel nicht?

  14. 14

    Python gibt einen Fehler aus, dass eine Datei nicht vorhanden ist, wenn dies eindeutig der Fall ist

  15. 15

    Wie verwende ich Format-Table ohne Abschneiden von Werten?

  16. 16

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  17. 17

    Überprüfen Sie, ob der ausgewählte Wert 'YES' ist, wenn ja, aktivieren Sie ein Steuerelement mit Javascript

  18. 18

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  19. 19

    Holen Sie sich verwandte Pillen Inhalt mit angeklickten img in Angular

  20. 20

    Eclipse Oxygen - Projekte verschwinden

  21. 21

    Wie aktualisiere ich ein Feld in einer Raumdatenbank mit einem Repository und einem Ansichtsmodell?

heißlabel

Archiv