Использование пользовательского форматера в DataGridView

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

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

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

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

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

1 ответ

Решение

Вы действительно можете реализовать кастом 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;
    }
}

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

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();
    }

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