Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

DataGridViewのコンボボックスの値の表示について 解決済み

タグの編集...

投稿者 おぼっちゃま   ()   投稿日時 2022/1/22 20:18:11
visual basicにてdatagridviewを使って,コンボボックスを7列作り、その中でひとつだけを選択し、ラベルにその値を表示させるにはどういたらよいかわかりません。 また、その値を違う値に変えてラベルに表示させるにはどのような操作を行ったらよいか教えて頂きたいです。

投稿者 るきお   (社会人)   投稿日時 2022/1/22 22:26:30
Windowsフォームアプリでしょうか。
DataGridViewに列を追加するには、プロパティウィンドウなどを使ってデザイン時に追加する方法とプログラムで追加する方法があります。

>datagridviewを使って,コンボボックスを7列作り、
プロパティウィンドウなどでやる場合、プロパティウィンドウでDataGridViewのColumnsプロパティをクリックし、右側の…ボタンをクリックし、表示される「列の編集」ダイアログで、「追加」ボタンをクリックし、型にDataGridViewComboBoxColumnを選択して、追加をクリックします。これを7回行うと7列分のコンボボックスを追加できます。

>その中でひとつだけを選択し
下記の例で、Button2をクリックすると、3列目のコンボボックスを選択します。
他の列を選択したい場合は、Cells(2) の 2 を変更します。

>ラベルにその値を表示させる
下記の例で、Button2をクリックすると、3列目のコンボボックスの値を Label1に表示します。
事前に何か選択しておかないと、値がないので何も表示されません。
先にButton1をクリックしておくと、値の候補をセットするようにしておきましたのでよろしければ参考にしてください。

>その値を違う値に変えてラベルに表示させる
下記の例で、Button3をクリックすると、3列目のコンボボックスの値を、その時点で選択されてたのとは違う値に変更し、それをラベルに表示します。

下記のサンプルはVisual Studio 2022で.NET 6.0を使って作成しました。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    '7列分のコンボボックスに選択肢をセットします。 

    Dim c0 As DataGridViewComboBoxColumn = CType(DataGridView1.Columns(0), DataGridViewComboBoxColumn)
    c0.Items.AddRange("水星""金星""地球""火星")

    Dim c1 As DataGridViewComboBoxColumn = CType(DataGridView1.Columns(1), DataGridViewComboBoxColumn)
    c1.Items.AddRange("殷""周""秦""漢")

    Dim c2 As DataGridViewComboBoxColumn = CType(DataGridView1.Columns(2), DataGridViewComboBoxColumn)
    c2.Items.AddRange("ウル""ウルク""ラガシュ")

    Dim c3 As DataGridViewComboBoxColumn = CType(DataGridView1.Columns(3), DataGridViewComboBoxColumn)
    c3.Items.AddRange("明治""大正""昭和""平成""令和")

    Dim c4 As DataGridViewComboBoxColumn = CType(DataGridView1.Columns(4), DataGridViewComboBoxColumn)
    c4.Items.AddRange("神武""綏靖""安寧""懿徳")

    Dim c5 As DataGridViewComboBoxColumn = CType(DataGridView1.Columns(5), DataGridViewComboBoxColumn)
    c5.Items.AddRange("三畳紀""ジュラ紀""白亜紀")

    Dim c6 As DataGridViewComboBoxColumn = CType(DataGridView1.Columns(6), DataGridViewComboBoxColumn)
    c6.Items.AddRange("春""夏""秋""冬")

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    '7列あるコンボボックスの1つを選択する 
    'ここでは3列目を選択することとします。 
    DataGridView1.Select()
    DataGridView1.CurrentCell = DataGridView1.CurrentRow.Cells(2)

    '選択したのがわかりやすいようにコンボボックスを展開しておきます。 
    DataGridView1.BeginEdit(True)
    Dim comboBox As ComboBox = CType(DataGridView1.EditingControl, ComboBox)
    comboBox.DroppedDown = True

    'ラベルにその値を表示する 
    'コンボボックスで何も選択されていなければラベルは何も表示されません。 
    Label1.Text = comboBox.Text


