Freigeben über


Daten und Datenobjekte

Aktualisiert: April 2011

Daten, die als Teil eines Drag & Drop-Vorgangs übertragen werden, werden in einem Datenobjekt gespeichert. Im Prinzip besteht ein Datenobjekt aus einem oder mehreren der folgenden Paare:

  • Einem Object, das die eigentlichen Daten enthält

  • Einem entsprechenden Datenformatbezeichner

Die Daten selbst können aus allem bestehen, was als Basis-Object dargestellt werden kann. Das entsprechende Datenformat ist eine Zeichenfolge oder ein Type-Element, das einen Hinweis auf das Format der Daten gibt. Datenobjekte unterstützen das Hosten mehrerer Daten-/Datenformatpaare, sodass ein einzelnes Datenobjekt Daten in mehreren Formaten bereitstellen kann.

Datenobjekte

Alle Datenobjekte müssen die IDataObject-Schnittstelle implementieren, die den folgenden Standardsatz von Methoden bereitstellt, mit denen sich die Datenübertragung durchführen und vereinfachen lässt.

Methode

Zusammenfassung

GetData

Ruft ein Datenobjekt in einem bestimmten Datenformat ab.

GetDataPresent

Überprüft, ob die Daten in einem bestimmten Format verfügbar sind oder in dieses Format konvertiert werden können.

GetFormats

Gibt eine Liste von Formaten zurück, in denen die Daten in diesem Datenobjekt gespeichert sind bzw. in die diese konvertiert werden können.

SetData

Speichert die angegebenen Daten in diesem Datenobjekt.

WPF stellt eine grundlegende Implementierung von IDataObject in der DataObject-Klasse bereit. Die vordefinierte DataObject-Klasse ist für viele häufige Datenübertragungsszenarien ausreichend.

Es ist eine Reihe vordefinierter Formate verfügbar, z. B. Bitmap, CSV, Datei, HTML, RTF, Zeichenfolge, Text und Audio. Informationen zu den vordefinierten Datenformate in WPF finden Sie im Referenzthema zur DataFormats-Klasse.

Datenobjekte enthalten häufig eine Funktion, um bei der Datenextraktion Daten automatisch aus einem Format in ein anderes Format zu konvertieren. Diese Funktion wird als automatische Konvertierung bezeichnet. Beim Abfragen der in einem Datenobjekt verfügbaren Datenformate können automatisch konvertierbare Datenformate aus systemeigenen Datenformaten herausgefiltert werden, indem die GetFormats- oder GetDataPresent-Methode aufgerufen und der autoConvert-Parameter auf false festgelegt wird. Wenn einem Datenobjekt mit der SetData-Methode Daten hinzugefügt werden, kann die automatische Konvertierung von Daten durch Festlegen des autoConvert-Parameters auf false verhindert werden.

Arbeiten mit Datenobjekten

In diesem Abschnitt werden allgemeine Techniken für das Erstellen von und Arbeiten mit Datenobjekten beschrieben.

Erstellen neuer Datenobjekte

Die DataObject-Klasse stellt mehrere überladene Konstruktoren bereit, die das Auffüllen einer neuen DataObject-Instanz mit einem einzelnen Daten-/Datenformatpaar erleichtern.

Im folgenden Beispielcode wird ein neues Datenobjekt erstellt. Außerdem wird mithilfe von einem der überladenen Konstruktoren DataObject(DataObject) das Datenobjekt mit einer Zeichenfolge und einem angegebenen Datenformat initialisiert. In diesem Fall wird das Datenformat durch eine Zeichenfolge angegeben. Die DataFormats-Klasse stellt einen Satz vordefinierter Typzeichenfolgen bereit. Die automatische Konvertierung der gespeicherten Daten wird standardmäßig zugelassen.

Dim stringData As String = "Some string data to store..."
Dim dataFormat As String = DataFormats.UnicodeText
Dim dataObject As New DataObject(dataFormat, stringData)
string stringData = "Some string data to store...";
string dataFormat = DataFormats.UnicodeText;
DataObject dataObject = new DataObject(dataFormat, stringData);

Weitere Beispiele für Code, mit dem ein Datenobjekt erstellt wird, finden Sie unter Gewusst wie: Erstellen eines Datenobjekts.

Speichern von Daten in mehreren Formaten

Ein einzelnes Datenobjekt kann Daten in mehreren Formaten speichern. Durch den strategischen Einsatz von mehreren Datenformaten innerhalb eines einzelnen Datenobjekts ist das Datenobjekt möglicherweise für eine größere Zahl von Ablagezielen geeignet, als wenn nur ein einzelnes Datenformat dargestellt werden könnte. Beachten Sie, dass eine Ziehquelle im Allgemeinen von den Datenformaten, die für mögliche Ablageziele geeignet sind, unabhängig sein muss.

