@cabu

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

vb.netでformApplicationを作成した場合のdataGridViewの操作感について

vb.netを初めて触っています。

dataGridViewを作成して行の中にドロップダウンリストを埋めています。
このドロップダウンリストの操作感が悪く、3度クリックしないとドロップダウンリストの内容が表示されません。(ドロップダウンリストが展開されない。)

画面の挙動を見ていると、1クリック目で行が選択される、2クリック目で列が選択される、3クリック目でドロップダウンリストが展開、のような動きをしているようです。

これをワンクリックで展開できるようにしたいです。行選択、列選択のような動きをカットして、Webブラウザのドロップダウンリストのように、簡単に展開したいです。

方法はありますでしょうか。

※タグ間違ってたらごめんなさい。

指摘をいただいたので、ソース追記します。プロパティとかで解決できるような現象かと思っていました。
また、環境は以下です。
ターゲットフレームワーク : .NET Framework 4.7.2
アプリケーションの種類 : Windows フォームアプリケーション
(編集に使ったツール : Visual Studio 2017)

:test.vb
If a=1 then
Me.FileDataGrid.Rows.Add("" _
                                , Path.GetFileName(aF) _
                                , "")
'ドロップダウンリストを作成する。
Dim BoxsColumn As New DataGridViewComboBoxCell
For Each fTL In localParentform.ParamVO.FileTypeList
   attachedBoxsColumn.Items.Add(fTL)
Next

Me.FileDataGrid.Rows(afRowCount).Cells(2) = attachedBoxsColumnPdf

Else
'似たような処理
End If

何をしているのかというと、datagridに値を埋めるときに、DataGridViewComboBoxCellを使ってドロップダウンリストを作成しています。
Elseの処理も似ているのですが、ドロップダウンリストの中身を条件によって変えているので、こっちではループで詰める元のリストが違っています。やり方は同等です。

0 likes

1Answer

シンタックスハイライト

やり方間違ってるよ!っていうのわかるかた、ぜひ教えてください。

```vb:test.vb
If a=1 then
    Me.FileDataGrid.Rows.Add("" _
    , Path.GetFileName(aF) _
    , "")
    'ドロップダウンリストを作成する。
    Dim BoxsColumn As New DataGridViewComboBoxCell
    For Each fTL In localParentform.ParamVO.FileTypeList
        attachedBoxsColumn.Items.Add(fTL)
    Next

    Me.FileDataGrid.Rows(afRowCount).Cells(2) = attachedBoxsColumnPdf

Else
    '似たような処理
End If

こうですかね :thinking:
あ、ちゃんと最後に ``` をつけるのを忘れずに :thumbsup:

ちゃんとできると以下の様になるかと:

test.vb
If a=1 then
    Me.FileDataGrid.Rows.Add("" _
    , Path.GetFileName(aF) _
    , "")
    'ドロップダウンリストを作成する。
    Dim BoxsColumn As New DataGridViewComboBoxCell
    For Each fTL In localParentform.ParamVO.FileTypeList
        attachedBoxsColumn.Items.Add(fTL)
    Next

    Me.FileDataGrid.Rows(afRowCount).Cells(2) = attachedBoxsColumnPdf

Else
    '似たような処理
End If

本題

VBnetの質問ということで10年前にやったきりで、
「懐かしいわねー :blush:
と思ってのうろ覚えとMicrosoftのドキュメントを眺めての憶測での回答です。

なお、手元にVisual Studioはおろか、Windowsさえ無い環境による回答なので、記述したソースコードの動作確認はできていません :bow:

結論

DataGridView クラスのインスタンスの EventArgsDataGridViewComboBoxCell クラスのインスタンスにスルーパスしてしまうか、そもそも DataGridViewOnClick イベントの発火をさせないとかですかね。

以下、うろ覚えのVBnet知識で書いたソースコードです:

Private Sub FileDataGrid_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles FileDataGrid.Click
    ' マウスポインタの座標位置を e から取得し、どのセルに該当するかを求める必要があるかもしれません……。
    attachedBoxsColumn_Click(sender, e)
End Sub

イベントの着火順序

VBnetというよりdotNetのDataGridViewに限らず、おそらく多くのGUIフレームワークのグリッドビューが、
「グリッドビュー全体」/「グリッドビューの各行」/「グリッドビューのある行の各セル」
という構造になっていると思います。

ですので特に何もしていなければ、

画面の挙動を見ていると、1クリック目で行が選択される、2クリック目で列が選択される、3クリック目でドロップダウンリストが展開、のような動きをしているようです。

という動作をするのは真っ当な動作かなと私個人は思ってしまいました。

ですので、上記の結論の様にイベントをスルーパスするかそもそも今回制作したであろう FileDataGrid でのOnClickイベントを抑制してその下のセル自身にイベントを拾って処理してもらう様にすると良いと思いました。


ただ、本題に入るに当たって申し上げた通り、
「VBnetの質問ということで10年前にやったきりで手元にVisual Studioはおろか、Windowsさえ無い環境による回答」
ですので、見当違いでしたら申し訳ありません! :bow

1Like

Comments

  1. @cabu

    Questioner

    回答ありがとうございます!
    取り急ぎ、シンタックスハイライトについてはvbだったのですね、修正しました。助かります。
    本題についてですが、素晴らしいアイデア!と思ったのですが、どうもDataGridViewにはプログラム側でクリックイベントを発生させることはできず、ドロップダウンリストを展開できませんでした。CurrentCellという形でそのセルを選択している状態にするのが限界のようです。
    →その後解決しました。
    方式は教えていただいた通りですが、クリックイベントを発生させるのではなく、キーボードのF4を押す動きにしたところうまくいきました。
    SendKeys.Send("{F4}");

    参考は以下です。このサイトにたどり着けなかったのはなぜなのか、調べ方を反省する必要がありますね。
    https://dobon.net/vb/dotnet/datagridview/oneclickdropdown.html#section1

Your answer might help someone💌