2015-11-23 3 views
0

У меня есть этот код, если он изменен, например, первая ячейка, затем я нажимаю на TextBox и снова нажимаю на измененную ячейку, чтобы попытаться записать снова в той же ячейке, редкий эффект и неправильно написан в одной и той же ячейке. Вам нужно изменить строку и вернуться в предыдущую ячейку, чтобы записать обратно в эту ячейку.VadgetDefaultDetagridview на DirectCast TextBox

Меня интересует работа кода таким образом, но это не делает этот странный эффект.

Если удалить следующую строку кода в случае HandleEcTextChanged (...)

Me.grid.Rows (cell.RowIndex) .Cells (Me.lengthColumn.Index) .Value = ec.Text .Length

проблема не возникает, но мне нужно обновить колонку Length программно.

Кроме того, если datagridview подключен к базе данных, вы получаете сообщение об ошибке «Индекс поврежденного datatable».

Действия по воспроизведению проблемы:

  1. Modify первую ячейку DataGridView "яблоко".
  2. Нажмите TexBox "0000000".
  3. Нажмите на ячейку, измененную выше.
  4. Введите любое значение в текущую ячейку.
  5. В предыдущем пункте проблема возникает. Не пишите правильно в ячейке.

Помогите пожалуйста.

Цистерны.

Public Class TextBoxDirectCast 

    Private WithEvents table As DataTable 
    Private WithEvents grid As DataGridView 
    Private WithEvents textColumn As DataGridViewTextBoxColumn 
    Private WithEvents lengthColumn As DataGridViewTextBoxColumn 
    Private WithEvents texboxtext As TextBox 

    Public Sub New() 
     Me.InitializeComponent() 
     Me.ClientSize = New Size(400, 300) 
     Me.table = New DataTable() 
     Me.table.Columns.Add("Text", GetType(String)) 
     Me.table.Columns.Add("Length", GetType(Integer)) 
     Me.table.Rows.Add("apple", 5) 
     Me.table.Rows.Add("banana", 6) 
     Me.table.Rows.Add("orange", 6) 
     Me.textColumn = New DataGridViewTextBoxColumn() With {.DataPropertyName = "Text", .HeaderText = "Text", .AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill} 
     Me.lengthColumn = New DataGridViewTextBoxColumn() With {.DataPropertyName = "Length", .ReadOnly = True, .HeaderText = "Length (Computed)", .Width = 200, .MinimumWidth = 200} 
     Me.grid = New DataGridView() With {.Dock = DockStyle.Top, .AutoGenerateColumns = False, .DataSource = Me.table, .TabIndex = 0} 
     Me.grid.Columns.AddRange({Me.textColumn, Me.lengthColumn}) 
     Me.Controls.Add(Me.grid) 
     Me.texboxtext = New TextBox With {.Anchor = AnchorStyles.Bottom Or AnchorStyles.Left, .Text = "0000000", .Location = New Point(10, Me.ClientSize.Height - 30), .TabIndex = 1} 
     Me.Controls.Add(Me.texboxtext) 
     Me.texboxtext.BringToFront() 
    End Sub 

    Private Sub HandleEcShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles grid.EditingControlShowing 
     If (Me.grid.CurrentCell.ColumnIndex = Me.textColumn.Index) Then 
      Dim ec As DataGridViewTextBoxEditingControl = DirectCast(e.Control, DataGridViewTextBoxEditingControl) 
      Me.UnhookEc(ec) 'Important: Remove handles to avoid recursion. 
      Me.HookEc(ec) 
     End If 
    End Sub 

    Private Sub HandleEcTextChanged(sender As Object, e As EventArgs) 
     Dim ec As DataGridViewTextBoxEditingControl = DirectCast(sender, DataGridViewTextBoxEditingControl) 
     Dim cell As DataGridViewTextBoxCell = DirectCast(Me.grid.CurrentCell, DataGridViewTextBoxCell) 
     Me.grid.Rows(cell.RowIndex).Cells(Me.lengthColumn.Index).Value = ec.Text.Length 
    End Sub 

    Private Sub HandleEcDisposed(sender As Object, e As EventArgs) 
     Me.UnhookEc(TryCast(sender, DataGridViewTextBoxEditingControl)) 'Important: This will ensure removal of the hooked handles. 
    End Sub 

    Private Sub HookEc(ec As DataGridViewTextBoxEditingControl) 
     If (Not ec Is Nothing) Then 
      AddHandler ec.TextChanged, AddressOf Me.HandleEcTextChanged 
      AddHandler ec.Disposed, AddressOf Me.HandleEcDisposed 
     End If 
    End Sub 

    Private Sub UnhookEc(ec As DataGridViewTextBoxEditingControl) 
     If (Not ec Is Nothing) Then 
      RemoveHandler ec.TextChanged, AddressOf Me.HandleEcTextChanged 
      RemoveHandler ec.Disposed, AddressOf Me.HandleEcDisposed 
     End If 
    End Sub 

End Class 
+0

Вы изменили код чего? (откуда берется исходный код)? Кроме того: официальным языком Stack Overflow является английский (отредактируйте и удалите абзац на другом языке) – BrunoLevy

+0

Помогите с этим isuue, пожалуйста, Tanks. – Sagitariozod

ответ

0

Используйте directcast для доступа к своим ячейкам. Вот пример кода, который я написал для доступа к динамически сгенерированному текстовому окну.

Dim txt = New TextBox() 
    txt.Name = "name1" 
    txt.Size = New Size(200, 70) 
    txt.Location = New Point(40, 40) 
    txt.Text = "I am a new textbox" 
    Me.Controls.Add(txt) 
    DirectCast(Me.Controls("name1"), TextBox).Text = "Some stuff here" 'The magic happens here 

 Смежные вопросы

  • Нет связанных вопросов^_^