2014-07-04 13 views
0

我正在做一個會計應用程序,我有一個小問題。當我在單元格中寫入時,我不需要按鍵或進行任何其他類型的驗證,因此我需要使用datagridview進行必要的單元計算......因爲用戶可能會忘記這樣做。datagridview更新,而打字

所以我有這個,我的問題是我應該使用什麼事件來驗證dgw單元格,而輸入它呢?或者有另一種方法可以做到這一點?

Private Sub NRCD_produseDataGridView_CellValueChanged(ByVal sender As Object, ByVal e 
    As System.Windows.Forms.Da-taGridViewCellEventArgs) 
    Handles NRCD_produseDataGridView.??????? 

    // doesn't matter what is here 

End Sub 

感謝名單

回答

0

正如您所觀察到的,CellValueChanged事件不是這種情況的正確的。爲什麼?由於編輯控件的值尚未推回至DataGridView。您正在尋找的活動是EditingControlShowing。這將使您能夠在編輯時將句柄添加到DataGridViewCell中顯示的實際編輯控件(TextBoxComboBox等)。請注意,當單元格不處於編輯模式時,單元格就是網格繪製的編輯控件的「圖像」,它不是實際的控件。

當詢問有關一個DataGridView很重要的問題,分享了以下內容:

  • 是網格邊界到數據源?
  • 如果是,下層數據源的類型是什麼?
  • 您是否在VirtualMode中運行網格?

現在,因爲你尚未分享任何這一點,下面的示例形式假定網格是:

  • 綁定到DataTable
  • 以正常模式運行。

enter image description here

Public Class Form1 

    Public Sub New() 
     Me.InitializeComponent() 
     Me.ClientSize = New Size(500, 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.Fill, .AutoGenerateColumns = False, .DataSource = Me.table} 
     Me.grid.Columns.AddRange({Me.textColumn, Me.lengthColumn}) 
     Me.Controls.Add(Me.grid) 
    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 

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

End Class 
+0

嗨!不好意思推遲了。我試過EditingControlShowing,但它沒有幫助我。它充當了重要的新聞事件,這就是爲什麼我問。數據綁定了一個訪問數據庫,但是我只用它來存儲我的值(因爲我沒有成功地建立表之間的關係並且工作良好)。無論如何,我對編程不是很有經驗,並且對虛擬/普通模式提出了一些問題。你能告訴我哪個區別?當我按下調試按鈕vs在另一臺電腦上使用應用程序時? Thanx – user3806029

0

我已經修改的代碼和已經添加文本框。

如果修改了,例如第一個單元格,然後單擊TextBox並再次單擊修改的單元格,以再次嘗試在同一單元格中寫入,這是一種罕見的效果,並且不能正確寫入同一單元格中。 您需要更改行並返回到前一個單元格以在該單元格中回寫。

我對這種方式的代碼工作感興趣,但是這並不會造成這種奇怪的效果。

如果刪除的下面一行代碼在事件HandleEcTextChanged(...)

Me.grid.Rows(cell.RowIndex).Cells(Me.lengthColumn.Index)。價值= ec.Text .Length

問題不會發生,但我需要以編程方式更新長度列。

另外,如果datagridview連接到數據庫,則會出現錯誤「數據表損壞的索引。「

步驟來重現問題:

  1. 修改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

請幫忙,這是坦克 – Sagitariozod