Vb.Net 2013 Datagridview проблема на DirectCast TextBox
У меня есть этот код, если он изменен, например, первая ячейка, затем я нажимаю на TextBox и снова нажимаю на измененную ячейку, чтобы попытаться записать снова в той же ячейке, редкий эффект и неправильно записывается в той же ячейке. Вам нужно изменить строку и вернуться к предыдущей ячейке, чтобы записать обратно в эту ячейку.
Я заинтересован в том, чтобы код работал таким образом, но это не делает этот странный эффект.
Если я удалю следующую строку кода в событии HandleEcTextChanged (...)
Me.grid.Rows (cell.RowIndex).Cells (Me.lengthColumn.Index).Value = ec.Text.Length
проблема не происходит, но мне нужно обновить столбец длины программно.
Кроме того, если сетевое представление подключено к базе данных, вы получаете сообщение об ошибке "Индекс таблицы данных поврежден".
Шаги, чтобы воспроизвести проблему:
- Модифицируйте первую ячейку datagridview "яблоко".
- Нажмите TexBox "0000000".
- Нажмите на ячейку, измененную выше.
- Введите любое значение в текущей ячейке.
- В предыдущем пункте проблема возникает. Не пишите правильно в клетку.
Помогите, пожалуйста.
Танки.
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
1 ответ
Используйте прямую трансляцию для доступа к вашим ячейкам. Вот пример кода, который я написал для доступа к динамически генерируемому текстовому полю.
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