Im folgenden Beispiel wird gezeigt, wie einem Datenobjekt mithilfe der SetData-Methode Daten in mehreren Formaten hinzugefügt werden.

                Dim dataObject As New DataObject()
                Dim sourceData As String = "Some string data to store..."

                ' Encode the source string into Unicode byte arrays.
                Dim unicodeText() As Byte = Encoding.Unicode.GetBytes(sourceData) ' UTF-16
                Dim utf8Text() As Byte = Encoding.UTF8.GetBytes(sourceData)
                Dim utf32Text() As Byte = Encoding.UTF32.GetBytes(sourceData)

                ' The DataFormats class does not provide data format fields for denoting
                ' UTF-32 and UTF-8, which are seldom used in practice; the following strings 
                ' will be used to identify these "custom" data formats.
                Dim utf32DataFormat As String = "UTF-32"
                Dim utf8DataFormat As String = "UTF-8"

                ' Store the text in the data object, letting the data object choose
                ' the data format (which will be DataFormats.Text in this case).
                dataObject.SetData(sourceData)
                ' Store the Unicode text in the data object.  Text data can be automatically
                ' converted to Unicode (UTF-16 / UCS-2) format on extraction from the data object; 
                ' Therefore, explicitly converting the source text to Unicode is generally unnecessary, and
                ' is done here as an exercise only.
                dataObject.SetData(DataFormats.UnicodeText, unicodeText)
                ' Store the UTF-8 text in the data object...
                dataObject.SetData(utf8DataFormat, utf8Text)
                ' Store the UTF-32 text in the data object...
                dataObject.SetData(utf32DataFormat, utf32Text)
DataObject dataObject = new DataObject();
string sourceData = "Some string data to store...";

// Encode the source string into Unicode byte arrays.
byte[] unicodeText = Encoding.Unicode.GetBytes(sourceData); // UTF-16
byte[] utf8Text = Encoding.UTF8.GetBytes(sourceData);
byte[] utf32Text = Encoding.UTF32.GetBytes(sourceData);

// The DataFormats class does not provide data format fields for denoting
// UTF-32 and UTF-8, which are seldom used in practice; the following strings 
// will be used to identify these "custom" data formats.
string utf32DataFormat = "UTF-32";
string utf8DataFormat  = "UTF-8";

// Store the text in the data object, letting the data object choose
// the data format (which will be DataFormats.Text in this case).
dataObject.SetData(sourceData);
// Store the Unicode text in the data object.  Text data can be automatically
// converted to Unicode (UTF-16 / UCS-2) format on extraction from the data object; 
// Therefore, explicitly converting the source text to Unicode is generally unnecessary, and
// is done here as an exercise only.
dataObject.SetData(DataFormats.UnicodeText, unicodeText);
// Store the UTF-8 text in the data object...
dataObject.SetData(utf8DataFormat, utf8Text);
// Store the UTF-32 text in the data object...
dataObject.SetData(utf32DataFormat, utf32Text);

Abfragen eines Datenobjekts nach verfügbaren Formaten

Da ein einzelnes Datenobjekt beliebig viele Datenformate enthalten kann, enthalten Datenobjekte Funktionen zum Abrufen einer Liste von verfügbaren Datenformaten.

Im folgenden Beispielcode wird mit der GetFormats-Überladung ein Zeichenfolgenarray abgerufen, das alle in einem Datenobjekt verfügbaren Datenformate (systemeigene und automatisch konvertierbare) angibt.

Dim dataObject As New DataObject("Some string data to store...")

' Get an array of strings, each string denoting a data format
' that is available in the data object.  This overload of GetDataFormats
' returns all available data formats, native and auto-convertible.
Dim dataFormats() As String = dataObject.GetFormats()

' Get the number of data formats present in the data object, including both
' auto-convertible and native data formats.
Dim numberOfDataFormats As Integer = dataFormats.Length

' To enumerate the resulting array of data formats, and take some action when
' a particular data format is found, use a code structure similar to the following.
For Each dataFormat As String In dataFormats
    If dataFormat = System.Windows.DataFormats.Text Then
        ' Take some action if/when data in the Text data format is found.
        Exit For
    ElseIf dataFormat = System.Windows.DataFormats.StringFormat Then
        ' Take some action if/when data in the string data format is found.
        Exit For
    End If
Next dataFormat
DataObject dataObject = new DataObject("Some string data to store...");

