Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 215
1

Запрет ввода в ячейки DataGridView символов кроме цифр и ","

26.11.2018, 10:33. Показов 1536. Ответов 4
Метки нет (Все метки)

Добрый день, коллеги!

Есть DataGridView1. есть запрет редактирования столбцов:
VB.NET
1
2
3
4
5
6
7
8
Private Sub DataGridView1_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles 
        DataGridView1.CellBeginEdit
        If (e.ColumnIndex = 1) Or (e.ColumnIndex = 15) Or (e.ColumnIndex = 17) Or (e.ColumnIndex = 18) Or (e.ColumnIndex = 19) 
                   Or (e.ColumnIndex = 21) Or (e.ColumnIndex = 22) Or
                   (e.ColumnIndex = 23) = True Then
            e.Cancel = True
        End If
    End Sub
Попытался по аналогии из ранее обсуждаемой темы запретить ввод любых символов, кроме цифр и запятой:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Sub DataGridView1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles DataGridView1.KeyPress
        ' Разрешается ввод только чисел и ","
        If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) AndAlso e.KeyChar <> "," Then
            e.Handled = True
        End If
        ' запрещается ввод второй запятой
        If e.KeyChar = "," AndAlso InStr(sender.text, Chr(44)) > 1 Then
            e.Handled = True
        End If
        ' запрещается ввод запятой в начале
        If e.KeyChar = "," AndAlso Len(sender.text) = 0 Then
            e.Handled = True
        End If
        'Задаем кол-во символов для ввода при условии наличия или отсутствия запятой в поле
        If InStr(sender.text, Chr(44)) = 0 AndAlso e.KeyChar <> "," Then ' если в textbox нет запятых и нажата кнопка не "," то 
                 длина поля 2 символа
            If sender.textlength >= 2 AndAlso Not Char.IsControl(e.KeyChar) Then
                e.Handled = True
            End If
        ElseIf (InStr(sender.text, Chr(44)) > 0) Or ((InStr(sender.text, Chr(44)) = 0) And (e.KeyChar = ",")) = True Then ' если в поле 
                 есть ","или нет запятой, но нажата кнопка "," то длина поля 4 символа
            If sender.textlength >= 4 AndAlso Not Char.IsControl(e.KeyChar) Then
                e.Handled = True
            End If
        End If
    End Sub
Но вот не сработала идея. Подскажите, где "накосячил"?

Добавлено через 1 час 54 минуты
ДОПОЛНЕНИЕ...

В в обработчике события нажатия кнопки добавил
VB.NET
1
Debug.Print("Обработка события нажатия клавиши")
Так вот это сообщение не появляется. Т.е. система не обрабатывает нажатие кнопки во время редактирования ячейки.
Второй момент. Событие CellBeginEdit возникает когда начинается редактирование ячейки и не повторяется в процессе редактирования.

Что посоветуете? Как поставить ограничение вводимых символов?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2018, 10:33
Ответы с готовыми решениями:

Запрет ввода символов кроме цифр в TextBox
как запретить ввод букв и остальных символов кроме цифр в textbox'e

Запрет ввода всех символов кроме цифр и запятой
Здравствуйте как можно сделать так чтобы в textBox можно было бы вводить с клавиатуры лишь цифры и...

Запрет ввода любых символов кроме цифр в консоли
Ребята подскажите пожалуйста можно ли как-то разрешать ввод в консоль только цифр. Я делаю проверку...

"Приведение типа "|DBNull" к типу "String" при попытке загрузить данные из ячейки DataGridView в ComboBox
Доброго времени суток! Сама ошибка &quot;Приведение типа &quot;|DBNull&quot; к типу &quot;String&quot; является...

