【问题标题】:VB.NET Trigger Datagridview Cell Click on Button CLickVB.NET 触发 Datagridview 单元格单击按钮 CLick
【发布时间】:2021-02-22 04:19:46
【问题描述】:

我试图在单击按钮时触发此命令

 Private Sub ClickDataGridview(sender As Object, e As DataGridViewCellMouseEventArgs)
    If e.RowIndex >= 0 Then
        Dim row As DataGridViewRow = DataGridView1.Rows(e.RowIndex)
        TextBox1.Text = row.Cells(0).Value.ToString
        TextBox2.Text = row.Cells(1).Value.ToString

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

但遗憾的是我收到了两个错误

  1. 未为“Private Sub ClickDataGridview(sender As Object, e As DataGridViewCellMouseEventArgs)”的参数“sender”指定参数。
  2. 未为“Private Sub ClickDataGridview(sender As Object, e As DataGridViewCellMouseEventArgs)”的参数“e”指定参数

我应该让它成为一个 if 语句才能工作吗?还是我应该尝试其他方法来触发此事件

【问题讨论】:

  • 当你在Button2_Click事件中调用ClickDataGridview()方法时……sendere这两个参数在哪里? ClickDataGridview(sender As Object, e As DataGridViewCellMouseEventArgs) 方法需要这两个参数,而代码没有将它们传递给方法,因此出现了两个错误。
  • 我尝试执行此操作“ClickDataGridview(sender, e)”但我收到此错误“无法将“System.Windows.Forms.MouseEventArgs”类型的对象转换为“System.Windows.Forms”。 DataGridViewCellEventArgs'.'
  • Button2 被点击并触发Button2_Click(sender As Object, e As EventArgs) 事件时,EventArgs ... e。 … 传递给事件。这与网格单元格单击事件参数DataGridViewCellMouseEventArgs 不同。这就是您收到错误的原因。查看两个发布方法的签名......e 参数是两种不同的类型。
  • 您需要记住,当单击按钮时,它对网格“一无所知”。它可以获取有关网格的信息,例如选择了哪个单元格或多少行,但它不会知道刚刚单击了“哪个”单元格。如果这是您正在寻找的内容,那么您似乎需要订阅网格 CellMouseClick 事件并运行您在该事件中拥有的代码,使用这种方法不需要按钮。
  • 请提供对问题的完整和清晰的解释。你试图让一些代码工作并不是对问题的解释。为了知道工作代码会是什么样子,我们需要知道您实际想要实现的目标。不过你还没有解释。不要只描述手段并期望我们确定这些手段无法达到的目的。你需要自己描述实际的结局。基本上,不要指望我们从不做的代码中找出你想要做的事情。首先解释一下你为什么要写这段代码。

标签: vb.net


【解决方案1】:

有一种方法,但您必须小心选择单元格。如果您只需要进行行操作,那么可以这样做。我建议不要这样做,而是将每行的按钮放在 gridview 中并执行操作

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

 If DataGridView1.SelectedCells.Count > 0 Then

'Here you can change Datagridview row selection property and get selectedrows instead of selected cells
            Dim i_rowindex As Integer = DataGridView1.SelectedCells(0).RowIndex

            Dim i_colIndex As Integer = DataGridView1.SelectedCells(0).ColumnIndex


            DataGridView1_CellMouseClick(sender, New DataGridViewCellMouseEventArgs(i_colIndex, i_rowindex, 0, 0, New MouseEventArgs(MouseButtons.Left, 1, 0, 0, 0)))
End
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

【讨论】:

  • 谢谢我有这个命令,所以不用担心 If SelectedRow = DGBRealTotal Then MessageBox.Show("You are Current at the end of Row") Else SelectedRow = Val(SelectedRow) + 1 lblCurrentSelectedData.Text = "选定的行是 " & SelectedRow & " Row" End If
  • 我如何在这里接受答案?我对这个网站有点陌生
  • 制造EventArgs 并调用事件处理程序是不好的做法。公共代码应该在它自己的方法中,并且从两个事件处理程序中调用该方法。该通用代码只关心行,因此Click 事件处理程序应该传递CurrentRow,而CellMouseClick 应该测试鼠标按钮并按索引获取行并传递它。
  • 显然这是不好的做法,这就是为什么我不建议这样做..
【解决方案2】:

我可能已经提到过一次或两次,不要直接调用事件处理程序。将通用代码放入它自己的方法中,然后根据需要从每个事件处理程序中调用该方法。在这种情况下:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    GetRowValues(DataGridView1.CurrentRow)
End Sub

Private Sub DataGridView1_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseClick
    If e.Button = MouseButtons.Left AndAlso e.RowIndex >= 0 Then
        GetRowValues(DataGridView1.Rows(e.RowIndex))
    End If
End Sub

Private Sub GetRowValues(row As DataGridViewRow)
    TextBox1.Text = row.Cells(0).Value.ToString()
    TextBox2.Text = row.Cells(1).Value.ToString()
End Sub

【讨论】:

    【解决方案3】:

    我可能遗漏了一些东西,但是……我不明白您为什么要强制用户“单击”按钮来设置文本框。如果您连接网格“SelectionChanged”事件并更新该事件中的文本框,则用户不必单击按钮或单元格。如果用户使用箭头键、Enter 键、Tab 键甚至“单击”单元格,文本框将自动更改,而无需用户单击按钮。

    Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged
      If (DataGridView1.CurrentRow IsNot Nothing) Then
        TextBox1.Text = DataGridView1.CurrentRow.Cells(0).Value.ToString()
        TextBox2.Text = DataGridView1.CurrentRow.Cells(1).Value.ToString
      End If
    End Sub
    

    或者...更好...如果网格使用数据源,则只需将文本框“绑定”到该“相同”数据源即可。您不必连接任何网格事件。

    TextBox1.DataBindings.Add(New Binding("Text", datasource, "datasourceColumnName1"))
    TextBox2.DataBindings.Add(New Binding("Text", datasource, "datasourceColumnName2"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 2011-09-16
      • 2017-05-31
      • 1970-01-01
      相关资源
      最近更新 更多