Как программно изменить значения ячеек связанного DataGridView без получения исключений? - PullRequest
2 голосов
/ 04 мая 2011

У меня проблемы при попытке программно изменить содержимое ячейки привязанного DataGridView.

Я реализовал минимальный фрагмент кода, чтобы показать проблему.

Выполните следующие шаги для репликациипроблема:

  • Пример запуска
  • Напишите содержание заголовка, чтобы создать новую строку
  • CTRL + C на вставленном заголовке
  • Перейти к сеткепустая строка для принудительного создания новой строки
  • CTRL + V в ячейке заголовка
  • Нажмите на предыдущую строку (создание новой строки отменено)
  • Нажмите еще раз, чтобы очиститьстрока для принудительного создания новой строки
  • Исключение: Операция недопустима из-за текущего состояния объекта.

Вот это код:

Public Class Form1

    Private _dgv As New DataGridView
    Private _Movies As New System.ComponentModel.BindingList(Of Movie)

    Public Sub New()

        InitializeComponent()

        Me.Controls.Add(_dgv)

        _dgv.Dock = DockStyle.Fill
        _dgv.DataSource = _Movies

        AddHandler _dgv.KeyDown, AddressOf DataGridView_KeyDown

    End Sub

    Private Sub DataGridView_KeyDown(sender As Object, e As KeyEventArgs)

        If e.Control AndAlso e.KeyCode = Keys.V Then
            _dgv.CurrentCell.Value = Clipboard.GetText
        End If

    End Sub

    Public Class Movie
        Public Property Title As String
    End Class

End Class

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

Ответы [ 2 ]

0 голосов
/ 06 мая 2011

Почему бы не использовать событие DataGridView UserAddedRow?

system.windows.forms.datagridview.useraddedrow

0 голосов
/ 04 мая 2011

При настройке формы в конструкторе убедитесь, что EditMode объекта DataGridView имеет значение DataGridViewEditMode.EditOnEnter.Это заставляет вставляемую нами ячейку переходить в режим редактирования, как только она получает фокус, и заставляет новую строку придерживаться вместо отмены, если мы отходим от нее.

 Public Sub New()

    InitializeComponent()

    Me.Controls.Add(_dgv)

    _dgv.Dock = DockStyle.Fill
    _dgv.DataSource = _Movies

    AddHandler _dgv.KeyDown, AddressOf DataGridView_KeyDown

    _dgv.EditMode = DataGridViewEditMode.EditOnEnter
End Sub

Затем вместо установки ячейкизначение, установите свойство Title основного фильма:

Private Sub DataGridView_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)

    If e.Control AndAlso e.KeyCode = Keys.V Then
        Dim Mov As Movie = _Movies.Last
        Mov.Title = Clipboard.GetText
        _dgv.Refresh()
    End If

End Sub

Когда вы добавляете новую строку в DataGridView, BindingList автоматически добавляет новый объект Movie в список._Movies.Last должен получить недавно добавленный фильм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...