VB.net Один саб для многих событий

#vb.net #function #events

#vb.net #функция #Мероприятия

Вопрос:

Я работаю над функцией в VB.Сеть, в которой пользователь может выбрать поставщика из списка.

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

затем пользователь может либо дважды щелкнуть заголовок строки, содержимое ячейки, либо выбрать поставщика, а затем нажать кнопку OK

Однако мне интересно, как мне избежать создания одного подраздела для каждого из трех вышеупомянутых событий, могу ли я создать один подраздел, который улавливает все три события?

 Private Sub supplierSearchOkButton_Click(sender As Object, e As EventArgs) Handles supplierSearchOkButton.Click
    initiativeForm.supplierConcatTextBox.Text = supplierSearchDataGridView.SelectedRows(0).Cells(3).Value.ToString()
    Me.Close()
End Sub

Private Sub supplierSearchDataGridView_CellContentDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles supplierSearchDataGridView.CellContentDoubleClick
    initiativeForm.supplierConcatTextBox.Text = supplierSearchDataGridView.SelectedRows(0).Cells(3).Value.ToString()
    Me.Close()
End Sub

Private Sub supplierSearchDataGridView_RowHeaderMouseDoubleClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles supplierSearchDataGridView.RowHeaderMouseDoubleClick
    initiativeForm.supplierConcatTextBox.Text = supplierSearchDataGridView.SelectedRows(0).Cells(3).Value.ToString()
    Me.Close()
End Sub
  

Комментарии:

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

Ответ №1:

Лично я бы выбрал опцию дополнительного метода, упомянутую в комментариях, но, если вы хотите, вы должны быть в состоянии это сделать:

 Private Sub SetSupplier(sender As Object, e As EventArgs) Handles supplierSearchOkButton.Click,
                                                                  supplierSearchDataGridView.CellContentDoubleClick,
                                                                  supplierSearchDataGridView.RowHeaderMouseDoubleClick
    initiativeForm.supplierConcatTextBox.Text = supplierSearchDataGridView.SelectedRows(0).Cells(3).Value.ToString()
    Me.Close()
End Sub
  

или даже это:

 Private Sub SetSupplier() Handles supplierSearchOkButton.Click,
                                  supplierSearchDataGridView.CellContentDoubleClick,
                                  supplierSearchDataGridView.RowHeaderMouseDoubleClick
    initiativeForm.supplierConcatTextBox.Text = supplierSearchDataGridView.SelectedRows(0).Cells(3).Value.ToString()
    Me.Close()
End Sub
  

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

Комментарии:

1. Это именно то, что я собирался предложить, уже сделав это, этот способ работает без проблем.

2. Например, обработчик события Control.Click передает EventArgs объект. Но на самом деле это MouseEventArgs объект, поэтому вы можете использовать его и использовать как таковой.

3. @Jimi, я не знал об этом. Я подозреваю, что это не было изначально ( MouseEventArgs само по себе не было добавлено до . NET 1.1) но, когда они добавили MouseClick событие в .NET 2.0, они решили использовать один и тот же MouseEventArgs объект для обоих событий.

4. Именно это. В справочном источнике .Net также есть комментарий по этому поводу . Это также относится к DoubleClick.

5. @Jimi, это странно. Я проверил этот источник, и они фактически создают новый MouseEventArgs объект для каждого события. Я мог бы понять, если бы они использовали один и тот же объект, но я не могу понять, почему они создали бы более сложный объект для Click события, когда он даже не должен был использоваться.