Переопределение DataGridViewCell.GetClipboardContent - следует ли поддерживать (повторно реализовывать) особенности формата? - PullRequest
1 голос
/ 05 сентября 2011

Некоторые из моих DataGridViewCells возвращают неправильное значение в их GetClipboardContent методе. Они являются ячейками в ячейках DataGridViewComboBoxColumn, поэтому они используют отображаемое свойство, а не свойство value ячейки. Я хочу, чтобы оно возвращало само значение.

Первоначальная попытка была просто использовать

  Protected Overrides Function GetClipboardContent(ByVal rowIndex As Integer, ByVal firstCell As Boolean, ByVal lastCell As Boolean, ByVal inFirstRow As Boolean, ByVal inLastRow As Boolean, ByVal format As String) As Object
    Return Value
  End Function

в моем DataGridViewComboBoxCell потомке, но потом я заметил, что этот метод вызывается более одного раза для значения ячейки, один раз для каждого формата данных, который стандартно поддерживает DataGridView: format = "HTML", "Text", "UnicodeText "и" CSV ".

Для csv базовая реализация добавляет запятую, если это не последняя ячейка, для html она добавляет правильные теги в зависимости от того, является ли это первая / последняя строка / ячейка в строке таблицы / таблицы и т. Д. Я считаю этот формат -специфичный, не специфичный по клеточному значению.

Так, как я мог бы заменить значение , которое заканчивается в буфере обмена без повторной реализации всех этих специфичных для формата аспектов? Это привело бы к некоторому коду для функциональности, которая уже существует в базовом классе, не так ли?

1 Ответ

1 голос
/ 05 сентября 2011

Краткий ответ: дескриптор 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 = "&nbsp;";
            }
        } 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 таблицы, если флаг установлен.

Работаетхорошо.

...