#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 тег. Добро пожаловать 🙂