DataGridViewの指定行にコンボボックスを配置するには?

解決


カプチーノ  2007-11-23 07:19:21  No: 144127

毎々参考にさせていただいております。
今更ながら、最近になってVisualStduio2005をはじめたのですが、DataGridView
で躓いてしまったので、ご教示いただければと質問させていただきます。

デザインモードにて、DataGridViewの3列目に下記の列を設定しました。
  (Name)    :"Column3"
  ColumnType:DataGridViewComboBoxColumn

このあと、コード編集画面にて下記コードで実行しました。
Private Sub Form1_Load( ------------ 省略 ------------- )
    Dim column As New DataGridViewComboBoxColumn
    column.Items.Add("♂")
    column.Items.Add("♀")

    With Me.DataGridView1
        .Columns.Insert(2,column) ----------------------- ①
    End With
End Sub

これですと、デザイン時にコンボボックス列として設定した"Column3"の前に
①のコンボボックス(項目は"♂","♀")が配置されてしまい、その後に項目
が何もない"Column3"が表示されてしまいます。
(コードがそう書いてあるので、当たり前といえばそうなのですが、、)

目的の処理を実現するには、現状の私の知識では、
  ②①で列をInsertした後、後ろの"Column3"列を削除する。
  ③コードで最初の列から順にColumn.Addしていく。
しかない感じです。

デザイン側では列の型などを設定し、コード側では項目だけを設定するには、
どうしたらよろしいでしょうか?
どなたかご教示いただければ幸いです。よろしくお願いいたします。


魔界の仮面弁士  2007-11-23 08:06:02  No: 144128

> DataGridViewの指定行にコンボボックスを配置するには?
> DataGridViewの3列目に下記の列を設定しました。

うん?
「行」単位で配置したいのですか?
「列」単位で配置したいのですか?

列指定であれば、DataGridViewComboBoxColumn で良いですけど、
行指定やセル指定であれば、DataGridViewComboBoxCell です。

DataGridView1.AllowUserToAddRows = False
DataGridView1.RowCount = 5
DataGridView1.ColumnCount = 4

Dim cmb As New DataGridViewComboBoxCell()
cmb.Items.AddRange("aaa", "bbb", "ccc")
DataGridView1(1, 2) = cmb

> コード側では項目だけを設定するには、
こんな感じとか。

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
  Column3.Items.Add("♂")
  Column3.Items.Add("♀")
End Sub

# 上記の Column3 という部分は、列デザイナ画面で指定した Name にしてください。


カプチーノ  2007-11-23 09:34:48  No: 144129

魔界の仮面弁士さん、毎々お世話になっております。
>うん?
>「行」単位で配置したいのですか?
>「列」単位で配置したいのですか?
おっしゃるとおりです。
指定行ではなく、指定列でした。すみませんでした。

>Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
>  Column3.Items.Add("♂")
>  Column3.Items.Add("♀")
>End Sub
上の方(.AddRangeの方)も非常に参考になりましたが、今回はこちらの記述で
解決しました。まさにこれがやりたかったことです。

記述の仕方にこだわる必要も意味もなく、そこでとまってしまっては本末転倒
なのかもしれませんが、
  ●型とかの指定をデザイン画面で行い
  ●実際のデータだけコードで入れる
というスタイルで処理したかったため、助かりました。

>Column3.Items.Add
という部分を、"Me.DataGridView."のように、DataGridView内のものとして
ドットに続く部分で処理するのかと思いましたが、いきなり"Column3"で呼び
出せばできたのですね・・・。
"Me.DataGridView.Column3.Iitems.Add"というのはでてこなかったため、"?"
となってしまいました。

何はともあれ、ありがとうございました。精進させていただきます。


魔界の仮面弁士  2007-11-23 22:20:27  No: 144130

> "Me.DataGridView.Column3.Iitems.Add"というのはでてこなかったため、
> "?"となってしまいました。

DataGridView から辿るのであれば、Column3 は「列」のオブジェクトですから、
  Me.Column3.Items.AddRange("♂", "♀")
のかわりに、
  CObj(Me.DataGridView1.Columns(2)).Items.AddRange("♂", "♀")
もしくは
  CObj(Me.DataGridView1.Columns("Column3")).Items.AddRange("♂", "♀")
のように、Columns プロパティ経由で書くことになります。

Option Strict On であれば、
  DirectCast(Me.DataGridView1.Columns(2), DataGridViewComboBoxColumn).Items.AddRange("♂", "♀")
ですね。
# キャストが必要なので、IntelliSense に頼っていると見つけられないかも。


カプチーノ  2007-11-26 17:58:48  No: 144131

魔界の仮面弁士さん、お手数おかけします。
わざわざ追記していただいてありがとうございました。
今は意味がよくわからないのですが、ソースをよく見て意味を理解したいと
思います。
お返事が遅くなりすみませんでした。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加