End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

    'コンボボックスの値を違う値に変えてラベルに表示 
    'ここでは3列目のコンボボックスの値を変えてラベルにっ表示します。 
    Dim cell As DataGridViewComboBoxCell = CType(DataGridView1.CurrentRow.Cells(2), DataGridViewComboBoxCell)
    If CStr(cell.Value) = "ラガシュ" Then
        cell.Value = "ウル"
    Else
        cell.Value = "ラガシュ"
    End If

    Label1.Text = CStr(cell.Value)

End Sub



投稿者 おぼっちゃまん   ()   投稿日時 2022/1/23 13:40:37
返答ありがとうございます。
はい。Windowsフォームアプリでございます。
るきおさんのサンプルを作成し、使ってみたのですが自分がやりたいことは、
"R301","フラットライン","ハボック",            →      アサルトライフル
"R99","ボルト","ブラウラー",    →           サブマシンガン
"ロングボウ","チャージライフル","クレバー",  →   スナイパーライフル

のようにコンボボックスで選択した値をそのコンボボックスごとに統一して違う値に変更するということがしいたいのですが、可能でしょうか。
また、3列目だけでなくすべての列も選択し、テキストに表示させるにはどうしたらよいでしょうか。


投稿者 るきお   (社会人)   投稿日時 2022/1/23 14:10:59
>のようにコンボボックスで選択した値をそのコンボボックスごとに統一して違う値に変更するということがしいたい
ごめんなさい。意味が分かりません。
コンボボックスで「R301」を選択したら、ラベルに「アサルトライフル」と表示したいということでしょうか?

>3列目だけでなくすべての列も選択
これも意味が分かりません。

具体的なシナリオ(使用例)を1つ教えていただけますか?
たとえば、次のような感じで教えていただければと思います。
・DataGridViewに7列あり、それぞれの列はコンボボックスである。
・1列目のコンボボックスは"R301","フラットライン","ハボック"のどれかの値を選択できる。
・ユーザーが1列目のコンボボックスで"R301"を選択すると、Label1に「アサルトライフル」と表示される。
・2列目のコンボボックスは"R99","ボルト","ブラウラー"のどれかの値を選択できる。
・ユーザーが2列目のコンボボックスで"R99"を選択すると、Label2に「サブマシンガン」と表示される。



投稿者 おぼっちゃまん   ()   投稿日時 2022/1/23 14:35:36
すいません。そこが曖昧になっているからこそできないのかも知れません。

・DataGridViewに7列あり、それぞれの列はコンボボックスである。
・1列目のコンボボックスは"R301","フラットライン","ハボック"のどれかの値を選択できる。
・ユーザーが1列目のコンボボックスで"R301"を選択すると、Label1に「アサルトライフル」と表示される。
・また、"フラットライン"を選択時にもLabelには「アサルトライフル」と表示される。ハボック選択時にも同様。
・2列目のコンボボックスは"R99","ボルト","ブラウラー"のどれかの値を選択できる。
・ユーザーが2列目のコンボボックスで"R99"を選択すると、Label1に「サブマシンガン」と表示される。
・また、"ボルト"を選択時にもLabelには「サブマシンガン」と表示される。ブラウラー選択時にも同様。
・この仕様を7列作り、ユーザー側は7列のコンボボックスのうち、1列のコンボボックスのみ選択できる。
・ユーザー側は複数のコンボボックスを選択できない。

こんな感じでどうでしょうか。



投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/1/23 21:13:22
そもそもなぜ DataGridView なのでしょうか。
ComboBox を 7 つ並べる画面構成では駄目なのですか?


DataGridView というからには、複数の行(0 行以上)があるはずですよね。
そうすると、1 行目と 2 行目で、ドロップダウンの選択状況が異なることもあるでしょう。
その場合、Label にはどのよう表示させることを想定していますか?

