Zachary.shupp Ответов: 3

щелкните правой кнопкой мыши в datagridview


у меня есть это приложение, которое будет запрашивать файл, и данные, которые там есть, будут добавлены в сетку данных, которая работает просто отлично. проблема, с которой я столкнулся, связана с контекстным меню. сначала мне пришлось щелкнуть левой кнопкой мыши элемент затем правой кнопкой мыши после того как он был выбран и чтобы исправить это я добавил

Private Sub CAE_DGV_CellMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles CAE_DGV.CellMouseDown
    'makes it so when you right click on the DGV it will select the row your clicking on.
    If e.Button = MouseButtons.Right Then
        CAE_DGV.ClearSelection()
        CAE_DGV.Rows(e.RowIndex).Selected = True
    End If

End Sub


Теперь в контекстном меню есть некоторые элементы, которые мне нужны, выделенные серым цветом на основе данных в выбранной строке, и именно там у меня все еще есть проблема, потому что если я щелкну правой кнопкой мыши по элементу еще до того, как меню появится, я получу ошибку: "ССЫЛКА на объект не установлена на экземпляр объекта". я получаю эту ошибку в i = CAE_DGV.CurrentRow.Индекс в приведенном ниже коде. Помощь была бы замечательной, если бы кто-то мог указать мне правильное направление о том, как исправить ошибку и иметь правый щелчок мыши, выберите пункт, а затем откройте контекстное меню.

Private Sub CAE_ContextMenuStrip1_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles CAE_ContextMenuStrip1.Opening

    Dim i As Integer
    Dim AppVERIFY

    i = CAE_DGV.CurrentRow.Index
    AppVERIFY = CAE_DGV.Item(5, i).Value ' verify.

    If AppVERIFY = "" Or AppVERIFY = "_NONE_" Then
        VerifyToolStripMenuItem.Visible = False
    End If

    If Application.HPCAE_status.ForeColor = Color.Red Then
        VerifyToolStripMenuItem.Enabled = False
        DeleteHeapFolderToolStripMenuItem.Enabled = False
    End If

    If Application.HPCAE_status.ForeColor = Color.Green Then
        VerifyToolStripMenuItem.Enabled = True
        DeleteHeapFolderToolStripMenuItem.Enabled = True
    End If
End Sub

3 Ответов

Рейтинг:
18

Zachary.shupp

Поэтому, прочитав несколько статей из microsoft, я сделал это. ниже приведен код, который я использовал.

Private Sub DataGridView1_CellMouseDown(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
    If e.Button = MouseButtons.Right Then
        DataGridView1.CurrentCell = DataGridView1(e.ColumnIndex, e.RowIndex)
    End If
End Sub


поскольку я назначил контекстное меню в свойствах, все, что я действительно сделал, это заставил правую кнопку мыши работать так же, как и
левая кнопка мыши. Я уверен, что другие сделали бы это по-другому, но это работает для меня.


Maciej Los

Это замечательно-найти решение самому. А 5!
Я был бы благодарен за то, что вы приняли мой ответ (формально), потому что я показал вам способ достижения решения. ;) Пожалуйста, оцените мой ответ...

Disk4mat73

Слава Богу за тебя! Я искал и пробовал фрагменты кода в течение нескольких дней, и ваш код работает отлично! 5 звезд!

Другие фрагменты кода, которые я пробовал, разбивают выбор строки, когда контекстное меню настроено на datagrid. Но ваш просто работает!

Рейтинг:
1

Maciej Los

Прежде чем вызвать мышь-правое меню, поймайте практическое руководство.cellmousedown[^] событие и установите выбранную строку в качестве текущей.

Подробнее на сайте:
Класс DataGridView[^]
Практическое руководство.CurrentCell[^]
Элемент Управления Datagridview [^]


Zachary.shupp

не могли бы вы привести пример? Я читал ссылку cellmousedown, которая у вас есть, и они действительно не объясняют, что использовать. Помочь вам было бы здорово.

Рейтинг:
1

eferreyra

В том случае, если вы используете BindingSource в качестве источника данных, лучше всего выбрать из модели, чтобы модель обновила представление, в противном случае, если вы запросите текущий BindingSource в этой точке, это будет ранее выбранный элемент, а не тот, который вы rigth-click

Что-то вроде этого:

private void dataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        int rowSelected = e.RowIndex;

        if (e.RowIndex != -1)
            bindingSource.Position = e.RowIndex;
    }
}