Partager via


Données et objets de données

Les données transférées dans le cadre d'une opération de glisser-déplacer sont stockées dans un objet de données. Conceptuellement, un objet de données se compose d'une ou plusieurs paires suivantes :

  • Un Object contenant les données réelles.

  • Un identificateur de format de données correspondant.

Les données en elle-même peuvent se composer de tout ce qui peut être représenté comme un Objectde base. Le format de données correspondant est une chaîne ou un Type qui fournit des information sur le format des données. Les objets de données prennent en charge l'hébergement de plusieurs paires de données/format de données, ce qui permet à un même objet de données de fournir des données dans divers formats.

Objets de données

Tous les objets de données doivent implémenter l'interface IDataObject qui fournit le jeu standard de méthodes suivant qui activent et facilitent le transfert de données.

Méthode

Résumé

GetData

Récupère un objet de données dans un format de données spécifié.

GetDataPresent

Vérifie si les données sont disponibles dans un format spécifié ou peuvent être converties en un format spécifié.

GetFormats

Retourne une liste de formats dans lesquels sont stockées les données de cet objet de données ou vers lesquels elles peuvent être converties.

SetData

Stocke les données spécifiées dans cet objet de données.

WPF fournit une implémentation de base de IDataObject dans la classe DataObject. La classe DataObject de stock est suffisante pour de nombreux scénarios courants de transfert de données.

Il existe plusieurs formats prédéfinis, tels que bitmap, CSV, fichier, HTML, RTF, chaîne, texte et audio. Pour plus d'informations sur les formats de données prédéfinis fournis avec WPF, consultez la rubrique de référence de la classe DataFormats.

Les objets de données incluent couramment une fonctionnalité pour convertir automatiquement les données stockées dans un format vers un format différent pendant l'extraction des données ; cette fonctionnalité est appelée conversion automatique. Lors de l'interrogation des formats de données disponibles dans un objet de données, les formats de données convertibles automatiquement peuvent être filtrés à partir des formats de données natifs en appelant la méthode GetFormats ou GetDataPresent et en affectant la valeur false au paramètre autoConvert. Lors de l'ajout de données à un objet de données avec la méthode SetData, la conversion automatique de données peut être interdite en affectant la valeur false au paramètre autoConvert.

Utilisation d'objets de données

Cette section décrit les techniques courantes permettant de créer et d'utiliser des objets de données.

Création de nouveaux objets de données

La classe DataObject fournit plusieurs constructeurs surchargés qui facilitent le remplissage d'une nouvelle instance de DataObject avec une paire de données/format de données unique.

L'exemple de code suivant crée un nouvel objet de données et utilise l'un des constructeurs surchargés DataObject(DataObject) pour initialiser l'objet de données à l'aide d'une chaîne et d'un format de données spécifié. Dans ce cas, le format de données est spécifié par une chaîne ; la classe DataFormats fournit un ensemble de chaînes de type prédéfini. La conversion automatique des données stockées est autorisée par défaut.

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

Pour obtenir plus d'exemples de code créant un objet de donnée, consultez Comment : créer un objet de données.

Stockage de données dans plusieurs formats

Un objet de données unique est en mesure de stocker des données dans plusieurs formats. L'utilisation stratégique de plusieurs formats de données dans un objet de données unique rend potentiellement l'objet de données utilisable par une variété plus large de cibles de déplacement, seulement si un format de données unique pouvait être représenté. Notez qu'en général, une source de glissement doit être agnostique concernant les formats de données utilisables par des cibles de déplacement potentielles.

L'exemple suivant indique comment utiliser la méthode SetData pour ajouter des données à un objet de données dans plusieurs formats.

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

Interrogation d'un objet de données pour les formats disponibles

Du fait qu'un objet de données unique peut contenir un nombre arbitraire de formats de données, les objets de données comportent des fonctionnalités pour la récupération d'une liste de formats de données disponibles.

L'exemple de code suivant utilise la surcharge GetFormats pour obtenir un tableau de chaînes qui dénote tous les formats de données disponibles dans un objet de données (à la fois natives et par conversion automatique).

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

Pour obtenir plus d'exemples de code interrogeant un objet de données pour les formats de données disponibles, consultez Comment : répertorier les formats de données dans un objet de données. Pour les exemples d'interrogation d'un objet de données pour la présence d'un format de données particulier, consultez Comment : déterminer si un format de données est présent dans un objet de données.

Récupération des données d'un objet de données

La récupération des données d'un objet de donnée dans un format particulier implique simplement l'appel de l'une des méthodes GetData et la spécification du format de données désiré. L'une des méthodes GetDataPresent peut être utilisée pour vérifier la présence d'un format de données particulier. GetData retourne les données dans un Object ; selon le format de données, cet objet peut être casté en conteneur spécifique au type.

L'exemple de code suivant utilise la surcharge GetDataPresent pour vérifier si un format de données spécifié est disponible (natif ou par conversion automatique). Si le format spécifié est disponible, l'exemple récupère les données en utilisant la méthode GetData.

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

Pour obtenir plus d'exemples de code récupérant des données d'un objet de données, consultez Comment : récupérer des données dans un format de données particulier.

Suppression de données d'un objet de données

Les données ne peuvent pas être supprimées directement d'un objet de données. Pour supprimer efficacement des données d'un objet de données, procédez comme suit :

  1. Créez un nouvel objet de données qui contiendra uniquement les données vous souhaitez conserver.

  2. "Copiez" les données désirées de l'ancien vers le nouvel objet de données. Pour copier les données, utilisez l'une des méthodes GetData pour récupérer un Object qui contient les données brutes, puis utilisez l'une des méthodes SetData pour ajouter les données au nouvel objet de données.

  3. Remplacez l'ancien objet de données par le nouveau.

RemarqueRemarque

Les méthodes SetData ajoutent seulement des données à un objet de données ; ils ne remplacent pas de données, même si les données et le format de données sont exactement les mêmes qu'un appel précédent.Appeler deux fois SetData pour les mêmes données et format de données en traîne un doublon de données/format de données dans l'objet de données.

Historique des modifications

Date

Historique

Motif

Avril 2011

Ajout d'une rubrique.

Commentaires client.