【问题标题】:Show Yes/No instead of 0/1 in datagrid view for c#?在 c# 的数据网格视图中显示是/否而不是 0/1?
【发布时间】:2020-02-29 16:43:38
【问题描述】:

我正在从 SQLite 数据库用 c# 填充数据网格,但 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;

【问题讨论】:

    标签: c# winforms sqlite datagridview boolean


    【解决方案1】:

    假设数据值是你所说的整数,你可以像这样使用DataGridView控件的CellFormatting事件:

    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开始。

    如果您使用 SQLite x64 驱动程序,还要替换 int 检查和转换为 long

    你也可以像这样使用列名:

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

    或查询中的绑定数据属性名称:

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

    使用独立于查询的列索引或名称。

    使用数据属性名称,您独立于列顺序和命名。

    你可以选择你喜欢的。

    【讨论】:

    • 因为这是我的第 8 列,所以我只输入了第 8 列。 8对吗?这并没有引发任何异常,而且对视图也没有影响。
    • 第八列的索引为7(集合从0开始)。
    • 啊,一旦我尝试了索引 7,我得到了一个无效的演员表,就像其他答案一样。好像 SQLite INTEGER 数据类型可能与代码中使用的 int 不同?
    • 这很奇怪,因为 SQLite INTEGER 在 C# 中是一个 int。我在类型化的 DataSet 上使用它没有问题。您能否在您的问题中添加一些代码:表架构以及如何获取数据以及如何绑定网格。
    • 我已将这些细节和代码段添加到问题中。
    【解决方案2】:

    视情况而定。

    您可以直接在 sql 语句中使用 case 表达式。见https://www.sqlitetutorial.net/sqlite-case/

    如果您使用一些业务对象层,您可以有一个特定的属性来将此字段公开为计算字符串而不是整数。使用 ADO.NET 数据集/数据表,您可以与表达式列 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable-dataview/creating-expression-columns 具有相同的行为

    您可以使用 datagridview 的 CellFormatting 事件来发现右列并将 Int 转换为字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      相关资源
      最近更新 更多