我已經修改的代碼和已經添加文本框。
如果修改了,例如第一個單元格,然後單擊TextBox並再次單擊修改的單元格,以再次嘗試在同一單元格中寫入,這是一種罕見的效果,並且不能正確寫入同一單元格中。 您需要更改行並返回到前一個單元格以在該單元格中回寫。
我對這種方式的代碼工作感興趣,但是這並不會造成這種奇怪的效果。
如果刪除的下面一行代碼在事件HandleEcTextChanged(...)
Me.grid.Rows(cell.RowIndex).Cells(Me.lengthColumn.Index)。價值= ec.Text .Length
問題不會發生,但我需要以編程方式更新長度列。
另外,如果datagridview連接到數據庫,則會出現錯誤「數據表損壞的索引。「
步驟來重現問題:
- 修改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
嗨!不好意思推遲了。我試過EditingControlShowing,但它沒有幫助我。它充當了重要的新聞事件,這就是爲什麼我問。數據綁定了一個訪問數據庫,但是我只用它來存儲我的值(因爲我沒有成功地建立表之間的關係並且工作良好)。無論如何,我對編程不是很有經驗,並且對虛擬/普通模式提出了一些問題。你能告訴我哪個區別?當我按下調試按鈕vs在另一臺電腦上使用應用程序時? Thanx – user3806029