0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIに頼り切って家計簿アプリを追加開発する。:商品削除ボタン実装

0
Last updated at Posted at 2026-06-04

はじめに

前回までで、家計簿アプリが一旦完成しました。(AIがやりました)
今回は商品削除ボタンを実装します。

プロンプト

新規登録画面にて、一度登録された商品が削除出来ない
行削除ボタンを実装してください。

回答

支出登録画面の DataGridView(dgvItems) に対して、

選択行削除

を実装する方法です。


1. 削除ボタン追加

Designer

private Button btnDeleteItem;

InitializeComponent

btnDeleteItem = new Button();

btnDeleteItem.Location =
    new Point(700, 350);

btnDeleteItem.Size =
    new Size(120, 30);

btnDeleteItem.Text =
    "行削除";

btnDeleteItem.Click +=
    btnDeleteItem_Click;

Controls.Add(btnDeleteItem);

2. 削除処理

private void btnDeleteItem_Click(
    object sender,
    EventArgs e)
{
    if (dgvItems.CurrentRow == null)
    {
        MessageBox.Show(
            "削除する行を選択してください。");

        return;
    }

    if (MessageBox.Show(
        "選択行を削除しますか?",
        "確認",
        MessageBoxButtons.YesNo,
        MessageBoxIcon.Question)
        != DialogResult.Yes)
    {
        return;
    }

    dgvItems.Rows.Remove(
        dgvItems.CurrentRow);

    RecalculateTotalAmount();
}

3. 合計再計算

既に実装済みなら不要です。

private void RecalculateTotalAmount()
{
    decimal total = 0;

    foreach (DataGridViewRow row
        in dgvItems.Rows)
    {
        if (row.IsNewRow)
        {
            continue;
        }

        decimal amount =
            Convert.ToDecimal(
                row.Cells["colAmount"].Value ?? 0);

        int quantity =
            Convert.ToInt32(
                row.Cells["colQuantity"].Value ?? 0);

        total += amount * quantity;
    }

    txtAmount.Text =
        total.ToString();
}

4. DB登録済商品の削除対応(推奨)

修正モードでは、

画面から消えた行
↓
DBからも削除

する必要があります。

そのため ExpenseItems.Id を保持する隠し列を追加します。


DataGridView

DataGridViewTextBoxColumn colItemId =
    new DataGridViewTextBoxColumn();

colItemId.Name =
    "colItemId";

colItemId.Visible =
    false;

dgvItems.Columns.Add(colItemId);

ロード時

dgvItems.Rows.Add(
    item.Id,
    item.ProductName,
    item.Category,
    item.Amount,
    item.Quantity,
    item.TaxRate,
    item.Note);

削除対象保持

フォームフィールド

private List<long> _deleteItemIds =
    new List<long>();

削除時

private void btnDeleteItem_Click(
    object sender,
    EventArgs e)
{
    if (dgvItems.CurrentRow == null)
    {
        return;
    }

    object id =
        dgvItems.CurrentRow
            .Cells["colItemId"]
            .Value;

    if (id != null
        && long.TryParse(
            id.ToString(),
            out long itemId))
    {
        _deleteItemIds.Add(itemId);
    }

    dgvItems.Rows.Remove(
        dgvItems.CurrentRow);

    RecalculateTotalAmount();
}

保存処理で削除実行

foreach (long itemId
    in _deleteItemIds)
{
    string sql =
    @"
    DELETE
    FROM ExpenseItems
    WHERE Id = @Id
    ";

    using SqliteCommand cmd =
        new SqliteCommand(
            sql,
            conn,
            tran);

    cmd.Parameters.AddWithValue(
        "@Id",
        itemId);

    cmd.ExecuteNonQuery();
}

おすすめは 後者(DB削除対応版) です。

現在のアプリは修正モードを持っているため、画面から行を消すだけでは DB に残り続けてしまいます。ExpenseItems.Id の隠し列と _deleteItemIds 管理を追加しておくと、修正・削除が正しく動作します。

動作確認

実際起動するとこうなります。
image.png
image.png

最後に

次回は機能全体の再設計を行います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?