Использование пользовательского форматера в DataGridView - PullRequest
4 голосов
/ 24 августа 2010

Итак, возможно, это плохой дизайн;Я не знаю.Но скажем, у меня есть DataTable со столбцом, который содержит значения int;на самом деле эти значения представляют некоторый тип enum, который есть у меня в проекте.

Я хотел бы сделать так, чтобы DataGridView был привязан к этой таблице, а столбец отображал имяenum вместо целочисленного значения "0" или "1" или чего-либо другого.

Один из вариантов, который я рассмотрел, заключался в том, чтобы выполнить всю работу по нормализации: добавить таблицу в DataSet с enum имена в нем, введенные значения enum, и моя первая таблица содержит ссылку на эту таблицу.

Но это enum -специфичная идея.Я хотел бы знать, могу ли я вообще написать свою собственную реализацию IFormatProvider и ICustomFormatter для данного типа и использовать этот форматер для управления отображением значений в данном столбце элемента управления DataGridView (илидействительно в любом контроле, если на то пошло).

* Вот как я подозреваю, что это будет сделано, если то, что я спрашиваю, возможно вообще.Я не совсем уверен в использовании этих интерфейсов вообще.

1 Ответ

12 голосов
/ 26 августа 2010

Вы действительно можете реализовать пользовательский ICustomFormatter, но из-за некоторой задержки со стороны DataGridView, вам нужно фактически сказать ему, как применять ваш форматер.

Сначала установите column.DefaultCellStyle.FormatProvider на экземпляр вашего пользовательского класса форматирования. Затем обработайте событие CellFormatting:

void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
    if (e.CellStyle.FormatProvider is ICustomFormatter) {
        e.Value = (e.CellStyle.FormatProvider.GetFormat(typeof(ICustomFormatter)) as ICustomFormatter).Format(e.CellStyle.Format, e.Value, e.CellStyle.FormatProvider);
        e.FormattingApplied = true;
    }
}

Класс форматера будет выглядеть примерно так:

public class MyEnumFormatter : IFormatProvider, ICustomFormatter {

    public object GetFormat(Type formatType) {
        if (formatType == typeof(ICustomFormatter))
            return this;
        else
            return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider) {
        return ((NameOfEnumType)Convert.ToInt32(arg)).ToString();
    }

}
...