2014-01-16 30 views
1

我有一個使用datagridview的windows窗體vb.net程序。我試圖找到一種方法來防止用戶在我的datagridview中輸入特殊字符(例如$,@,!,#,%,^,&)。當用戶輸入一個特殊字符時,我有一個適當的消息框來解釋他們的錯誤,然後我給他們提供一個默認值。除了一種防止特殊字符或符號的方法之外,我有一切工作。我想這樣的事情有工作,但我似乎無法找到阻止這種進入的任何方式:如何使用vb.net防止datagridview中的特殊字符

If (columnindex = 0) Then 'checking value for column 1 only 
      Dim cellString = DataGridView1.Rows(rowindex).Cells(columnindex).value 
      If cellString String.IsSymbol(cellString) = true Then 

        MessageBox.Show("Special Characters Not Allowed") 
       End If 
       DataGridView1.Rows(rowindex).Cells(columnindex).value = "Default Value" 
       Exit Sub 
      End If 

回答

1

可以使用EditingControlShowing事件註冊一個KeyPress功能的輸入框。

Private Sub YourDataGridView_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles YourDataGridView.EditingControlShowing 

    Try 
     RemoveHandler e.Control.KeyPress, AddressOf YourFunctionToPreventSpecialCharacters 
    Catch ex As Exception 
    End Try 

    If Me.dgvTableViewer.CurrentCell.ColumnIndex = YourDataGridView.Columns("YourColumn").Index Then 
     AddHandler e.Control.KeyPress, AddressOf YourFunctionToPreventSpecialCharacters 
    End If 

End Sub 
+1

這是附加一個句柄到DataGridView裏面的TextBox控件的最佳方法,但這種實現是有問題的,因爲你永遠不刪除的處理程序。每次你輸入控件時,處理程序都會被再次添加(因此會在添加處理程序時觸發多次 - 處理程序將在第10次單元格中觸發十次!!)。您需要保留對e.Control的引用並在該對象上調用RemoveHandler,然後執行AddHandler並更新您的引用。 –

+0

是的,我知道,但我刪除了這部分代碼(我的錯誤)來簡化答案!我只是使用Try/Catch塊來RemoveHandler,而不是保留對e.Control的引用。答案已更新。 – tezzo

+1

這也適用。但是,您不需要嘗試/捕獲。除非參數爲null,否則RemoveHandler永遠不會拋出異常。 'e.Control'可能在構造/銷燬期間爲空,所以'如果e.Control不是那麼那麼......'就足夠了。 –

0

嘗試,並把這個在DataGridView的keydown事件:

Private Sub DataGridView1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown 
    Select Case e.KeyCode 
     Case Keys.D0 To Keys.D9 And e.Shift 
      MsgBox("NOPE.") 
      e.SuppressKeyPress = True 
    End Select 
End Sub 

,基本上檢查,如果按鍵從您的計算機上的按鍵0-9來了,如果你還持有的SHIFT關鍵。如果是,則顯示Msgbox並取消按鍵。這會阻止鍵盤上的字符0-9移位[email protected]#$%^&*()。您可以編輯這個喜歡

Case Keys.A 
    e.Suppress ... 
    Msgbox ... etc 
+0

你可以通過'e.Shift'訪問shift狀態 - 你應該使用它,因爲在用戶釋放shift鍵並且My.Computer.Keyboard.ShiftKeyDown會報告之後消息處理器可能會觸發即使在事件被觸發時按下Shift鍵*也是錯誤的。 –

+0

沒錯,忘記了。現在編輯爲'e.Shift' –

+0

以上所有答案都基於按鍵事件。如果用戶粘貼了該值,該怎麼辦? – Mych

相關問題