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
るきおさん、魔界の仮面弁士さんの力のおかげで実装することができました!
まだまだ初心者なのでこれからもっと勉強していきたいとおもいます
ありがとうございました。