datagridviewの削除ボタンにつきまして への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2020/3/19 11:11:36
カレントレコードの削除なら、先の述べた
DeleteItem プロパティを使うのが手っ取り早いでしょう。
コードで実行するなら、BindingSource の RemoveCurrent メソッドを利用できます。
レコード編集中に対応するため、直前に CancelEdit メソッドも呼んでおきましょう。
なお、「現在行が存在しない場合」は削除できずにエラーになりますので、
Position プロパティ等を If 判定するコードも用意しておきましょう。
もしも BindingSource を使っていない場合(DataSet/DataTable/DataView の直接割り当て)なら、
DataRow や DataRowView の Delete メソッドでも OK です。この場合、削除済みの行を
再削除しようとするとエラーになりますので、処理タイミングによっては、
RowState の追加確認が必要になることもあります。
あるいは、DataGridView 側から CurrentCellAddress や CurrentRow を辿るという手も。
DeleteItem プロパティを使うのが手っ取り早いでしょう。
コードで実行するなら、BindingSource の RemoveCurrent メソッドを利用できます。
レコード編集中に対応するため、直前に CancelEdit メソッドも呼んでおきましょう。
なお、「現在行が存在しない場合」は削除できずにエラーになりますので、
Position プロパティ等を If 判定するコードも用意しておきましょう。
もしも BindingSource を使っていない場合(DataSet/DataTable/DataView の直接割り当て)なら、
DataRow や DataRowView の Delete メソッドでも OK です。この場合、削除済みの行を
再削除しようとするとエラーになりますので、処理タイミングによっては、
RowState の追加確認が必要になることもあります。
あるいは、DataGridView 側から CurrentCellAddress や CurrentRow を辿るという手も。
投稿者 T  (社会人)
投稿日時
2020/3/19 10:42:23
> あれ? 「選択された行」ではなく、「現在の行」が削除される仕様では無いですか?
仰る通りです。自分の言葉の選択ミスです。「現在の行」だとするとどういった感じになりますでしょうか?
仰る通りです。自分の言葉の選択ミスです。「現在の行」だとするとどういった感じになりますでしょうか?
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2020/3/19 10:21:00
> DataGridViewにデフォルトで付いてくる削除ボタン(BindingNavigatorDeleteItem)
DataGridView に削除ボタンが付いているわけでは無いですよね。
BindingNavigatorDeleteItem は、BindingNavigator コンポーネントに対して
デザイン時に自動的に追加された ToolStripButton の名前です。
BindingNavigatorDeleteItem と DataGridView コントロールが連動しているように見えるのは、
DataGridView と BindingNavigator の DataSource が共通であるからですね。
> そのまま新しく作ったボタンに置き換えたいです。
デザイン時に画像を置き換えたいなら、右クリックして「イメージの設定」です。
新しいボタンを追加したいなら、フォーム上に貼られた BindingNavigator を選択すれば、
アイテム追加用のドロップダウンが現れるでしょう。
デザイン時に位置を入れ替えたいなら、ドラッグ&ドロップで移動させるか、
項目コレクション エディターダイアログから調整できます。
アイテムを実行時に追加したいなら、MindingNavigator1.Items.Add メソッドでどうぞ。
追加したアイテムは、必要に応じて、BindingNavigator コンポーネントの
DeleteItem プロパティ および AddNewItem / CountItem / PositionItem プロパティや
Move{First/Last/Next/Previous}Item プロパティに割り当てることで、
既定のバインド操作を組み込むことができます。
もちろん、自前でクリック時の処理を適宜仕込むということもできますね。
> 「選択された行のみを削除する」という機能
あれ? 「選択された行」ではなく、「現在の行」が削除される仕様では無いですか?
「現在行」ではなく、DataGridView の「選択行すべて」を削除したいのであれば、
DeleteItem プロパティに割り当てずに Click イベントを使うようにして、こんな感じでどうでしょう。
DataGridView に削除ボタンが付いているわけでは無いですよね。
BindingNavigatorDeleteItem は、BindingNavigator コンポーネントに対して
デザイン時に自動的に追加された ToolStripButton の名前です。
BindingNavigatorDeleteItem と DataGridView コントロールが連動しているように見えるのは、
DataGridView と BindingNavigator の DataSource が共通であるからですね。
> そのまま新しく作ったボタンに置き換えたいです。
デザイン時に画像を置き換えたいなら、右クリックして「イメージの設定」です。
新しいボタンを追加したいなら、フォーム上に貼られた BindingNavigator を選択すれば、
アイテム追加用のドロップダウンが現れるでしょう。
デザイン時に位置を入れ替えたいなら、ドラッグ&ドロップで移動させるか、
項目コレクション エディターダイアログから調整できます。
アイテムを実行時に追加したいなら、MindingNavigator1.Items.Add メソッドでどうぞ。
追加したアイテムは、必要に応じて、BindingNavigator コンポーネントの
DeleteItem プロパティ および AddNewItem / CountItem / PositionItem プロパティや
Move{First/Last/Next/Previous}Item プロパティに割り当てることで、
既定のバインド操作を組み込むことができます。
もちろん、自前でクリック時の処理を適宜仕込むということもできますね。
> 「選択された行のみを削除する」という機能
あれ? 「選択された行」ではなく、「現在の行」が削除される仕様では無いですか?
「現在行」ではなく、DataGridView の「選択行すべて」を削除したいのであれば、
DeleteItem プロパティに割り当てずに Click イベントを使うようにして、こんな感じでどうでしょう。
Dim rows = DataGridView1.SelectedRows
For r = rows.Count - 1 To 0 Step - 1
Dim rowView = DirectCast(rows(r), DataRowView)
rowView.Delete()
Next
DataGridView1.ClearSelection()
投稿者 T  (社会人)
投稿日時
2020/3/19 09:46:15
お世話になります。
VisualStudio2010でDataGridViewにデフォルトで付いてくる削除ボタン(BindingNavigatorDeleteItem)も機能をそのまま新しく作ったボタンに置き換えたいです。もしくは、BindingNavigatorDeleteItemを押したときに起こる、「選択された行のみを削除する」という機能を新規作成したボタンに置き換えられればどんな手段でも構いません。
VisualStudio2010でDataGridViewにデフォルトで付いてくる削除ボタン(BindingNavigatorDeleteItem)も機能をそのまま新しく作ったボタンに置き換えたいです。もしくは、BindingNavigatorDeleteItemを押したときに起こる、「選択された行のみを削除する」という機能を新規作成したボタンに置き換えられればどんな手段でも構いません。
RemoveCurrent メソッドを利用してボタンを置き換えることができました。
ありがとうございました。