Как включить копирование-вставку из Excel в пользовательский DataGridView?

#excel #vb.net #winforms #datagridview #copy-paste

#excel #vb.net #winforms #datagridview #копирование-вставка

Вопрос:

Я пытаюсь решить эту старую добрую проблему в своей собственной среде, адаптировал множество различных решений, по-прежнему безуспешно.У
меня есть User Control файл с именем EntryGrid , который имеет DataGridView заголовки и подобные вещи заданы в коде. Затем появляется форма, EntryGrid из которой выпало.
Я знаю, что столбцы Excel должны быть подготовлены для вставки всех ячеек в строку, для этого я использовал это решение: copypaste, за исключением части копирования. Вот как это выглядит у меня дома:

 Private Sub EntryGrid_KeyDown(sender As Object, e As KeyEventArgs) Handles EntryGrid4.KeyDown, EntryGrid8.KeyDown, EntryGrid16.KeyDown, EntryGrid32.KeyDown
        e.Handled = True
        Dim entryGrid As EntryGrid = sender
        Dim dataGrid As DataGridView = entryGrid.DataGrid
        If (e.Control And e.KeyCode = Keys.V) Then
           MessageBox.Show("Success")               'for now
        End If
End Sub
  

У меня это абсолютно не работает. Я даже установил KeyPreview значение True в форме, но никогда ничего не происходит.
Затем я попробовал это решение, мое с любым результатом:

 Private Sub EntryGrid_EditingControlShowing(sender As System.Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles EntryGrid4.EditingControlShowing
        AddHandler e.Control.KeyDown, AddressOf cell_KeyDown
    End Sub

    Private Sub cell_KeyDown(sender As Object, e As KeyEventArgs)
        If e.KeyCode = Keys.V Then
            MessageBox.Show("Success")
        End If
    End Sub
  

EntryGrid4 это имя пользовательского элемента управления в форме, но у него нет никакого EditingControlShowing события, только DataGridView есть, но я не могу использовать так: EntryGrid4.DataGrid.EditingControlShowing
Я создал событие в EntryGrid ( Public Event EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) ), но ничего не изменилось.
Я могу вставить что угодно из буфера обмена в ячейку, но это было возможно до того, как я начал вносить изменения. Спасибо за любую идею!

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

1. В чем именно проблема? Это просто вставка значения в ячейку, которая находится в режиме редактирования, или что-то еще? Пожалуйста, перефразируйте вопрос, сделайте его более понятным и удалите части, которые не связаны с проблемой. Например, если вопрос касается вставки из буфера обмена в ячейку в режиме редактирования, вы должны определить, как вы хотите вставить, используя сочетание клавиш или используя меню. Кроме того, это то, о чем вы спрашиваете, вам не нужно описывать структуру пользовательского элемента управления или столбцы Excel и так далее. Пожалуйста, задавайте вопрос просто и конкретно.

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

Ответ №1:

ProcessCmdKey ваш метод UserControl — это то, что вы ищете. Переопределите его и проверьте на Ctrl V и делайте то, что вам нужно. Например:

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.Control | Keys.V))
    {
        if (dataGridView1.EditingControl != null)
            dataGridView1.EditingControl.Text = Clipboard.GetText();
        else if (dataGridView1.CurrentCell != null)
            this.dataGridView1.CurrentCell.Value = Clipboard.GetText();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
  

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

1. Вау, это было так полезно! Я перевел на Visual Basic и поместил код обработки строк Excel, и это сработало. Большое вам спасибо за использование этого подхода ProcessCmdKey, ни в одном другом источнике он не упоминался в связи с копипастингом из Excel в datagridview.

2. Упс, я совершенно пропустил VB.NET тег. Добро пожаловать 🙂