2013-10-11 2 views
0

Я пытаюсь заставить ячейку datagridview принимать только числа и один период.Как разрешить один период только в Datagridview Cell в vb.net

до сих пор я успешно сделал это принимать только цифры, вот код:

Select Case e.KeyChar 
     Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", vbBack 
      e.Handled = False 
     Case Else 
      e.Handled = True 
    End Select 

В моем текстовом поле, я буду также принимать номера и один период только, вот код:

Select Case e.KeyChar 
     Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", vbBack 
      e.Handled = False 
     Case Else 
      e.Handled = True 
    End Select 


    If (txt1.Text.IndexOf(".") >= 0 And e.KeyChar = ".") Then e.Handled = True 

Весь код находится в событии KeyPress. Я понятия не имею, как заставить ячейку datagridview принимать только один период.

Благодарим за помощь.

+0

Это последняя строка в вашем втором блоке кода должны это сделать. У вас есть другой код после этого, который может установить Handled обратно на false? – Steve

ответ

1

Мероприятие, проводимое лучше с тем, что вы хотите, это CellValueChanged: он просто проверит окончательное значение и, в конце концов, исправит его. Также вы можете положиться на IsNumeric, чтобы быстро найти действительные номера. Пример код для DataGridView1:

Private Sub DataGridView1_CellValueChanged(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged 

    If (e.RowIndex >= 0 AndAlso e.ColumnIndex >= 0) Then 

     Dim curVal As String = DataGridView1(e.ColumnIndex, e.RowIndex).Value.ToString() 
     If (curVal.Trim().Length > 0) Then 

      If (curVal.Contains(".")) Then 
       'Checking whether the given entry has more tha one period 

       Dim temp() As String = curVal.Split("."c) 
       If (temp.Length > 2) Then 
        'More than one period 
        DataGridView1(e.ColumnIndex, e.RowIndex).Value = temp(0) & "." & temp(1) 
       ElseIf (Not IsNumeric(curVal)) Then 
        'Is not numeric 
        DataGridView1(e.ColumnIndex, e.RowIndex).Value = "" 
       End If 

      ElseIf (Not IsNumeric(curVal)) Then 
       'Any other non-numeric entry 
       DataGridView1(e.ColumnIndex, e.RowIndex).Value = "" 
      End If 

     End If 

    End If 

End Sub 

Имейте в виде, что IsNumeric будет перехватывать любую нечисловую ситуацию (например: 1.32.52), таким образом, я включил предварительное условие, чтобы проверить конкретные случаи с более чем одного периода чтобы показать вам, как вы можете иметь дело с разными ситуациями (вы можете проанализировать всю строку для удаления определенных частей, вместо этого просто удалите всю ячейку).

+0

@varcobas: Привет, сэр, спасибо за ответ, из этого кода я сейчас создал рабочий код. Большая помощь для меня, спасибо вам снова :) – Matthew

+0

@Matthew (мой ник - varocarbas), пожалуйста. – varocarbas

+0

oops извините, что – Matthew

0

ЭТО ОЧЕНЬ ЛЕГКО RESTRICT DUPLICATE КНОПКА период В DataGrid ЗРЕНИЯ ВЫ ПРОСТО SUPPLY BEWLOW Упоминается КОД В EditingControlShowingEventArgs СЛУЧАЕ И СОЗДАТЬ ЧАСТНЫЙ SUB ДЛЯ CONTROL_PRESS EVENT.

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

    If TypeOf e.Control Is TextBox Then 
     Dim tb As TextBox = TryCast(e.Control, TextBox) 

     RemoveHandler tb.KeyPress, AddressOf CONTROL_KEYPRESS 
     If Me.DataGridView1.CurrentCell.ColumnIndex = 3 Or Me.DataGridView1.CurrentCell.ColumnIndex = 4 Then 
      AddHandler tb.KeyPress, AddressOf CONTROL_KEYPRESS 
     End If 

    End If 

End Sub 

Private Sub CONTROL_KEYPRESS(ByVal SENDER As TextBox, ByVal E As KeyPressEventArgs) 

    If (Not Char.IsControl(E.KeyChar) And Not Char.IsDigit(E.KeyChar) And E.KeyChar <> "."c) Then 
     E.Handled = True 
    End If 
    If (E.KeyChar = "."c And SENDER.Text.IndexOf("."c) > -1) Then 
     E.Handled = True 

    End If 

End Sub 

PREPED BY FURQAN Халим

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