【问题标题】:Delete Entry from DGV and SQLite DB (C#)从 DGV 和 SQLite DB 中删除条目 (C#)
【发布时间】:2015-03-18 15:49:37
【问题描述】:

在我的程序中,我在一个表单上有一个 dgv。当我从 dgv 中删除一个条目时,我还想从 SQLite 数据库中删除该条目,这样它就不会重新出现。

我有一个“id”列(PRIMARY KEY AUTOINCREMENT),因此每个项目都是唯一的。

我遇到的问题是访问删除行的“id”。

以下是部分代码:

DialogResult deleteitem = MessageBox.Show("Delete the selected item?", "Delete Item", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
if (deleteitem == DialogResult.Yes)
{
    if (!this.dataGridView1.Rows[this.rowIndex].IsNewRow)
    {
          SetConnection();
          sqlconnection.Open();

          this.dataGridView1.Rows.RemoveAt(this.rowIndex);

          sqlcmd = new SQLiteCommand("DELETE FROM table1 WHERE id=???", sqlconnection);
          sqlcmd.ExecuteNonQuery();
    }
}

【问题讨论】:

  • 行中的 ID 在某处吗?如果是这样,请在删除该行之前提取它的值。
  • 不,dgv 只显示“项目”和“数量”。
  • 使用行的.DataBoundItem 属性访问其基础数据记录。
  • 如果您将 Id 添加为 hidden column,那么您可以检索它以删除该项目
  • 如何检索“id”号码?我当前的代码是:int id = Convert.ToInt32(dataGridView1.SelectedCells[0].Value);,但变量 id 在此语句中未被识别:sqlcmd = new SQLiteCommand("DELETE FROM table1 WHERE id= " + id + "", sqlconnection);

标签: c# winforms sqlite datagridview


【解决方案1】:

首先 - 在从网格中删除行之前,您需要构建 SQLLiteCommand。您可以使用上面 cmets 中建议的任何一种方法。您可以像这样访问 DataBoundItem:

MyRowDataType dataRow = (MyRowDataType)this.dataGridView1.Rows[this.rowIndex].DataBoundItem;

那么你可以这样删除(但你需要知道你的底层数据的类型并将 MyRowDataType 更改为你的数据类型):

sqlcmd = new SQLiteCommand("DELETE FROM table1 WHERE id=" + dataRow.ID, sqlconnection);

或者您可以将 ID 列作为隐藏列添加到 DataGridView 并通过以下方式访问该值:

sqlcmd = new SQLiteCommand("DELETE FROM table1 WHERE id=" + this.dataGridView.Rows[this.rowIndex].Cells["IDColumnName"].Value, sqlconnection);

【讨论】:

  • 我添加了一个 ID 列。我使用了您建议的代码行,但是当我尝试删除项目时出现错误:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引
  • 没关系。我在删除项目后运行了该代码大声笑它现在可以工作了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多