Элемент управления DataGridView предоставляет метод DataGridView.GetClipboardContent()
, который форматирует выбранные ячейки как DataObject
, которые можно поместить в буфер обмена Windows.Затем вы можете извлечь содержимое буфера обмена как TextDataFormat.CommaSeparatedValue
.Это возвращает содержимое буфера обмена в виде строки в формате CSV, которую можно записать в файл.Используя методы DataGridView SelectAll()
, вы можете выбрать весь DataGridView для копирования в буфер обмена.Вы также можете даже скопировать строку заголовка, указав DataGridView.ClipboardCopyMode
, чтобы быть равным перечислению DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
.
Обратите внимание на простоту следующего кода:
void SaveDataGridViewToCSV(string filename)
{
// Save the current state of the clipboard so we can restore it after we are done
IDataObject objectSave = Clipboard.GetDataObject();
// Choose whether to write header. Use EnableWithoutHeaderText instead to omit header.
dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
// Select all the cells
dataGridView1.SelectAll();
// Copy (set clipboard)
Clipboard.SetDataObject(dataGridView1.GetClipboardContent());
// Paste (get the clipboard and serialize it to a file)
File.WriteAllText(filename,Clipboard.GetText(TextDataFormat.CommaSeparatedValue));
// Restore the current state of the clipboard so the effect is seamless
if(objectSave != null) // If we try to set the Clipboard to an object that is null, it will throw...
{
Clipboard.SetDataObject(objectSave);
}
}
Обратите внимание, что я также взялпредосторожность сохранения содержимого буфера обмена до того, как я скопировал DataGridView, чтобы я мог восстановить его после того, как я это сделал.
Я считаю, что этот метод лучше, потому что вы используете уже предоставленную для вас платформу, ине заново изобретать колесо, просматривая строки и ячейки, которые подвержены ошибкам.
Надеюсь, это решит ваши проблемы ...