Краткий ответ: дескриптор CellFormatting
, и, если во время «выборки значений» буфера обмена запрашивается форматирование, вместо отображаемого значения возвращается неформатированное значение. Чтобы это можно было обнаружить, разрешите выпадающий списокСтолбец создает потомок ячейки комбинированного списка, который устанавливает флаг в свойствах столбца при вызове его метода GetClipboardContent
.
Длинный ответ:
М-ч, кажется, что базовый метод делает что-то вроде этого (Код C # из Mono из http://www.eg.bucknell.edu/~cs208/subpages/software/src/mono-2.6.7/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewCell.cs):
protected virtual object GetClipboardContent (int rowIndex, bool firstCell, bool lastCell, bool inFirstRow, bool inLastRow, string format) {
if (DataGridView == null)
return null;
if (rowIndex < 0 || rowIndex >= DataGridView.RowCount)
throw new ArgumentOutOfRangeException ("rowIndex", "Specified argument was out of the range of valid values.");
string value = null;
if (Selected) {
DataGridViewCellStyle style = GetInheritedStyle (null, rowIndex, false);
value = GetEditedFormattedValue (rowIndex, DataGridViewDataErrorContexts.ClipboardContent | DataGridViewDataErrorContexts.Formatting) as string;
}
if (value == null)
value = string.Empty;
string table_prefix = string.Empty, cell_prefix = string.Empty, row_prefix = string.Empty;
string table_suffix = string.Empty, cell_suffix = string.Empty, row_suffix = string.Empty;
if (format == DataFormats.UnicodeText || format == DataFormats.Text) {
if (lastCell && !inLastRow)
cell_suffix = Environment.NewLine;
else if (!lastCell)
cell_suffix = "\t";
} else if (format == DataFormats.CommaSeparatedValue) {
if (lastCell && !inLastRow)
cell_suffix = Environment.NewLine;
else if (!lastCell)
cell_suffix = ",";
} else if (format == DataFormats.Html) {
if (inFirstRow && firstCell)
table_prefix = "<TABLE>";
if (inLastRow && lastCell)
table_suffix = "</TABLE>";
if (firstCell)
row_prefix = "<TR>";
if (lastCell)
row_suffix = "</TR>";
cell_prefix = "<TD>";
cell_suffix = "</TD>";
if (!Selected) {
value = " ";
}
} else {
return value;
}
value = table_prefix + row_prefix + cell_prefix + value + cell_suffix + row_suffix + table_suffix;
return value;
}
Это позволяет мне полагать, что я должен переопределить GetEditedFormattedValue
и проверить, установлен ли бит ClipboardContent
в аргументе Context
, что позволяет мне определить,он выбирает значение для буфера обмена, и если да, возвращает значение потомка ячейки ComboBox, а не DisplayValue.
GetEditedFormattedValue
не может быть переопределено, хотя.
Так что япринудительно создает флаг в столбце, устанавливает его, если GetClipboardContent
ячейки работает, и возвращает неформатированное значение ячейки в событии CellFormatting
таблицы, если флаг установлен.
Работаетхорошо.