【问题标题】:How to fix datagridview error?如何修复datagridview错误?
【发布时间】:2017-08-17 04:56:40
【问题描述】:

我有以下代码:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    string age = dataGridView1.Rows[e.RowIndex].Cells["dataGridViewTextBoxColumn43"].Value.ToString();

    dataGridView1.Rows[e.RowIndex].Cells["dataGridViewTextBoxColumn43"].Value = (age == "1") ? "Муж" : "Жен";
}

当我运行程序时,它会给出致命消息:

在数据库字段中genderinteger 类型。此值应添加到列名:dataGridViewTextBoxColumn43

查询数据库:

公共数据表选择(SQLiteDatabase db) {

    return db.GetDataTable("SELECT " +
        "Pacients.id, " +
        "unique_code," +
        "status_pass, " +
        "payment, " +
        "profession," +
        "office_address, " +
        "factory_name, " +
        "factory_edrpou, " +
        "factory_departament," +
        "name, " +
        "secondname, " +
        "lastname, " +
        "datebirth, " +
        "taxcode, " +
        "gender, " +
        "Pacients.created_at, " +
        "file,  " +
        "PacientsOrder.kind_work, " +
        "PacientsOrder.status " +
        "FROM Pacients LEFT JOIN PacientsOrder ON PacientsOrder.pacient_id = Pacients.id LEFT JOIN Transactions ON Transactions.pacient_id = Pacients.id ORDER BY Pacients.id DESC");
}

【问题讨论】:

  • 你调试代码了吗?哪一行代码给你错误?代码谈论年龄,而您的描述谈论性别,但例外是将数字转换为字符串的 FormatException,而代码没有使用任何转换方法。我在这里错过了什么。
  • 看起来您正在尝试将文本值分配给绑定到数据源数字列的单元格。那是转换失败的时候。您是否为列 dataGridViewTextBoxColumn43 设置了特定的数据类型?
  • 它有DataGridViewTextBoxColumn 类型
  • 在哪里可以看到接受的值类型?

标签: c# winforms c#-4.0


【解决方案1】:

如果ValueTy‌​pe列是数字,可以在设计器中将数字格式改为Муж;;Жен

dataGridView1.Columns["dataGridViewTextBoxColumn43"].DefaultCellStyle.Format = "Муж;;Жен";

【讨论】:

  • 类型取决于哪个?
  • @OPV 我不确定你的意思。零 (0) 数字被格式化为“Жен”,正数被格式化为“Муж”。任何数字有符号、无符号或浮点类型,如 intInt64decimal 都有效
【解决方案2】:

如果我理解正确,您是在尝试根据当前位于同一列中的整数值向列添加文本值(即您正在切换列值类型)?

请不要这样做,因为有几个原因它不起作用。除了您的错误之外,最重要的是当您为创建的每一行设置 DataGridView 的 DataSource 时会触发此事件,但 e.RowIndex 并不总是新行的 RowIndex。详情请阅读here

通常,当用户从界面插入新行时,您只会使用 RowsAdded。

您应该做的是在从数据库读取数据的 SELECT 语句中提供这种转换。这样,当数据到达 DataGridView 时,您不需要转换数据。所以你的 SELECT 需要是这样的:

SELECT .... CASE WHEN gender = 1 THEN 'МУЖ' ELSE 'ЖЕН' END AS gender ...

编辑

尝试更改您的 SELECT 语句,使其如下所示:

public DataTable select(SQLiteDatabase db) {
    return db.GetDataTable("SELECT " +
        "Pacients.id, " +
        "unique_code," +
        "status_pass, " +
        "payment, " +
        "profession," +
        "office_address, " +
        "factory_name, " +
        "factory_edrpou, " +
        "factory_departament," +
        "name, " +
        "secondname, " +
        "lastname, " +
        "datebirth, " +
        "taxcode, " +
        "CASE WHEN gender = 1 THEN 'МУЖ' ELSE 'ЖЕН' END AS gender, " +
        "Pacients.created_at, " +
        "file,  " +
        "PacientsOrder.kind_work, " +
        "PacientsOrder.status " +
        "FROM Pacients LEFT JOIN PacientsOrder ON PacientsOrder.pacient_id = Pacients.id LEFT JOIN Transactions ON Transactions.pacient_id = Pacients.id ORDER BY Pacients.id DESC");
}

现在您可以完全摆脱添加行事件,因为数据库已经为您完成了工作,在它到达 datagridview 之前。

【讨论】:

  • 我不明白 root 的问题
  • 请出示您从数据库中获取数据的代码。
  • 我没看到。我希望您显示为从数据库中获取数据而运行的查询。
  • 同样的麻烦,马上调试报告
  • 您是否删除了添加行事件?您的 DataGridView 是否使用 Auto 作为字段?还是您自己设置列类型?您是否检查过查询现在返回一个字符串作为性别字段?
【解决方案3】:

问题出在以下,很明显,但一下子不清楚:

gender 字段以integer 类型存储在数据库中。

所以,当我将DataGridView 与现有数据库表绑定时,它会为构建表分配内存,定义表的所有属性,包括单元格类型。

因此,当它第一次发生时,datagridview期望将整数数据类型作为值,但我将值单元格修改为字符串值并尝试覆盖值。

它涉及一个致命错误。

解决方案是将所有具有integer 类型的数据类型更改为string 类型。

感谢回答,会采纳的!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 2016-11-17
    • 2011-07-24
    • 2021-05-10
    • 2017-07-17
    • 2013-03-05
    • 2016-09-10
    • 2020-12-11
    相关资源
    最近更新 更多