4
Лень — мое второе и
3035 / 2249 / 656
Регистрация: 28.11.2014
Сообщений: 3,439
Записей в блоге: 2
26.11.2018, 10:36 2
Allleksey, как вариант
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Dim num_col As Integer = 0 'индекс целевого столбца
    Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        RemoveHandler e.Control.KeyPress, AddressOf Column1_KeyPress
        If DataGridView1.CurrentCell.ColumnIndex = num_col Then 'индекс целевого столбца
            Dim tb As TextBox = TryCast(e.Control, TextBox)
            If tb IsNot Nothing Then
                AddHandler tb.KeyPress, AddressOf Column1_KeyPress
            End If
        End If
    End Sub
    Private Sub Column1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles DataGridView1.KeyPress
        ' Разрешается воод только чисел и точки
        If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) AndAlso e.KeyChar <> "." Then
            e.Handled = True
        End If
        ' только одна точка
        If e.KeyChar = "." AndAlso (TryCast(sender, TextBox)).Text.IndexOf(".") > -1 Then
            e.Handled = True
        End If
        ' запрещается точка в начале строки
        If e.KeyChar = "." AndAlso (TryCast(sender, TextBox)).TextLength = 0 Then
            e.Handled = True
        End If
    End Sub
 
    Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        'запрещаем . быть последним символом
        If DataGridView1.CurrentCell.ColumnIndex = num_col Then 'индекс целевого столбца
            Dim n As String = DataGridView1.Item(num_col, e.RowIndex).Value.ToString
            Dim m As String = Microsoft.VisualBasic.Strings.Right(n, 1)
            If m = "." Then
                DataGridView1.Item(num_col, e.RowIndex).Value = n.Replace(m, "")
            End If
        End If
    End Sub
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 215
26.11.2018, 12:21  [ТС] 3
ЕЩЕ ДОПОЛНЕНИЕ...
Как не странно в описании тут: https://docs.microsoft.com/ru-... work-4.7.2
про события обработки нажатия на кнопки вообще ничего не сказано. А в VisualStudio такие события есть. Но они не работают :/

Добавлено через 55 минут
Orlangur1991,
В вашем коде добавил сообщения отладчика:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        Debug.Print("Обработка события EditingControlShowing")
        RemoveHandler e.Control.KeyPress, AddressOf Column1_KeyPress
        If DataGridView1.CurrentCell.ColumnIndex = num_col Then 'индекс целевого столбца
            Dim tb As TextBox = TryCast(e.Control, TextBox)
            If tb IsNot Nothing Then
                AddHandler tb.KeyPress, AddressOf Column1_KeyPress
            End If
        End If
    End Sub
 
 
    Private Sub Column1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles DataGridView1.KeyPress
        Debug.Print("Обработка события Column1_KeyPress")
        ' Разрешается воод только чисел и точки
        If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) AndAlso e.KeyChar <> "." Then
            e.Handled = True
        End If
        ' только одна точка
        If e.KeyChar = "." AndAlso (TryCast(sender, TextBox)).Text.IndexOf(".") > -1 Then
            e.Handled = True
        End If
        ' запрещается точка в начале строки
        If e.KeyChar = "." AndAlso (TryCast(sender, TextBox)).TextLength = 0 Then
            e.Handled = True
        End If
    End Sub
 
 
    Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        Debug.Print("Обработка события CellEndEdit")
        'запрещаем . быть последним символом
        If DataGridView1.CurrentCell.ColumnIndex = num_col Then 'индекс целевого столбца
            Dim n As String = DataGridView1.Item(num_col, e.RowIndex).Value.ToString
            Dim m As String = Microsoft.VisualBasic.Strings.Right(n, 1)
            If m = "," Then
                DataGridView1.Item(num_col, e.RowIndex).Value = n.Replace(m, "")
            End If
        End If
 
        Dim intDGVRowIndex As Integer
        Dim intDGVColumnIndex As String
        intDGVRowIndex = e.RowIndex
        intDGVColumnIndex = e.ColumnIndex
        Call ReCaltTab(intDGVRowIndex)
    End Sub
В отладчике не выдается сообщение о начале обработки события Column1_KeyPress
Что то не правильно сделал в коде?

Добавлено через 43 минуты
Orlangur1991,
Прошел код по шагам. Разобрался. Ошибка в коде:
Должно быть НЕ РАВНО
VB.NET
1
If DataGridView1.CurrentCell.ColumnIndex <> num_col Then 'индекс целевого столбца
0
Лень — мое второе и
3035 / 2249 / 656
Регистрация: 28.11.2014
Сообщений: 3,439
Записей в блоге: 2
26.11.2018, 12:30 4
Allleksey, никаких ошибок, в данном случае код работает для одного столбца и тут идет проверка, редактируете вы ячейку в этом столбце или в другом
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 215
26.11.2018, 13:36  [ТС] 5
Orlangur1991, Эм... значит не совсем разобрался в коде. Прошу прощения.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2018, 13:36

Запрет ввода в текстбокс кроме цифр от 1 до 9
Добрый день! Подскажите, как можно запретить ввод в текстбокс всего (букв и символов, в т.ч. и...

Запрет ввода всего кроме положительных цифр
Пожалуйста, помогите разобраться. Необходимо разрешить ввод только чисел (положительных). в коде:...

Запрет ввода "#","№","номер" в TextBox
Собственно задача такова: имеется TextEdit. Хотелось бы, чтобы туда нельзя было вводить...

При вводе любых символов (кроме "1" - "5") выводить ошибку
var x,y:integer; z:real; n:byte; begin writeln(' '); writeln('Введите длину отрезка: ');...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.