3

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

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

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

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

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

ответ

8

Вы действительно можете реализовать пользовательские ICustomFormatter, но из-за некоторых retardedness на части 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(); 
    } 

} 
+0

многообещающих! Теперь, когда вы это объясняете, я чувствую себя глупым, не думая об этом (обработка события «CellFormatting» - это кажется немного обходным, правда, не так ли?). Я собираюсь попробовать прямо сейчас ... –

Смежные вопросы