Показать да / нет вместо 0/1 в представлении таблицы данных для c #? - PullRequest
0 голосов
/ 04 ноября 2019

Я заполняю сетку данных в c # из базы данных SQLite, но базы данных SQLite не имеют истинного логического значения, поэтому я сделал поле SQLite INTEGER с проверкой, чтобы убедиться, что оно равно 0 или 1. Вместо того, чтобы показывать, что 0или 1 в таблице данных, я хотел бы показать да / нет. 1 = Да, 0 = Нет. Я бы хотел, чтобы данные в БД остались прежними, просто измените то, что отображается для пользователя. Оператор sql, заполняющий таблицу прямо сейчас, прост:

SELECT * FROM TABLE1

Каков наилучший способ добиться этого? Спасибо.

РЕДАКТИРОВАТЬ: поле, о котором идет речь, является полем "Ранен". Схема таблицы:

CREATE TABLE "SmashRoster" (
    "SmashRosterID" INTEGER PRIMARY KEY AUTOINCREMENT,
    "CharacterName" TEXT NOT NULL,
    "TotalTournaments"  INTEGER NOT NULL,
    "Wins"  INTEGER NOT NULL,
    "Losses"    INTEGER NOT NULL,
    "Championships" INTEGER NOT NULL,
    "InjuriesCaused"    INTEGER NOT NULL,
    "Injured"   INTEGER NOT NULL DEFAULT 0 CHECK(Injured IN (0,1))
);

Метод, используемый для извлечения данных из БД. Привязка к сетке данных находится внизу:

  SQLiteConnection cnn = new SQLiteConnection(@"Data 
    Source=C:\SQLiteDB\SQLiteDB.db;Version=3;");
  SQLiteCommand cmd;
  SQLiteDataReader dataReader;
  DataTable roster;

  cnn.Open();
  cmd = new SQLiteCommand(@"SELECT * FROM SmashRoster", cnn);
  roster = new DataTable();

  dataReader = cmd.ExecuteReader();
  roster.Load(dataReader);

  dataReader.Close();
  cmd.Dispose();
  cnn.Dispose();
  rosterGridView.DataSource = roster;

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Предполагая, что значение данных является целым числом, как вы говорите, вы можете использовать событие CellFormatting элемента управления DataGridView следующим образом:

private void grid_CellFormatting(object sender, ataGridViewCellFormattingEventArgs e)
{
  if ( e.ColumnIndex == columnIndex )
    if ( e.Value is int )
      e.Value = (int)e.Value == 0 ? "No" : "Yes";
}

Все значения, кроме 0, считаются истинными, кроме васможете изменить тест по своему усмотрению.

Замените columnIndex на нужный вам индекс, начиная с 0.

Также замените проверку int и приведите на long, если вы используетеДрайвер SQLite x64.

Вы также можете использовать имя столбца следующим образом:

if ( (sender as DataGridView)?.Columns[e.ColumnIndex].Name == "column name" )

Или имя свойства связанных данных из вашего запроса:

if ( (sender as DataGridView)?.Columns[e.ColumnIndex].DataPropertyName == "name" )

Использование столбцаиндекс или имя, которое вы независимы от запроса.

Используя имя свойства данных, вы не зависите от порядка и имен столбцов.

Вы можете выбрать то, что предпочитаете.

0 голосов
/ 04 ноября 2019

В зависимости от ситуации.

Вы можете использовать выражение case непосредственно в операторе sql. См. https://www.sqlitetutorial.net/sqlite-case/

Если вы используете какой-либо слой бизнес-объекта, у вас может быть определенное свойство, чтобы выставлять это поле как вычисляемую строку вместо целого числа. С ADO.NET Dataset / Datatable вы могли бы иметь то же поведение с колонкой Expression https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable-dataview/creating-expression-columns

. Вы можете использовать событие CellFormatting для datagridview, чтобы определить правый столбец и преобразовать Int в String.

...