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

StackOverflow https://stackoverflow.com/questions/3551575

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Класс Fixter будет выглядеть что-то подобное:

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

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top