// Get an array of strings, each string denoting a data format
// that is available in the data object.  This overload of GetDataFormats
// returns all available data formats, native and auto-convertible.
string[] dataFormats = dataObject.GetFormats();

// Get the number of data formats present in the data object, including both
// auto-convertible and native data formats.
int numberOfDataFormats = dataFormats.Length;

// To enumerate the resulting array of data formats, and take some action when
// a particular data format is found, use a code structure similar to the following.
foreach (string dataFormat in dataFormats)
{
    if (dataFormat == DataFormats.Text)
    {
        // Take some action if/when data in the Text data format is found.
        break;
    }
    else if(dataFormat == DataFormats.StringFormat)
    {
        // Take some action if/when data in the string data format is found.
        break;
    }
}

Weitere Beispiele für Code, mit dem ein Datenobjekt nach verfügbaren Datenformaten abgefragt wird, finden Sie unter Gewusst wie: Auflisten der Datenformate in einem Datenobjekt. Beispiele für die Abfrage eines Datenobjekts nach einem bestimmten vorhandenen Datenformat finden Sie unter Gewusst wie: Feststellen, ob ein Datenformat in einem Datenobjekt vorhanden ist.

Abrufen von Daten aus einem Datenobjekt

Wenn Daten aus einem Datenobjekt in einem bestimmten Format abgerufen werden, wird einfach eine der GetData-Methoden unter Angabe des gewünschten Datenformats aufgerufen. Mit einer der GetDataPresent-Methoden kann überprüft werden, ob ein bestimmtes Datenformat vorhanden ist. GetData gibt die Daten in einem Object zurück. Je nach Datenformat kann dieses Objekt in einen typspezifischen Container umgewandelt werden.

Im folgenden Beispielcode wird mit der GetDataPresent-Überladung überprüft, ob ein angegebenes Datenformat verfügbar ist (im System oder durch automatische Konvertierung). Wenn das angegebene Format verfügbar ist, werden im Beispiel die Daten mit der GetData-Methode abgerufen.

Dim dataObject As New DataObject("Some string data to store...")

Dim desiredFormat As String = DataFormats.UnicodeText
Dim data() As Byte = Nothing

' Use the GetDataPresent method to check for the presence of a desired data format.
' This particular overload of GetDataPresent looks for both native and auto-convertible 
' data formats.
If dataObject.GetDataPresent(desiredFormat) Then
    ' If the desired data format is present, use one of the GetData methods to retrieve the
    ' data from the data object.
    data = TryCast(dataObject.GetData(desiredFormat), Byte())
End If
DataObject dataObject = new DataObject("Some string data to store...");

string desiredFormat = DataFormats.UnicodeText;
byte[] data = null;

// Use the GetDataPresent method to check for the presence of a desired data format.
// This particular overload of GetDataPresent looks for both native and auto-convertible 
// data formats.
if (dataObject.GetDataPresent(desiredFormat))
{
    // If the desired data format is present, use one of the GetData methods to retrieve the
    // data from the data object.
    data = dataObject.GetData(desiredFormat) as byte[];
}

Weitere Beispiele für Code, mit dem Daten aus einem Datenobjekt abgerufen werden, finden Sie unter Gewusst wie: Abrufen von Daten in einem bestimmten Datenformat.

Entfernen von Daten aus einem Datenobjekt

Daten können aus einem Datenobjekt nicht direkt entfernt werden. Um Daten aus einem Datenobjekt wirksam zu entfernen, gehen Sie folgendermaßen vor:

  1. Erstellen Sie ein neues Datenobjekt, das nur die Daten enthält, die Sie beibehalten möchten.

  2. "Kopieren" Sie die gewünschten Daten aus dem alten Datenobjekt in das neue Datenobjekt. Kopieren Sie die Daten mit einer der GetData-Methoden, um ein Object abzurufen, das die unformatierten Daten enthält. Fügen Sie anschließend mit einer der SetData-Methoden dem neuen Datenobjekt die Daten hinzu.

  3. Ersetzen Sie das alte Datenobjekt durch das neue.

HinweisHinweis

Mit den SetData-Methoden werden einem Datenobjekt nur Daten hinzugefügt. Es werden damit keine Daten ersetzt, selbst wenn die Daten und das Datenformat mit einem vorhergehenden Aufruf vollständig übereinstimmen.Wenn SetData zweimal für dieselben Daten und dasselbe Datenformat aufgerufen wird, führt dies dazu, dass die Daten und das Datenformat zweimal im Datenobjekt vorhanden sind.

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

April 2011

Thema hinzugefügt.

Kundenfeedback.