DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridのMouseUpイベントについて

環境/言語:[WinXP SP1 / VB.NET 2003 / Framework1.1]
分類:[.NET]

2004/09/10(Fri) 15:24:27 編集(投稿者)

いつもお世話になっております、にしかわです。
DataGridのフォーカスについて、教えてください。

現在DataGridで、特定のセルをクリックしたら別画面を表示するような
コードを作成しています。
特定のセルをクリックすると別画面が表示する、まではいいのですが、
別画面を閉じた後、DataGridにはクリックしたセルにフォーカスを残し、
再度同じセルをクリックしても、何の動きもしないのです。
フォーカスをそのまま残した状態で、別の個所をクリックしたり、
別セルをクリックすると、別画面が出るようにはなるのですが、
同じセルを再度クリックすると、途端に別画面を表示できなくなります。

下記のように、コードを書いたのですが、一向に判らず困っています。
下記コードの最初のIF文で、
If e.Button = MouseButtons.Left Or e.Clicks >= 1 Then
としても、反応しないのです。
大変申し訳ないですが、皆様のお知恵を拝借できますと嬉しいです。

Public Sub DataGrid1_MouseUp(・・・省略・・・) Handles DataGrid1.MouseUp
  If e.Button = MouseButtons.Left Then
    ' フォーカスがあるセルを取得
    Dim CellInfo As DataGridCell = DataGrid1.CurrentCell
    ' セルの行番号を取得
    Dim CellRow As Integer = CellInfo.RowNumber
    ' セルの列番号を取得
    Dim CellColumn As Integer = CellInfo.ColumnNumber
    ' 3列目のセルにクリックすると、別画面を表示
    If CellColumn = 2 Then
      ' セルの値を取得
      Dim CellText As String = CStr(DataGrid1(CellRow, CellColumn))
      Dim FormDlg2 As New Form2
      ' 別画面のタイトルとしてセット
      FormDlg2.Text = CellText
      ' 別画面の表示
      FormDlg2.ShowDialog(Me)
      ' 現在のセルに再セット
      DataGrid1.CurrentCell = New DataGridCell(CellRow, CellRow)
    End If
  End If
End Sub

以上、よろしくお願い致します。
■No6107に返信(にしかわ あつこさんの記事)
> いつもお世話になっております、にしかわです。
> DataGridのフォーカスについて、教えてください。
 
> 現在DataGridで、特定のセルをクリックしたら別画面を表示するような
> コードを作成しています。
> 特定のセルをクリックすると別画面が表示する、まではいいのですが、
> 別画面を閉じた後、DataGridにはクリックしたセルにフォーカスを残し、
> 再度同じセルをクリックしても、何の動きもしないのです。
> フォーカスをそのまま残した状態で、別の個所をクリックしたり、
> 別セルをクリックすると、別画面が出るようにはなるのですが、
> 同じセルを再度クリックすると、途端に別画面を表示できなくなります。

途端にというより、CellにFocusがあると、
DataGrid側の、MouseDown()およびMouseUp()イベントが
発生しなくなるからのようですね。

なので、

> If e.Button = MouseButtons.Left Or e.Clicks >= 1 Then
> としても、反応しないのです。

MouseUp()イベント自体が発生しないので、条件を変えても当然ムリなわけでして...



私も以下のコードでそれは確認しました。

ソースコード開始:--------------------------------------------------------

    Private Sub DataGrid1_MouseUp(略)Handles DataGrid1.MouseUp
        Dim tCell     As DataGridCell
        Dim iRow      As Integer
        Dim iCol      As Integer
        Dim nCellText As String
        Dim pForm     As Form1

        If e.Button = MouseButtons.Left Then
            tCell = DataGrid1.CurrentCell
            iRow  = tCell.RowNumber
            iCol  = tCell.ColumnNumber

            If iCol = 1 Then
                nCellText = DataGrid1.Item(iRow, iCol).ToString()
                pForm = New Form1
                pForm.Text = nCellText
                pForm.ShowDialog(Me)
                ' ここでFocusを殺せばいいんだけど
        End If
        End If
    End Sub

---------------------------------------------------------ソースコード終了


1番楽な解決方法は、選択したCellからFocusを逃がせば良いのですが、
それだとカッコ悪いのでお困りなのだと思います。
かといって、マウス位置からイベントを起こしたり、
カスタムコントロールを作るのは、当然骨が折れます。

当然、Focusを逃がす方法だとイヤなので、ここからは提案になりますが、

私ならば、セルをClick(MouseDownやMouseUpも然り)することで
別ダイアログを出さずに、Buttonコントロールを使います。

> 特定のセルをクリックすると別画面が表示する、

というのも、ButtonコントロールのEnabledを使うとユーザさんにわかりやすいです。
どのセルならダイアログを開けるか見た目でわかるからです。
(まあセルの色で識別する方法とかもあるのでしょうが...)


何か、アドバイスというより提案になってしまいました。
力不足で申し訳ありません。
java.lang.Nullpo様

おはようございます、にしかわです。
いつもお世話になっております。

>
> 1番楽な解決方法は、選択したCellからFocusを逃がせば良いのですが、
> それだとカッコ悪いのでお困りなのだと思います。
> かといって、マウス位置からイベントを起こしたり、
> カスタムコントロールを作るのは、当然骨が折れます。
>
> 当然、Focusを逃がす方法だとイヤなので、ここからは提案になりますが、
>
> 私ならば、セルをClick(MouseDownやMouseUpも然り)することで
> 別ダイアログを出さずに、Buttonコントロールを使います。
>
>>特定のセルをクリックすると別画面が表示する、
>
> というのも、ButtonコントロールのEnabledを使うとユーザさんにわかりやすいです。
> どのセルならダイアログを開けるか見た目でわかるからです。
> (まあセルの色で識別する方法とかもあるのでしょうが...)
>

と、上記のようにやりたいところなのですが、画面設計は私の領分でなく、
すでにユーザー様に通っているため、変更ができない状態です。
Cellにフォーカスがあると、DataGrid側のMouseDown()
およびMouseUp()イベントが発生しなくなる。
と妥協していただくか、フォーカスを逃がすか、選択して頂くことにしますね。

この度は、貴重なご提案を頂き、本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板