
実現したいこと
①DataTableとDataGridViewのバインドをしたものをDataGridViewのほうから1行選んで削除・編集したいです。
違うボタンを押すことで「選択されたデータグリッドが削除→データテーブルも削除」
また違うボタンを押すことで「選択されたデータグリッドが削除→データテーブルも削除→コンボボックスとNumericUpDownに入れた数字をデータテーブルに入れる→データグリッドに表示」
②CSVファイルを読み込んでDataTableにいれ、DataGridViewで表示
前提
「コンボボックスとNumericUpDownに入れた数字をデータテーブルに入れる→データグリッドに表示させる」がボタンで実行されるという状態です。
発生している問題・エラーメッセージ
Data Tableから読み込んでいるData Grid Viewの1行を選択的に削除するにはどうしたらいいのでしょうか?
今現状、データグリッドを削除・編集するというコードのみで、選択的に消されないという状況です。しかもデータグリッドからも消されない。
また、ファイル選択後、読み込みをしようとするとエラーが出ます。(//*1)
→ハンドルされていない例外
System.Data.OleDb.OleDbException: '1 つ以上の必要なパラメーターの値が設定されていません。'
という表示が出ます。
該当のソースコード
using System; using System.IO; using System.Windows.Forms; using System.Data; using System.Text; using System.Collections.Generic; using System.Security.Cryptography; using System.Data.OleDb; using System.Runtime.InteropServices.ComTypes; using System.Windows.Forms.VisualStyles; namespace recruitPGwork { public partial class LunchBoxMemoForm : Form { private const string NewLine = "\r\n"; private readonly DataTable dt; /// <summary> /// コンストラクタ /// </summary> public LunchBoxMemoForm() { InitializeComponent(); //DataTable作成 dt = new DataTable("ItemList"); dt.TableName = "ItemList"; dt.Columns.Add("日付", typeof(string)); dt.Columns.Add("商品", typeof(string)); dt.Columns.Add("個数", typeof(int)); dt.Columns.Add("値段", typeof(int)); ItemListDataGridView.DataSource = dt; } /// <summary> /// 合計金額を求める /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void CalculateButton_Click(object sender, EventArgs e) { // 品物が選択されているか判定する if (string.IsNullOrWhiteSpace(ItemNameComboBox.Text)) { MessageBox.Show("品物を選択してください"); return; } // 個数に1以上の数値が入力されているかチェックする int count = (int)CountNumericUpDown.Value; if (count == 0) { MessageBox.Show("1つ以上の数字を入力してください"); return; } // 単価が入力されているかの確認 int ListPrice = (int)ListPriceNumericUpDown.Value; if (ListPrice == 0) { MessageBox.Show("単価を入力してください"); return; } // 今回の金額 var price = ListPrice * count; // 買い物リスト用の文字列を作成する var date = dateTimePicker.Value.ToLongDateString(); var item = ItemNameComboBox.Text; // 買い物リストに追加する if (0 == dt.Rows.Count) { DataRow row = dt.NewRow(); row["日付"] = date; row["商品"] = item; row["個数"] = count; row["値段"] = price; dt.Rows.Add(row); } else if (dt.Rows[0].Field<string>("日付") == date) { date = " "; DataRow row = dt.NewRow(); row["日付"] = date; row["商品"] = item; row["個数"] = count; row["値段"] = price; dt.Rows.Add(row); } else { dt.Clear(); DataRow row = dt.NewRow(); row["日付"] = date; row["商品"] = item; row["個数"] = count; row["値段"] = price; dt.Rows.Add(row); GraphTextBox.Text = ""; TotalTextBox.Text = ""; } } /// <summary> /// 買い物リストを削除する /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DeletionButton_Click(object sender, EventArgs e) { foreach (DataGridViewRow r in ItemListDataGridView.SelectedRows) { if (!r.IsNewRow) { ItemListDataGridView.Rows.Remove(r); } } } /// <summary> /// 買い物リストをcsvファイルから読み込む /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void LoadingButton_Click(object sender, EventArgs e) { var dlg = new OpenFileDialog() { Title = "ファイルの選択", CheckFileExists = true, RestoreDirectory = true, InitialDirectory = @"C:\", FileName = @"ItemList.csv", Filter = "CSVファイル|*.csv|すべてのファイル|*.*" }; if (dlg.ShowDialog() == DialogResult.OK) { OleDbConnection connection; OleDbCommand command; OleDbDataAdapter adapter; DataSet dataset = new DataSet(); DataGrid datagrid = new DataGrid(); connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Path.GetDirectoryName(dlg.FileName) + "\\; Extended Properties=\"Text;HDR=YES;FMT=Delimited\""); command = new OleDbCommand("SELECT [日付], [商品], [個数], [値段] FROM [" + Path.GetFileName(dlg.FileName) + "]", connection); dataset.Clear(); adapter = new OleDbDataAdapter(command); adapter.Fill(dataset); //*1 dt.Columns.Add("日付"); dt.Columns.Add("商品"); dt.Columns.Add("個数"); dt.Columns.Add("値段"); for (int line = 0; line < dataset.Tables[0].Rows.Count; line++) { DataRow data = dataset.Tables[0].Rows[line]; Object[] new_row = new Object[] { String.Format(@"{0} ({1})", data["日付"], data["商品"]), data["個数"], data["値段"] }; dt.Rows.Add(new_row); } datagrid.DataSource = dt; } else { MessageBox.Show("ファイルが見つかりません"); return; } } }
補足情報(FW/ツールのバージョンなど)
VIsualStudio2022 C# .NET Framework フォームデザイナーを用いています。



回答2件
あなたの回答
tips
プレビュー