Как переформатировать / преобразовать результаты запроса данных перед их отображением в DataGridView - PullRequest
2 голосов
/ 21 декабря 2011

Я использую компонент DataGridView для быстрого и удобного отображения результатов запросов SQL только для чтения. У меня это работает, как хотелось бы, но я должен задаться вопросом, правильно ли я делаю вещи. В конце концов, это сложный компонент, и я совершенно новичок в доступе к SQL и привязке данных в .NET.

В справке MSDN предлагается использовать объект BindingSource в качестве посредника, поэтому я пришел к следующему коду (который, кажется, работает отлично):

mBindingSource.DataSource = null;
mBindingSource.Clear();

using (SqlDataReader query = GetQuery())
{
  if ((query != null) && (query.HasRows))
  {
    mBindingSource.DataSource = query;
    CDataGrid.DataSource = mBindingSource;
  }
}

Однако я хочу переформатировать некоторые из этих «сырых» данных. Например, некоторые значения хранятся в базовых таблицах как типы int или byte, но на самом деле они представляют различные значения enum. В настоящее время я использую следующий код для выполнения желаемого преобразования (вдохновленный этой страницей MSDN ):

private void CDataGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs args)
{
  DataGridViewColumn column = CDataGrid.Columns[args.ColumnIndex];
  switch (column.Name)
  {
    case FieldNameProductID:
    case FieldNameVersionID:
      int? x = args.Value as int?;
      ProductCode code = (ProductCode)(x ?? 0);
      args.Value = code.ToString();
      break;

    case FieldNameProductType:
      byte? y = args.Value as byte?;
      ProductType type = (ProductType)(y ?? 0);
      args.Value = type.ToString();
      break;
  }
}

Это правильный способ делать вещи? Причина, по которой я спрашиваю, состоит в том, что казалось, что объект BindingSource предназначен частично для выполнения таких типов преобразований. Однако в документации трудно ориентироваться, и мне еще предстоит найти хороший пример того, что я пытаюсь сделать.

1 Ответ

1 голос
/ 21 декабря 2011

Это правильный способ сделать это.Событие CellFormatting захватывает данные перед их обработкой, чтобы их можно было изменить.

...