Можно ли сделать в одном из столбцов DataGrid маску ввода для ввода даты(DateTime)
Пример: дд.мм.гг
Здравствуйте, Аноним, Вы писали:
А>Можно ли сделать в одном из столбцов DataGrid маску ввода для ввода даты(DateTime)
А>Пример: дд.мм.гг
В описании стиля грида:
Dim col As New DataGridTextBoxColumn
With col
.MappingName = "TransitDateTime"
.HeaderText = "Дата"
.Width = 130
.TextBox.MaxLength = 16
.Format = "dd.MM.yyyy HH:mm"
.NullText = ""
End With
AddHandler col.TextBox.KeyDown, AddressOf ut_ValidDateTimeInput
[AddHandler col.TextBox.KeyDown, AddressOf ut_ValidDateTimeInput] — ссылка на обработчик ввода
Процедура обработки ввода:
Public Sub ut_ValidDateTimeInput(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
Dim mVal As String
Dim PosInVAL As Integer
Dim PosInTXT As Integer
mVal = sender.Text
PosInTXT = sender.SelectionStart
mVal = mVal.Replace(".", "")
mVal = mVal.Replace(" ", "")
mVal = mVal.Replace(":", "")
mVal = mVal.Replace("_", "")
If PosInTXT = 0 Then PosInVAL = 0
If PosInTXT = 1 Then PosInVAL = 1
If PosInTXT = 2 Then PosInVAL = 2
If PosInTXT = 3 Then PosInVAL = 2
If PosInTXT = 4 Then PosInVAL = 3
If PosInTXT = 5 Then PosInVAL = 4
If PosInTXT = 6 Then PosInVAL = 4
If PosInTXT = 7 Then PosInVAL = 5
If PosInTXT = 8 Then PosInVAL = 6
If PosInTXT = 9 Then PosInVAL = 7
If PosInTXT = 10 Then PosInVAL = 8
If PosInTXT = 11 Then PosInVAL = 8
If PosInTXT = 12 Then PosInVAL = 9
If PosInTXT = 13 Then PosInVAL = 10
If PosInTXT = 14 Then PosInVAL = 10
If PosInTXT = 15 Then PosInVAL = 11
If PosInTXT = 16 Then PosInVAL = 12
If Not IsNumeric(mVal) And Len(mVal) > 0 Then
mVal = mVal.Remove(mVal.Length — 1, 1)
PosInVAL = PosInVAL — 1
End If
If e.KeyCode = Keys.Back Then
If mVal.Length > 0 And PosInVAL > 0 And mVal.Length = PosInVAL Then
If PosInTXT < 15 Then
mVal = mVal.Remove(PosInVAL — 1, 1)
PosInVAL = PosInVAL — 1
End If
End If
Else
'============= подстановка месяца
If mVal.Length = 3 Then
If mVal.Substring(2, 1) > 1 Then
mVal = mVal.Substring(0, 2) & "0" & mVal.Substring(2, 1)
PosInVAL = PosInVAL + 1
End If
End If
'============= подстановка года
If mVal.Length = 5 Then
If mVal.Substring(4, 1) > 2 Then
mVal = mVal.Substring(0, 4) & "200" & mVal.Substring(4, 1)
PosInVAL = PosInVAL + 3
End If
End If
If mVal.Length > PosInVAL And PosInVAL > 0 Then
mVal = mVal.Insert(PosInVAL — 1, e.KeyData)
'PosInVAL = PosInVAL + 1
End If
End If
If PosInVAL = 0 Then PosInTXT = 0
If PosInVAL = 1 Then PosInTXT = 1
If PosInVAL = 2 Then PosInTXT = 3
If PosInVAL = 3 Then PosInTXT = 4
If PosInVAL = 4 Then PosInTXT = 6
If PosInVAL = 5 Then PosInTXT = 7
If PosInVAL = 6 Then PosInTXT = 8
If PosInVAL = 7 Then PosInTXT = 9
If PosInVAL = 8 Then PosInTXT = 11
If PosInVAL = 9 Then PosInTXT = 12
If PosInVAL = 10 Then PosInTXT = 14
If PosInVAL = 11 Then PosInTXT = 15
'================= ЗАПИСЬ В ТЕКСТВОХ
If mVal.Length = 0 And e.KeyCode = Keys.Back Then sender.Text = mVal.Insert(0, "")
If mVal.Length = 1 Then sender.Text = mVal.Insert(1, "_.__.____ __:__") : sender.SelectionStart = 1 : sender.SelectionLength = 1
If mVal.Length = 2 Then sender.Text = mVal.Insert(2, ".__.____ __:__") : sender.SelectionStart = 3 : sender.SelectionLength = 2
If mVal.Length = 3 Then sender.Text = mVal.Substring(0, 2) & "." & mVal.Substring(2, 1) & "_.____ __:__" : sender.SelectionStart = 4 : sender.SelectionLength = 1
If mVal.Length = 4 Then sender.Text = mVal.Substring(0, 2) & "." & mVal.Substring(2, 2) & ".____ __:__" : sender.SelectionStart = 6 : sender.SelectionLength = 4
If mVal.Length = 5 Then sender.Text = mVal.Substring(0, 2) & "." & mVal.Substring(2, 2) & "." & mVal.Substring(4, 1) & "___ __:__" : sender.SelectionStart = 7 : sender.SelectionLength = 3
If mVal.Length = 6 Then sender.Text = mVal.Substring(0, 2) & "." & mVal.Substring(2, 2) & "." & mVal.Substring(4, 2) & "__ __:__" : sender.SelectionStart = 8 : sender.SelectionLength = 2
If mVal.Length = 7 Then sender.Text = mVal.Substring(0, 2) & "." & mVal.Substring(2, 2) & "." & mVal.Substring(4, 3) & "_ __:__" : sender.SelectionStart = 9 : sender.SelectionLength = 1
If mVal.Length = 8 Then sender.Text = mVal.Substring(0, 2) & "." & mVal.Substring(2, 2) & "." & mVal.Substring(4, 4) & " __:__" : sender.SelectionStart = 11 : sender.SelectionLength = 2
If mVal.Length = 9 Then sender.Text = mVal.Substring(0, 2) & "." & mVal.Substring(2, 2) & "." & mVal.Substring(4, 4) & " " & mVal.Substring(8, 1) & "_:__" : sender.SelectionStart = 12 : sender.SelectionLength = 1
If mVal.Length = 10 Then sender.Text = mVal.Substring(0, 2) & "." & mVal.Substring(2, 2) & "." & mVal.Substring(4, 4) & " " & mVal.Substring(8, 2) & ":__" : sender.SelectionStart = 14 : sender.SelectionLength = 2
If e.KeyData <> Keys.Left And e.KeyData <> Keys.Right Then sender.SelectionStart = PosInTXT
End Sub
Процедура несовершенна, создавалась в попыхах, но работает удовлетворительно.
В этом алгоритме проблемы с редактирование введённых данных.
Может кто-нибудь доработает алгоритм или поделится своим. Сейчас работаю над новым проектом, опять понадобится, а глючный ставить не охота.