はじめに
前回までで、家計簿アプリが一旦完成しました。(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 管理を追加しておくと、修正・削除が正しく動作します。
動作確認
最後に
次回は機能全体の再設計を行います。