行数分の Label を動的に生成して、それぞれ別々に表示する想定?
一つの Label に対して、カンマ区切りや改行区切りで各行の選択状況を表示する?
あるいは Label ではなく、DataGridView の別の列に読み取り専用テキストとして「アサルトライフル」と表示したい?


もしも、DataGridView の行数が 1 行以下を前提としているのなら、
そもそも DataGridView を使う意図が分からないです…。

投稿者 るきお   (社会人)   投稿日時 2022/1/23 21:16:04
こんなところでどうでしょうか?
下記サンプルでは、あからじめプロパティウィンドウで複数列のコンボボックスをセットしたうえで、Button1をクリックするとデータをセットします。その後は、だいたいおぼっちゃまんさんが提示した動作になっていると思います。

>・この仕様を7列作り、ユーザー側は7列のコンボボックスのうち、1列のコンボボックスのみ選択できる。
3列目以降の選択肢と、選択した時にラベルに表示する文字列が不明なので、下記サンプルでは2列分にしました。

>ユーザー側は複数のコンボボックスを選択できない。
選択できないようにする手段がわからなかったので、下記サンプルでは最初に値を選択したセル以外は読み取り専用にするようにしました。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'コンボボックスに選択肢をセットします。 
    Dim c0 As DataGridViewComboBoxColumn = CType(DataGridView1.Columns(0), DataGridViewComboBoxColumn)
    c0.Items.AddRange("R301""フラットライン""ハボック")
    c0.Tag = "アサルトライフル"

    Dim c1 As DataGridViewComboBoxColumn = CType(DataGridView1.Columns(1), DataGridViewComboBoxColumn)
    c1.Items.AddRange("R99""ボルト""ブラウラー")
    c1.Tag = "サブマシンガン"

End Sub

Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    If TypeOf e.Control Is ComboBox Then
        Dim comboBox As ComboBox = CType(e.Control, ComboBox)
        '1回だけコンボボックスとSelectedValueChangedイベントを結びつけます。 
        If CStr(comboBox.Tag) <> "eventhandled" Then
            comboBox.Tag = "eventhandled"
            AddHandler comboBox.SelectedValueChanged, AddressOf ComboBox_SelectedValueChanged
        End If
    End If
End Sub

Private Sub ComboBox_SelectedValueChanged(sender As Object, e As EventArgs)

    '同じ行で現在のセル以外を読み取り専用にします。 
    For Each cell As DataGridViewCell In DataGridView1.CurrentRow.Cells
        If cell IsNot DataGridView1.CurrentCell Then
            cell.ReadOnly = True
        End If
    Next

    'ラベルにこの列のTagを表示します。 
    '列のTagにはあらかじめ"アサルトライフル"や"サブマシンガン"をセットしておきます。 
    Label1.Text = CStr(DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Tag)

End Sub


投稿者 るきお   (社会人)   投稿日時 2022/1/23 21:25:43
そういえば、「コンボボックスを選択する」という表現はわかりにくく、たぶん、おぼっちゃまんさんの場合は「コンボボックスから値を選択する」と表現したほうが適切かなと思います。

「コンボボックスを選択する」と言われると、コンボボックス自体を選択するという意味になり、これは、コンボボックスでキーボード入力やマウス操作を受け付けられるようにするという意味になります。

>コンボボックスを7列作り、その中でひとつだけを選択し、
7つあるコンボボックスのうち、値を選択できるのは1つだけという意味だったんですね。
最初はこれがわかりませんでした。

>1列のコンボボックスのみ選択できる。
ある列のコンボボックスから値を選択すると他の列のコンボボックスでは値を選択できないという意味ですね。

「コンボボックスを選択する」の意味は理解できたつもりですが、魔界の仮面弁士さんが指摘されているようにDataGridViewの「行」をどういう風に考えられているのかはいまだに理解できません。



投稿者 おぼっちゃまん   ()   投稿日時 2022/1/23 22:26:42
るきおさん、魔界の仮面弁士さんの力のおかげで実装することができました!
まだまだ初心者なのでこれからもっと勉強していきたいとおもいます
ありがとうございました。