Немного известной особенностью DataGridView
является возможность программно выбирать некоторые или все DataGridCells и отправлять их на DataObject
, используя метод DataGridView.GetClipboardContent()
.В чем преимущество этого тогда?
A DataObject
не просто хранит объект, а скорее представляет его в различных форматах.Вот как буфер обмена способен творить свою магию;в нем хранятся различные форматы, и различные элементы управления / классы могут указывать, какой формат они хотят принять.В этом случае DataGridView сохранит выбранные ячейки в объекте DataObject в виде текстового формата с разделителями табуляции, формата CSV или HTML (*).
Содержимое объекта DataObject можно получить, вызвавDataObject.GetData()
или DataObject.GetText()
методы и указание предопределенного формата данных enum.В этом случае мы хотим, чтобы форматом был TextDataFormat.CommaSeparatedValue для CSV, тогда мы можем просто записать этот результат в файл, используя класс System.IO.File
.
(*) На самом деле то, что он возвращает, не является, строго говоря, HTML.Этот формат также будет содержать заголовок данных, который вы не ожидали.Хотя заголовок содержит начальную позицию HTML-кода, я просто отбрасываю что-либо над тегом HTML, например myString.Substring(IndexOf("<HTML>"));
.
. Обратите внимание на следующий код:
void SaveDataGridViewToCSV(string filename)
{
// Choose whether to write header. Use EnableWithoutHeaderText instead to omit header.
dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
// Select all the cells
dataGridView1.SelectAll();
// Copy selected cells to DataObject
DataObject dataObject = dataGridView1.GetClipboardContent();
// Get the text of the DataObject, and serialize it to a file
File.WriteAllText(filename, dataObject.GetText(TextDataFormat.CommaSeparatedValue));
}
Теперь,разве это не лучше?Зачем заново изобретать колесо?
Надеюсь, это поможет ...