投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/8/2 15:01:16
> まずはプログラムを正常に動かすのが第一なのでこちらの箇所だけ抜粋します。

「動作しないコード」の『一部』だけを抜粋されても答えにくいです…。
質問が断片的なため、こちらとしては幾つかのパターンを想定せねばならず、
回答が断片的で雑多になりがちですが、そこは御容赦を。


そちらの状況が分からないため、こちらから幾つかの逆質問をしていますが、
それらに答えていただけると、回答がしやすくなります。
ここでいう確認事項というのは、たとえば
 「この場合、削除したいのは以下のいずれでしょうか?」
などのことです。
(他にも確認していた点がありますが、さしあたって重要なのは上記です)


>> gridRow.Cells("注文番号").Value
> と書くとgridRowは宣言されていません。

そのコードは、どこに書いたのでしょうか?


先の回答では、
>> 一方、先の例の
>>> For Each gridRow As DataGridViewRow In DataGridView1.SelectedRows
>> の場合、「gridRow」が DataGridViewRow 型で得られますので、
と書いていたと思います。
上記では gridRow が宣言されていますので、これの For Each ~ Next の
ブロック内を書き換えているのであれば、未宣言エラーにはなっていないと思います。


もし、【行全体が選択されているものを対象とする場合】ではなく、
【選択されているセルの行を対象とする場合】を参考にされた場合、
> For Each rowView In rows
になっていたと思います。この場合の rowView は DataGridViewRow 型ではありません。
ここでは As 句が省略されていますが、実際には As DataRowView に相当しますので、
As DataGridViewRow の場合とは、若干異なるコードになります。


このパターンを採用していたのであれば、
 Dim o As Object = rowView("注文番号")
などとすることで、各行の注文番号を取り出せます。

ただしそれは、DataGridView が ReadOnly の場合の話です。

DataGridView を編集可能にしていた場合は、注文番号欄が
ユーザーに修正される可能性がありますので、
現在の表示値ではなく、修正前の値で WHERE 文を
組み立てる必要があります。


それには、DataRow 型のオブジェクトを取得することになります。


もしも、【選択されているセルの行を対象とする場合】において、編集前の値を
取り出す必要がある場合には、【DELETE 文を手動で生成する場合】の例で述べた
> For Each rowView As DataRowView In ……
>  Dim row As DataRow = rowView.Row
のようにして、DataRowView の元となっている DataRow を取り出す必要があります。

つまりこういうことですね。
Dim rows = From cell As DataGridViewCell In DataGridView1.SelectedCells
           Let rowView = DirectCast(cell.OwningRow.DataBoundItem, DataRowView)
           Where rowView IsNot Nothing
           Select rowView Distinct
For Each rowView As DataRowView In rows
    Dim row As DataRow = rowView.Row
    ': 
    ': 
Next

あるいはその直前の LINQ 式を修正して、これでも OK です。
Dim rows = From cell As DataGridViewCell In DataGridView1.SelectedCells
           Let rowView = DirectCast(cell.OwningRow.DataBoundItem, DataRowView)
           Where rowView IsNot Nothing
           Select rowView.Row Distinct
For Each row As DataRow In rows
    ': 
    ': 
Next


これで DataRow 型のオブジェクトが取り出せました。


あるいは、【行全体が選択されているものを対象とする場合】のように、
As DataGridViewRow なオブジェクトから辿る場合は、先のサンプルにもあるように
Dim rowView = TryCast(gridRow.DataBoundItem, DataRowView)
とすれば、DataRowView が得られますので、そこから先述の方法で、
Dim row As DataRow = rowView.Row
で DataRow が取り出せます。


これらの方法で DataRow 型のオブジェクトを取得した後は、
下記を使い分けることで、編集前バージョンもしくは編集後バージョンの値を取得できます。
Dim o0 As Object = row("注文番号")
Dim o1 As Object = row("注文番号", DataRowVersion.Current)
Dim o2 As Object = row("注文番号", DataRowVersion.Original)
Dim o3 As Object = row("注文番号", DataRowVersion.Proposed)
Dim o4 As Object = row("注文番号", DataRowVersion.Default)



(1) o0 と o4 は同じ意味です。DataRowVersion を指定しない場合は Default 扱いです。

(2) o1 の Current は「現在の値」を示します。DataGridView に表示されている値がこれです。
 削除マークの付いた行(RowState = Deleted)で呼び出すと VersionNotFoundException の例外となります。

(3) o2 の Original は「元の値」を示します。DELETE 文の WHERE に渡すときに使えます。
 新規追加したばかりの行(RowState = Added)で呼び出すと VersionNotFoundException の例外となります。

(4) o3 の Proposed は「提案値」を示します。
 今回のケースで呼び出すと VersionNotFoundException の例外となります。
 これはたとえば、DataGridView 上で編集されている最中で、まだその値が
 DataRow 側に反映される前といった、一時的な状態を指し示します。

(5) o4 の Default は「既定値」です。省略して o0 表記でも書けます。
 これは該当行の RowState プロパティに応じて o1~o3 のいずれかを意味します。
 RowState が 追加(Added)/修正済み(Modified)/未編集(Unchanged)の
 いずれかの場合は o1 (Current) 相当の動作です。
 RowState が 削除済み(Deleted)なら o2 (Original) 相当の動作です。
 RowState が未割り当て(Detached)なら o3 (Propsed) 相当の動作です。