Пользовательское форматирование 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;
}
}
}