Пользовательское форматирование DataGridView: анализ редактируемого значения.

Предположим, у меня есть DataGridView, который связан с BindingSource. BindingSource имеет DataSource класса MyClass

public class MyClass
{
    public double Percentage {get; set;}
    ...
}

DataGridView показывает процент в двойном размере. Таким образом, значение 19% отображается как 0,19, что не то, что я хочу.

К счастью, я могу изменить стиль ячейки столбца:

dataGridViewCellStyle.Format = "p";

Это означает, что значение отображается в процентах в соответствии с текущей культурой. В моей культуре 0,19 отображается как 19%.

Все идет нормально. Но что произойдет, если оператор изменит это значение на 18% и завершит редактирование ячейки.

  • Событие CellValidating повышено. В этом случае я могу проверить, что введенный текст представляет собой идеальный процент.

Однако сразу после этого я получаю исключение, что строка "18%" не может быть отформатирована в удвоение.

Я предполагаю, что должен сказать datagridviewCellStyle, какой formatprivider использовать:

datagridVieCellStyle.FormatProvider = new MyFormatProvider();

class MyFormatProvider : IFormatProvider
{
    public object GetFormat(Type formatType)
    {
        // what to return?
    }
}

Вопрос: Предположим, у меня есть следующий класс:

public static class PercentStringParser
{
     public static double Parse(string txt);
}

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

1 ответ

Не используйте поставщик формата, но используйте событие DataGridView.CellParsing.

private void OnCellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
    if (e.ColumnIndex == this.percentageDataGridViewTextBoxColumn.Index
        && e.DesiredType == typeof(double)
        && ContainsPercentSign(e.Value.ToString()))
        {   // parsing a percentage to a double
            var formatProvider = this.dataGridView1.Rows[e.RowIndex]
                                     .Cells[e.ColumnIndex]
                                     .InheritedStyle
                                     .FormatProvider;

            try
            {
                e.Value = ParsePercentageToDouble(e.Value.ToString(), formatProvider);
                e.ParsingApplied = true;
            }
            catch (FormatException)
            {
                e.ParsingApplied = false;
            }
        }
        else
        {   // parsing any other column, let the system parse it
            e.ParsingApplied = false;
        }           
    }
}

Пример MSDN об этом событии

Другие вопросы по тегам