【问题标题】:.NET Windows Forms Datagridview mousedown event not firing.NET Windows 窗体 Datagridview mousedown 事件未触发
【发布时间】:2013-02-25 15:05:45
【问题描述】:

我有一个在 Visual Studio 2005 上用 VS.NET Visual Basic 编写的应用程序。

它有一个 Windows 窗体,上面有一个 DataGridView 控件,用于显示从数据库中检索到的数据。

我想让用户右键单击记录,查看上下文菜单并能够单击删除以从数据库中删除该记录。

不幸的是,我什至无法按下鼠标或单击事件来触发(在调试模式下,设置断点)

这是我的代码:

Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    MessageBox.Show("You right-clicked on the grid at", "Unpaid", MessageBoxButtons.OK)
End Sub

Private Sub DataGridView1_CellMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDoubleClick
    MessageBox.Show("You right-clicked on the grid at", "Unpaid", MessageBoxButtons.OK)
End Sub

Private Sub DataGridView1_CellMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown

    If e.Button = Windows.Forms.MouseButtons.Right Then
        MessageBox.Show("Clicked right")
    else 
        MessageBox.Show("Clicked left")
    End If

    Dim r As Rectangle
    if (e.RowIndex >= 0 && e.ColumnIndex >= 0 && e.Button == MouseButtons.Right)
        DataGridView1.Rows(e.RowIndex).Selected = True
        r = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)
        contextMnu.Show(DataGridView1, r.Left + e.X, r.Top + e.Y)
    End If
End Sub

Private Sub DeleteChequeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DeleteChequeToolStripMenuItem.Click
    MessageBox.Show("You right-clicked on the grid", "Unpaid", MessageBoxButtons.OK)
End Sub

如您所见,我正在尝试获取一些事件,任何要触发的事件,当我右键单击甚至左键单击时,没有任何代码正在运行。

顺便说一句,运行时网格中有数据,据我所知,它已启用

那么我在这里做错了什么?我需要向DataGridView 控件添加一些功能吗?

【问题讨论】:

    标签: .net vb.net datagridview mouseevent visual-studio-debugging


    【解决方案1】:

    我正在使用您的代码,当单击填充的数据网格视图中某处的单元格时,CellMouseDown 工作。我在设计时手动填充了数据。我没有在运行时模式下尝试过。

    您可以获取空的 DataGridView1 来触发事件 MouseDown() 和 DoubleClick() 即使它没有被填充。但是,这本身并不知道您正在单击哪些单元格。此外,MouseDown 将优先于 DoubleClick,您不会在此处看到双击。

     Private Sub DataGridView1_MouseDown(sender As Object, e As MouseEventArgs) Handles     DataGridView1.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Right Then
    
            MessageBox.Show("Clicked right")
        Else
            MessageBox.Show("Clicked left")
        End If
     End Sub
    
     Private Sub DataGridView1_DoubleClick(sender As Object, e As EventArgs) Handles DataGridView1.DoubleClick
        MessageBox.Show("Double Clicked")
     End Sub
    

    [编辑 2/25/2013]

    我尝试使用以下代码向 datagridview 动态添加数据:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim testData As New List(Of String)
        testData.Add("1")
        testData.Add("2")
        testData.Add("3")
        Dim dataBindingSource As New BindingSource
        dataBindingSource.DataSource = testData
        DataGridView1.DataSource = dataBindingSource
    End Sub
    

    我仍然可以触发 DataGridView1_CellMouseDown 事件。也许您可以尝试一个仅使用 datagridview 的空项目,然后尝试看看您的问题可能出现在哪里?

    【讨论】:

    • 我的调试问题是否与表单父级(称为 MDI 子级的 MDI 表单)有关?
    • 啊,你应该在第一版中提到过。我注意到如果“Handles ”不在事件调用所在的位置,也会出现同样的问题。我建议删除您拥有的所有事件并尝试从子表单 GUI 事件添加器中添加事件 cellmousedown。然后在事件后键入“Handles”以查看智能感知带来的选择。我选择了 DataGridView1.CellMouseDown。然后事件似乎正常触发。
    • 另外,您是否将子窗体设置为使用主窗体作为父窗体?父表单中的类似内容:FormChild.MdiParent = Me
    • 我不认为这是问题所在:下面是在 MDI Parent 中的菜单单击事件上加载子表单的方式: Dim NewMDIChild As New frmReportsEquationSubmissions If bUnpaidIn_InputLoaded = False Then 'Set the Parent子窗口的窗体。 NewMDIChild.MdiParent = Me NewMDIChild.ProcessDateToLook = 1 '显示新表格。 NewMDIChild.Show() End 如果我尝试删除所有事件处理程序,并添加一个,它似乎没问题(见下一条评论)
    • 私有子 DataGridView1_CellMouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) 处理 DataGridView1.CellMouseDown
    【解决方案2】:

    非常抱歉我的愚蠢(VS 的初学者,来自 VB6)。

    事实证明,VB 项目设置将 Build only on Compile for release 设置为 True,所以即使我认为我正在运行更改后的代码,但我没有!

    所以在我改变它并运行 Project...Clean 然后是 Project... Build 我的事件开始工作。

    还是谢谢! 菲利普

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多