.NET Windows Forms Datagridview событие mousedown не запускается

У меня есть приложение, написанное на VS.NET Visual Basic в Visual Studio 2005.

Он имеет форму 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?


person Our Man in Bananas    schedule 25.02.2013    source источник


Ответы (2)


Я играл с вашим кодом, и 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

[РЕДАКТИРОВАТЬ 25.02.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. Возможно, вы могли бы попробовать пустой проект только с представлением данных и попробовать его, чтобы увидеть, где могла возникнуть ваша проблема?

person Patratacus    schedule 25.02.2013
comment
могут ли мои проблемы с отладкой быть связаны с родительской формой (форма MDI, называемая дочерней MDI)? - person Our Man in Bananas; 25.02.2013
comment
Ах, вы должны были упомянуть об этом в первой табличке. Я заметил ту же проблему, если Handles «Event» не находится там, где находится вызов события. Я предлагаю удалить все имеющиеся у вас события и попробовать добавить событие cellmousedown из средства добавления событий графического интерфейса дочерней формы. Затем введите Handles после события, чтобы увидеть варианты, которые предлагает intellisense. Я выбрал DataGridView1.CellMouseDown. Затем событие, кажется, срабатывает нормально. - person Patratacus; 25.02.2013
comment
Кроме того, вы устанавливаете дочернюю форму для использования основной формы в качестве родителя? Примерно так в родительской форме: FormChild.MdiParent = Me - person Patratacus; 25.02.2013
comment
Я не думаю, что это проблема: Ниже показано, как дочерняя форма загружается в событие щелчка меню в MDI. Родитель: Dim NewMDIChild As New frmReportsEquationSubmissions. NewMDIChild.MdiParent = Me NewMDIChild.ProcessDateToLook = 1 'Показать новую форму. NewMDIChild.Show() End Если я попытался удалить все обработчики событий и добавить один, все в порядке (см. следующий комментарий) - person Our Man in Bananas; 25.02.2013
comment
Private Sub DataGridView1_CellMouseDown (отправитель ByVal как объект, _ ByVal e как System.Windows.Forms.DataGridViewCellMouseEventArgs) обрабатывает DataGridView1.CellMouseDown - person Our Man in Bananas; 25.02.2013
comment
После того, как вы удалили все события, теперь он работает с событием CellMouseDown? - person Patratacus; 25.02.2013
comment
нет, я имел в виду, что Handles... был правильным (DataGridView1.CellMouseDown), но никакое событие не запускается с точкой останова - person Our Man in Bananas; 26.02.2013
comment
еще один вопрос - в чем разница в VS.NET Solution Explorer между «frmEquationSubmissionDay1.vb» и дочерним «frmEquationSubmissionDay1.Designer.vb»? - person Our Man in Bananas; 26.02.2013
comment
очень сожалею о моей тупости (полный новичок в VS, исходящий из VB6), теперь мне интересно, действительно ли я запускал свой измененный код... Когда я нажимаю "Выполнить" (отладка), мне нужно сначала выполнить полную сборку без ошибки? - person Our Man in Bananas; 26.02.2013
comment
давайте продолжим это обсуждение в чате - person Patratacus; 26.02.2013

очень сожалею о моей тупости (полный новичок в VS, исходящий из VB6).

Оказывается, в настройках проекта VB для параметра «Сборка только при компиляции для выпуска» установлено значение «Истина», поэтому, хотя я думал, что запускаю свой измененный код, это было не так!

Итак, после того, как я изменил это и запустил Project...Clean, а затем Project... Build, мои события начали работать.

Спасибо, в любом случае! Филип

person Our Man in Bananas    schedule 26.02.2013