Bagikan melalui


Objek Data dan Data

Data yang ditransfer sebagai bagian dari operasi seret dan letakkan disimpan dalam objek data. Secara konseptual, objek data terdiri dari satu atau beberapa pasangan berikut:

  • Yang Object berisi data aktual.

  • Pengidentifikasi format data yang sesuai.

Data itu sendiri dapat terdiri dari apa pun yang dapat direpresentasikan sebagai basis Object. Format data yang sesuai adalah string atau Type yang memberikan petunjuk tentang format data apa. Objek data mendukung hosting beberapa pasangan format data/data; ini memungkinkan objek data tunggal untuk menyediakan data dalam beberapa format.

Objek Data

Semua objek data harus menerapkan IDataObject antarmuka, yang menyediakan serangkaian metode standar berikut yang mengaktifkan dan memfasilitasi transfer data.

Metode Ringkasan
GetData Mengambil objek data dalam format data tertentu.
GetDataPresent Memeriksa untuk melihat apakah data tersedia di, atau dapat dikonversi ke, format tertentu.
GetFormats Mengembalikan daftar format tempat data dalam objek data ini disimpan, atau dapat dikonversi.
SetData Menyimpan data yang ditentukan dalam objek data ini.

WPF menyediakan implementasi IDataObject dasar di DataObject kelas . Kelas stok DataObject cukup untuk banyak skenario transfer data umum.

Ada beberapa format yang telah ditentukan sebelumnya, seperti bitmap, CSV, file, HTML, RTF, string, teks, dan audio. Untuk informasi tentang format data yang telah ditentukan sebelumnya yang disediakan dengan WPF, lihat DataFormats topik referensi kelas.

Objek data biasanya mencakup fasilitas untuk mengonversi data yang disimpan secara otomatis dalam satu format ke format yang berbeda saat mengekstrak data; fasilitas ini disebut sebagai konversi otomatis. Saat mengkueri format data yang tersedia dalam objek data, format data yang dapat dikonversi otomatis dapat difilter dari format data asli dengan memanggil GetFormats(Boolean) metode atau GetDataPresent(String, Boolean) dan menentukan autoConvert parameter sebagai false. Saat menambahkan data ke objek data dengan SetData(String, Object, Boolean) metode , konversi otomatis data dapat dilarang dengan mengatur autoConvert parameter ke false.

Bekerja dengan Objek Data

Bagian ini menjelaskan teknik umum untuk membuat dan bekerja dengan objek data.

Membuat Objek Data Baru

Kelas ini DataObject menyediakan beberapa konstruktor yang kelebihan beban yang memfasilitasi pengisian instans baru DataObject dengan satu pasangan format data/data.

Contoh kode berikut membuat objek data baru dan menggunakan salah satu konstruktor DataObjectyang kelebihan beban (DataObject(String, Object)) untuk menginisialisasi objek data dengan string dan format data tertentu. Dalam hal ini, format data ditentukan oleh string; DataFormats kelas menyediakan sekumpulan string jenis yang telah ditentukan sebelumnya. Konversi otomatis data yang disimpan diizinkan secara default.

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)

Untuk contoh kode lainnya yang membuat objek data, lihat Membuat Objek Data.

Menyimpan Data dalam Beberapa Format

Satu objek data dapat menyimpan data dalam beberapa format. Penggunaan strategis beberapa format data dalam satu objek data berpotensi membuat objek data dapat dikonsumsi oleh berbagai target penurunan yang lebih luas daripada jika hanya satu format data yang dapat diwakili. Perhatikan bahwa, secara umum, sumber seret harus agnostik tentang format data yang dapat dikonsumsi oleh target penurunan potensial.

Contoh berikut menunjukkan cara menggunakan SetData(String, Object) metode untuk menambahkan data ke objek data dalam beberapa format.

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)

Mengkueri Objek Data untuk Format yang Tersedia

Karena objek data tunggal dapat berisi jumlah format data yang segan- segan, objek data menyertakan fasilitas untuk mengambil daftar format data yang tersedia.

Contoh kode berikut menggunakan GetFormats kelebihan beban untuk mendapatkan array string yang menunjukkan semua format data yang tersedia dalam objek data (baik asli maupun dengan konversi otomatis).

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

Untuk contoh kode lainnya yang mengkueri objek data untuk format data yang tersedia, lihat Mencantumkan Format Data dalam Objek Data. Untuk contoh kueri objek data untuk kehadiran format data tertentu, lihat Menentukan apakah Format Data Ada di Objek Data.

Mengambil Data dari Objek Data

Mengambil data dari objek data dalam format tertentu hanya melibatkan panggilan salah GetData satu metode dan menentukan format data yang diinginkan. Salah GetDataPresent satu metode dapat digunakan untuk memeriksa keberadaan format data tertentu. GetData mengembalikan data dalam Object; tergantung pada format data, objek ini dapat dilemparkan ke kontainer khusus jenis.

Contoh kode berikut menggunakan GetDataPresent(String) kelebihan beban untuk memeriksa apakah format data tertentu tersedia (asli atau dengan mengonversi otomatis). Jika format yang ditentukan tersedia, contoh mengambil data dengan menggunakan GetData(String) metode .

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

Untuk contoh kode lainnya yang mengambil data dari objek data, lihat Mengambil Data dalam Format Data Tertentu.

Menghapus Data Dari Objek Data

Data tidak dapat langsung dihapus dari objek data. Untuk menghapus data secara efektif dari objek data, ikuti langkah-langkah berikut:

  1. Buat objek data baru yang hanya akan berisi data yang ingin Anda pertahankan.

  2. "Salin" data yang diinginkan dari objek data lama ke objek data baru. Untuk menyalin data, gunakan salah GetData satu metode untuk mengambil Object yang berisi data mentah, lalu gunakan salah SetData satu metode untuk menambahkan data ke objek data baru.

  3. Ganti objek data lama dengan yang baru.

Catatan

Metode SetData hanya menambahkan data ke objek data; mereka tidak mengganti data, bahkan jika data dan format data sama persis dengan panggilan sebelumnya. SetData Memanggil dua kali untuk data dan format data yang sama akan mengakibatkan format data/data ada dua kali dalam objek data.