投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/12/18 13:42:20
🔹 ドロップダウンセル (DataGridViewComboBoxCell) を使えば、
 行ごとに(というかセル単位で)ドロップダウンの内容を
 割り当てることができます。
🔸 ドロップダウン列 (DataGridViewComboBoxColumn) を使った場合、
 すべての列が同じ一覧を共有することになってしまいます。
🔹 列テンプレートが、テキスト列 (DataGridViewTextBoxColumnl) や
 ドロップダウン列(DataGridViewComboBoxColumn) 、あるいはそれ以外であったとしても、
 特定のセルだけのみを、別のセルタイプに置き換えることは可能です。
🔸 セル単位での設定が行われると「非共有行」となるため、共有行に比べて
 負荷が高くなりがちです。通常は気にするほどでもないと思いますが、
 データ量が非常に多いテーブルの場合は、仮想モードの併用も検討してみてください。


そしてるきおさんの例も私の例も、該当セルに対する DataGridViewComboBoxCell クラスの
インスタンスを操作することで実現しています。

るきおさんのコードでは、最初にドロップダウン列を設定しています。
これにより、該当列のすべての行がドロップダウンセルになるので、
データ型を DataGridViewComboBoxCell に DirectCast して操作しています。

一方、私のコードでは 0列目をテキストボックス列に設定しているため、
0 列目のすべての行がテキスト型のセルになっているのですが、
0 列目の 1 行目 2 行目のみ、ドロップダウンセルに差し替えるため、
新しい DataGridViewComboBoxCell インスタンスを作り、それをセットしています。

ちなみに、セル単位でのアクセスのためには、
 A:『DataGridView1.Rows(行).Cells(列)』
 B:『DataGridView1(列, 行)』
 C:『DataGridView1.Item(列, 行)』
のいずれの構文も使えます。

ドロップダウンされるデータ登録のために、るきおさんのコードでは
.Items.Add を使い、私のコードでは .DataSource を使っていますが、本質は同じことです。

殆どの列で同じ一覧を使い、特定の行だけで一覧を差し替えたいような場合は、
列全体に .DataSource を指定し、特定の行だけ別の .DataSource を設定しなおすと良いでしょう。


ただし同じドロップダウンに対して、.Items.Add と .DataSource を
同時に適用することは出来ませんので御注意ください。

たとえば、ドロップダウン列(DataGridViewComboBoxColumn)に対して、
.DataSource を設定していた場合、特定の行のドロップダウンだけを
.Items.Clear() したり .Items.Add することはできません。

全体は DataSource で設定し、一部の行だけは Items.Add を使いたい場合には
該当セルに DataGridViewComboBoxCell のインスタンスを割り当てなおすことも出来ます。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    '  列全体に DataSource を割り当てています 
    Dim col As New DataGridViewComboBoxColumn() With {.Name = "col", .HeaderText = "さんぷる"}
col.DataSource = New String() { "マリキータ",  "るきお""魔界の仮面弁士" }
    dgv.Columns.Add(col)

    'テスト用に 10 行ほど追加 
    For r = 0 To 9
        dgv.Rows.Add()
    Next

    ' 列全体が DataSource 方式なら、一部の行(ここでは 0 行目)のみを 
    ' 別の DataSource にしても構いません 
    DirectCast(dgv(col.Index, 0), DataGridViewComboBoxCell).DataSource = New String() { "将棋",  "チェス""囲碁" }


    ' 列全体が DataSource 方式の場合、一部の行(ここでは 3 行目)のみを 
    '  .Items.Clear や .Items.Add することはできません 
    'DirectCast(dgv(col.Index, 3), DataGridViewComboBoxCell).Items.Clear() 

    ' ただし、DataGridViewComboBoxCell の新しいインスタンスをセットすれば、 
    ' 一部の行(ここでは 3 行目)に対して .Items 方式に切り替えることが出来ます 
    Dim comboBoxCell3 As New DataGridViewComboBoxCell()
    dgv(col.Index, 3) = comboBoxCell3
    comboBoxCell3.Items.Add("りんご")
    comboBoxCell3.Items.Add("バナナ")
    comboBoxCell3.Items.Add("ぶどう")
End Sub