Delen via


Gegevens- en gegevensobjecten

Gegevens die worden overgedragen als onderdeel van een bewerking voor slepen en neerzetten, worden opgeslagen in een gegevensobject. Conceptueel gezien bestaat een gegevensobject uit een of meer van de volgende paren:

  • Een Object die de werkelijke gegevens bevat.

  • Een bijbehorende identificator voor gegevensindeling.

De gegevens zelf kunnen bestaan uit alles wat kan worden weergegeven als een basis Object. De bijbehorende gegevensindeling is een tekenreeks of Type die een hint biedt over de indeling van de gegevens. Gegevensobjecten ondersteunen het hosten van meerdere paren van gegevens-/gegevensindelingen; Hierdoor kan één gegevensobject gegevens in meerdere indelingen leveren.

Gegevensobjecten

Alle gegevensobjecten moeten de IDataObject-interface implementeren, die de volgende standaardset methoden biedt die gegevensoverdracht mogelijk maken en vergemakkelijken.

Methode Samenvatting
GetData Hiermee haalt u een gegevensobject op in een opgegeven gegevensindeling.
GetDataPresent Hiermee wordt gecontroleerd of de gegevens beschikbaar zijn in of kunnen worden geconverteerd naar een opgegeven indeling.
GetFormats Retourneert een lijst met indelingen waarin de gegevens in dit gegevensobject zijn opgeslagen of waarnaar kan worden geconverteerd.
SetData Slaat de opgegeven gegevens op in dit gegevensobject.

WPF biedt een eenvoudige implementatie van IDataObject in de DataObject klasse. De voorraad DataObject klasse is voldoende voor veel algemene scenario's voor gegevensoverdracht.

Er zijn verschillende vooraf gedefinieerde indelingen, zoals bitmap, CSV, bestand, HTML, RTF, tekenreeks, tekst en audio. Raadpleeg het naslagonderwerp over de DataFormats-referentieklasse voor informatie over voorgeconfigureerde gegevensindelingen geleverd door WPF.

Gegevensobjecten bevatten vaak een faciliteit voor het automatisch converteren van gegevens die in één indeling zijn opgeslagen in een andere indeling tijdens het extraheren van gegevens; deze faciliteit wordt automatisch converteren genoemd. Wanneer u een query uitvoert op de gegevensindelingen die beschikbaar zijn in een gegevensobject, kunnen gegevensindelingen die automatisch worden omgezet, worden gefilterd vanuit systeemeigen gegevensindelingen door de methode GetFormats(Boolean) of GetDataPresent(String, Boolean) aan te roepen en de parameter autoConvert op te geven als false. Wanneer u gegevens toevoegt aan een gegevensobject met de methode SetData(String, Object, Boolean), kan automatische conversie van gegevens worden verboden door de parameter autoConvert in te stellen op false.

Werken met gegevensobjecten

In deze sectie worden algemene technieken beschreven voor het maken en werken met gegevensobjecten.

Nieuwe gegevensobjecten maken

De DataObject-klasse biedt verschillende overladen constructors die het mogelijk maken om een nieuw DataObject-exemplaar in te vullen met één paar gegevens/gegevensindeling.

De volgende voorbeeldcode maakt een nieuw gegevensobject en gebruikt een van de overbelaste constructors DataObject(DataObject(String, Object)) om het gegevensobject te initialiseren met een tekenreeks en een opgegeven gegevensindeling. In dit geval wordt de gegevensindeling opgegeven door een tekenreeks; de DataFormats-klasse biedt een set vooraf gedefinieerde typetekenreeksen. Automatische conversie van de opgeslagen gegevens is standaard toegestaan.

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

Zie Een gegevensobject makenvoor meer voorbeelden van code waarmee een gegevensobject wordt gemaakt.

Gegevens opslaan in meerdere indelingen

Eén gegevensobject kan gegevens opslaan in meerdere indelingen. Strategisch gebruik van meerdere gegevensindelingen binnen één gegevensobject maakt het gegevensobject mogelijk verbruikbaar door een grotere verscheidenheid aan dropdoelen dan als er slechts één gegevensindeling kan worden weergegeven. In het algemeen moet een sleepbron agnostisch zijn over de gegevensindelingen die kunnen worden gebruikt door mogelijke dalingsdoelen.

In het volgende voorbeeld ziet u hoe u de methode SetData(String, Object) gebruikt om gegevens toe te voegen aan een gegevensobject in meerdere indelingen.

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);
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)

Een query uitvoeren op een gegevensobject voor beschikbare indelingen

Omdat één gegevensobject een willekeurig aantal gegevensindelingen kan bevatten, bevatten gegevensobjecten faciliteiten voor het ophalen van een lijst met beschikbare gegevensindelingen.

In de volgende voorbeeldcode wordt de GetFormats overload gebruikt om een array met tekenreeksen op te halen die alle gegevensindelingen aangeven die beschikbaar zijn in een gegevensobject (zowel systeemeigen als door automatisch converteren).

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;
    }
}
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

Zie De gegevensindelingen weergeven in een gegevensobjectvoor meer voorbeelden van code waarmee een query wordt uitgevoerd op een gegevensobject voor beschikbare gegevensindelingen. Zie Bepalen of een gegevensindeling aanwezig is in een gegevensobjectvoor voorbeelden van het opvragen van een gegevensobject voor de aanwezigheid van een bepaald gegevensobject.

Gegevens ophalen uit een gegevensobject

Het ophalen van gegevens uit een gegevensobject in een bepaalde indeling omvat het aanroepen van een van de GetData methoden en het opgeven van de gewenste gegevensindeling. Een van de GetDataPresent methoden kan worden gebruikt om te controleren op de aanwezigheid van een bepaalde gegevensindeling. GetData retourneert de gegevens in een Object; afhankelijk van de gegevensindeling kan dit object worden gecast naar een typespecifieke container.

In de volgende voorbeeldcode wordt de GetDataPresent(String) overbelasting gebruikt om te controleren of een opgegeven gegevensindeling beschikbaar is (systeemeigen of door automatisch converteren). Als de opgegeven indeling beschikbaar is, worden de gegevens opgehaald met behulp van de methode GetData(String).

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[];
}
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

Zie Gegevens ophalen in een bepaalde gegevensindelingvoor meer voorbeelden van code waarmee gegevens uit een gegevensobject worden opgehaald.

Gegevens verwijderen uit een gegevensobject

Gegevens kunnen niet rechtstreeks worden verwijderd uit een gegevensobject. Voer de volgende stappen uit om effectief gegevens uit een gegevensobject te verwijderen:

  1. Maak een nieuw gegevensobject dat alleen de gegevens bevat die u wilt behouden.

  2. Kopieer de gewenste gegevens van het oude gegevensobject naar het nieuwe gegevensobject. Als u de gegevens wilt kopiëren, gebruikt u een van de GetData methoden om een Object op te halen die de onbewerkte gegevens bevat en gebruikt u vervolgens een van de SetData methoden om de gegevens toe te voegen aan het nieuwe gegevensobject.

  3. Vervang het oude gegevensobject door het nieuwe.

Notitie

De SetData methoden voegen alleen gegevens toe aan een gegevensobject; ze vervangen geen gegevens, zelfs niet als de gegevens- en gegevensindeling exact hetzelfde zijn als een vorige aanroep. Als u SetData twee keer aanroept voor dezelfde gegevens- en gegevensindeling, wordt de gegevens-/gegevensindeling twee keer in het gegevensobject weergegeven.