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

Автоматическое изменение размера элемента управления в пользовательском элементе управления

04.06.2019, 07:39. Показов 1442. Ответов 9
Метки нет (Все метки)

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

Есть пользовательский элемент управления. В составе есть только TextBox. Есть процедуры контроля вводимых значений в поле.
В конструкторе у TextBox жестко установлены параметры размеров (высота и ширина). Соответственно помещая пользовательский элемент управления на форму я всегда имею фиксированный размер по ширине. Но было бы удобнее, если была бы возможность установить элемент на поле формы и изменить его ширину. И вот тут, собственно, вопрос. Как это сделать и возможно ли это? Или под каждый размер необходимо изначально создавать свой элемент управления?
Одной из мыслей было при событии загрузки пользовательского элемента управления менять ширину TextBox в соответствии с шириной пользовательского элемента. Но вот свойство ширины TextBox есть, а свойства ширины пользовательского элемента не могу найти.

Прошу посодействовать в решении вопроса.

С уважением, Алексей.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2019, 07:39
Ответы с готовыми решениями:

Масштабирование шрифта в пользовательском элементе управления
Всем здравствуйте; объявление во внутренних переменных контрола Private m_lblDivFont As Font в...

Многострочное свойство text в пользовательском элементе управления
День добрый, уважаемые коллеги! Возник вопрос, как добавить многострочную переменную в свой...

Возможность перемещения и изменение размера элемента управления в самой программе
Как сделать, чтоб при запущенной программе, можно было перемещать и менять размер определенного...

Форматирование ячеек в элементе управления DataGridView
Здравствуйте, подскажите, как правильно использовать форматирование ячеек, которые формируются при...

__________________
9
Модератор
Эксперт .NET
3251 / 2912 / 448
Регистрация: 27.01.2014
Сообщений: 5,397
04.06.2019, 08:06 2
Allleksey, покажите свой код, чтобы вам наглядно показать.
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 215
04.06.2019, 08:16  [ТС] 3
Кликните здесь для просмотра всего текста

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
' Описание пользовательского текстового поля для ввода цифровой информации.
' Польовательский элемент управления.
' Представляет из себя единственное текстовое поле с дополнительными проверками и настройками по вводимой в поле информации
' Свойство DTB_blnPlusMinus указывает на возможность ввода в начале строки символов плюс и минус
' Свойство DTB_blnSeparator указывает на возможность ввода раздделительного символа запятой (ввод десятичной дроби)
' Свойство DTB_intMaximumValue указывает на максимальное значение, доступное в текстовом поле
' Свойство DTB_intNumberOfDecimalPlaces указывает на количество знаков после запятой в случае ее допустимости
' Свойство DTB_strTextBoxValue для возврата значения тектового поля после завершения его редактирования
'
' ОБЯЗАТЕЛЬНО наличие модуля ModuleChangeDigitalTextBoxValue и процедуры ChangeValue
' Эта процедура обрататывает значение пользовательского текстового поля при завершении его редактирования. 
' По факту эта процедура заменяет обработку события Validated для ткустового поля, но работает одна по всем пользовательским полям.
' Дополнительные процедуры обработки вводимой информации в процессе редактирования вписывается в код текущего класса
'
' Детально, что делает модуль обработки ввода текста
' 1. Игноритует нажатие любых кнопок кроме курсорны. удаление, знаков плюс и минус, запятая и точка, цифры
' 2. Разрешает ввод только одного символа плюм или минус в начале строки. Ввести эти символы повторно или не в начале строки невозможно
' 3. В случае запреста в свойствах ввода символов плюс или минус, блокирует ведение этих символов
' 4. Автоматически меняет введенный символ точка на запятую
' 5. В случае запрета ввода разделителя игноритует нажатие на кнопки точка и запятая
' 6. Запрещает ввод значения большего, чем указано в свойствах
' 7. Запрещает указание большего количества знаком восле запятой, чем указано в свойствах
' 8. Удаляет знак запятой в конце введенного значения, если за ней нет данных
' 9. Удаляет знаки плюс и минус, если после этих знаков ничего нет.
' 10. Удаляет знак плюс и минус в начале строки, если значение в строке равно нулю.
 
 
Public Class DigitalTextBox
    Public Property DTB_blnPlusMinus As Boolean ' Допускается ли плюм или минус в начале
    Public Property DTB_blnSeparator As Boolean ' Допускается ли разделение запятой
    Public Property DTB_blnDeleteLastZero As Boolean ' Допускаются ли нули после запятой, или их нужно далять
    Public Property DTB_intNumberOfDecimalPlaces As Integer ' Количество знаков после запятой
    Public Property DTB_intMaximumValue As Integer ' Максимальное значение, возможное в ячейке
    Public Property DTB_strTextBoxValue As String ' Значение текстового поля, возвращаемого после завершения работы (ввода значения)
 
    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
 
        If sender.text = "" Then
            Me.TextBox1.BackColor = Color.LightYellow
        Else
            Me.TextBox1.BackColor = Color.White
        End If
 
        If sender.text <> "" OrElse sender.text <> Nothing Then
 
            If Not sender.text = "+" AndAlso Not sender.text = "-" Then
                If CDbl(sender.text) > DTB_intMaximumValue Then
                    Dim tmp, tmp1 As String
                    Dim le As Byte
                    tmp = Me.TextBox1.Text
                    le = Len(tmp)
                    tmp1 = Mid(tmp, 1, le - 1)
                    Me.TextBox1.Text = tmp1
                    Me.TextBox1.SelectionStart = le
                End If
            End If
 
        End If
 
    End Sub
 
    Private Sub TextBox1_Validated(sender As Object, e As EventArgs) Handles TextBox1.Validated
 
        ' Процедура удаления запятой в конце введенного значения, если после нее нет данных.
        Dim intSeparatorPosition As Integer = InStr(sender.text, ",", CompareMethod.Text)
        If intSeparatorPosition <> 0 AndAlso Len(sender.text) <> 0 Then
            If intSeparatorPosition = Len(sender.text) Then
                Dim tmp, tmp1 As String
                Dim le As Byte
                tmp = Me.TextBox1.Text
                le = Len(tmp)
                tmp1 = Mid(tmp, 1, le - 1)
                Me.TextBox1.Text = tmp1
                Me.TextBox1.SelectionStart = le
            End If
        End If
 
        ' Удаление знака плюс и минус, если после него нет никакой цифры
        If sender.text = "+" OrElse sender.text = "-" Then
            Dim tmp, tmp1 As String
            Dim le As Byte
            tmp = Me.TextBox1.Text
            le = Len(tmp)
            tmp1 = Mid(tmp, 1, le - 1)
            Me.TextBox1.Text = tmp1
            Me.TextBox1.SelectionStart = le
        End If
 
        ' Удаление знака плюс и минус, если значение в строке равно нулю.
        If InStr(sender.text, "+", CompareMethod.Text) <> 0 OrElse InStr(sender.text, "-", CompareMethod.Text) <> 0 Then
            If CDbl(sender.text) = 0 Then
                sender.text = "0"
            End If
        End If
 
        ' Удаление нулей после запятой, если в свойствах указано удалять.
        If sender.text <> "" Then
            If DTB_blnDeleteLastZero = False Then
                If CDbl(sender.text) = CInt(sender.text) Then sender.text = CInt(sender.text)
            End If
        End If
 
        ' Данные из пользовательского поля поместить в свойство
        ' Запустить процедуру отработки изменения пользовательских полей
        DTB_strTextBoxValue = Me.TextBox1.Text
        Call ModuleChangeDigitalTextBoxValue.ChangeValue()
    End Sub
 
    Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
 
        Dim blnNoClear As Boolean = False
 
        ' Выход из процедуры если нажатые кнопки не соответствуют курсорным, цифровым, знакам плюс, минус, точка, запятая
        If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) _
            AndAlso e.KeyChar <> "+" AndAlso e.KeyChar <> "-" _
            AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
            e.Handled = True
            blnNoClear = True
        End If
 
        ' Проверка на разрешение ввода плюса и минуса и выход из процедуры в случае запрета
        If e.KeyChar = "+" OrElse e.KeyChar = "-" Then
            If DTB_blnPlusMinus = False Then
                e.Handled = True
                blnNoClear = True
            End If
        End If
 
        ' Проверка на разрешение ввода точки и запятой и выход из процедуры в случае запрета
        If e.KeyChar = "," OrElse e.KeyChar = "." Then
            If DTB_blnSeparator = False Then
                e.Handled = True
                blnNoClear = True
            End If
        End If
 
        ' Если нажата точка, то она меняется на запятую.
        If e.KeyChar = "." Then
            e.KeyChar = ","
        End If
        ' Если запятая в начале строки, то запрет ставить запятую.
        If e.KeyChar = "," And sender.SelectionStart = 0 Then
            e.Handled = True
            blnNoClear = True
        End If
 
        ' Удаление повторно вводимого символа ","
        If e.KeyChar = "," And InStr(sender.text, ",", CompareMethod.Text) <> 0 Then
            e.Handled = True
            blnNoClear = True
        End If
 
        ' Удаление из поля всех данных если выбрат весь текст в ячейке и налата любая кнопка.
        If blnNoClear = False Then
            If TextBox1.SelectionLength = TextBox1.Text.Length Then TextBox1.Text = Nothing
        End If
        blnNoClear = False
 
        Dim intFullLenght As Integer = Len(sender.text)
        Dim intSeparatorPosition As Integer = InStr(sender.text, ",", CompareMethod.Text)
        Dim intDelta As Integer = intFullLenght - intSeparatorPosition
        ' Контроль количества введенных символов
        Dim intMaximumValueLenght As Integer ' Длина максимально допустимого значения в текстовом поле
        intMaximumValueLenght = DTB_intMaximumValue.ToString.Length
        If sender.Text.StartsWith("+") Or sender.Text.StartsWith("-") Then ' Если введенные значения начинаются с плюса или минуса, то
            ' Если общая длина равна или больше длинне максимального числа + количеству знаков после запятой плюс 2 (запятая и плюс или минус)
            ' Если длинна символов после запятой равно или больше указанного максимального числа после запятой
            If InStr(sender.text, ".", CompareMethod.Text) <> 0 OrElse InStr(sender.text, ",", CompareMethod.Text) <> 0 Then
                If Len(sender.text) >= intMaximumValueLenght + DTB_intNumberOfDecimalPlaces + 2 OrElse intDelta >= DTB_intNumberOfDecimalPlaces Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        e.Handled = True
                    End If
                End If
            Else
                If Len(sender.text) >= intMaximumValueLenght + 1 Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        e.Handled = True
                    End If
                End If
            End If
        Else
            If InStr(sender.text, ".", CompareMethod.Text) <> 0 OrElse InStr(sender.text, ",", CompareMethod.Text) <> 0 Then
                If Len(sender.text) >= intMaximumValueLenght + DTB_intNumberOfDecimalPlaces + 1 OrElse intDelta >= DTB_intNumberOfDecimalPlaces Then
                    'If Len(sender.text) - InStr(sender.text, ".", CompareMethod.Text) > intNumberOfDecimalPlaces Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        If e.KeyChar = Chr(43) OrElse e.KeyChar = Chr(45) Then
                        Else
                            e.Handled = True
                        End If
                    End If
                    'End If
                End If
            Else
                If Len(sender.text) >= intMaximumValueLenght Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        If e.KeyChar = Chr(43) OrElse e.KeyChar = Chr(45) Then
                        Else
                            e.Handled = True
                        End If
                    End If
                End If
            End If
        End If
 
    End Sub
 
End Class


Код под спойлером. Надеюсь кому то пригодится.
ОффТоп... Может создать ветку, где уважаемые форумчане будут делиться готовыми процедурами для решения вопросов. Наверняка у многих возникают схожие задачи.
0
62 / 59 / 23
Регистрация: 23.07.2014
Сообщений: 120
04.06.2019, 08:33 4
Цитата Сообщение от Allleksey Посмотреть сообщение
а свойства ширины пользовательского элемента не могу найти.
Строки 29-34 ...
Создайте аналогично и будет Вам ширина и высота пользовательского элемента
примерно так
vb.net
1
2
Public Property DTB_Width As Integer ' Ширина
Public Property DTB_Height As Integer ' Высота
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 215
04.06.2019, 08:42  [ТС] 5
Цитата Сообщение от l34ddx Посмотреть сообщение
Создайте аналогично и будет Вам ширина и высота пользовательского элемента
примерно так
Эта мысль мне в голову сразу пришла, но хочется автоматизации
0
Модератор
Эксперт .NET
3251 / 2912 / 448
Регистрация: 27.01.2014
Сообщений: 5,397
04.06.2019, 09:04 6
Цитата Сообщение от Allleksey Посмотреть сообщение
Может создать ветку, где уважаемые форумчане будут делиться готовыми процедурами для решения вопросов. Наверняка у многих возникают схожие задачи.
она уже есть

Visual Basic .NET FAQ. Готовые решения, полезные коды
Исходники на Visual Basic .NET

Добавлено через 4 минуты
а по теме: Почему вы создаете новый элемент управления на основе TextBox, а в коде ссылаетесь на некий TextBox1

Добавлено через 10 минут
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
' Описание пользовательского текстового поля для ввода цифровой информации.
' Польовательский элемент управления.
' Представляет из себя единственное текстовое поле с дополнительными проверками и настройками по вводимой в поле информации
' Свойство DTB_blnPlusMinus указывает на возможность ввода в начале строки символов плюс и минус
' Свойство DTB_blnSeparator указывает на возможность ввода раздделительного символа запятой (ввод десятичной дроби)
' Свойство DTB_intMaximumValue указывает на максимальное значение, доступное в текстовом поле
' Свойство DTB_intNumberOfDecimalPlaces указывает на количество знаков после запятой в случае ее допустимости
' Свойство DTB_strTextBoxValue для возврата значения тектового поля после завершения его редактирования
'
' ОБЯЗАТЕЛЬНО наличие модуля ModuleChangeDigitalTextBoxValue и процедуры ChangeValue
' Эта процедура обрататывает значение пользовательского текстового поля при завершении его редактирования. 
' По факту эта процедура заменяет обработку события Validated для ткустового поля, но работает одна по всем пользовательским полям.
' Дополнительные процедуры обработки вводимой информации в процессе редактирования вписывается в код текущего класса
'
' Детально, что делает модуль обработки ввода текста
' 1. Игноритует нажатие любых кнопок кроме курсорны. удаление, знаков плюс и минус, запятая и точка, цифры
' 2. Разрешает ввод только одного символа плюм или минус в начале строки. Ввести эти символы повторно или не в начале строки невозможно
' 3. В случае запреста в свойствах ввода символов плюс или минус, блокирует ведение этих символов
' 4. Автоматически меняет введенный символ точка на запятую
' 5. В случае запрета ввода разделителя игноритует нажатие на кнопки точка и запятая
' 6. Запрещает ввод значения большего, чем указано в свойствах
' 7. Запрещает указание большего количества знаком восле запятой, чем указано в свойствах
' 8. Удаляет знак запятой в конце введенного значения, если за ней нет данных
' 9. Удаляет знаки плюс и минус, если после этих знаков ничего нет.
' 10. Удаляет знак плюс и минус в начале строки, если значение в строке равно нулю.
 
 
Public Class DigitalTextBox
    Inherits TextBox
    Public Property DTB_blnPlusMinus As Boolean ' Допускается ли плюм или минус в начале
    Public Property DTB_blnSeparator As Boolean ' Допускается ли разделение запятой
    Public Property DTB_blnDeleteLastZero As Boolean ' Допускаются ли нули после запятой, или их нужно далять
    Public Property DTB_intNumberOfDecimalPlaces As Integer ' Количество знаков после запятой
    Public Property DTB_intMaximumValue As Integer ' Максимальное значение, возможное в ячейке
    Public Property DTB_strTextBoxValue As String ' Значение текстового поля, возвращаемого после завершения работы (ввода значения)
 
    Private Sub DigitalTextBox_TextChanged(sender As Object, e As EventArgs) Handles MyBase.TextChanged
        On Error Resume Next
        If sender.text = "" Then
            Me.BackColor = Color.LightYellow
        Else
            Me.BackColor = Color.White
        End If
 
        If sender.text <> "" OrElse sender.text <> Nothing Then
 
            If Not sender.text = "+" AndAlso Not sender.text = "-" Then
                If CDbl(sender.text) > DTB_intMaximumValue Then
                    Dim tmp, tmp1 As String
                    Dim le As Byte
                    tmp = Me.Text
                    le = Len(tmp)
                    tmp1 = Mid(tmp, 1, le - 1)
                    Me.Text = tmp1
                    Me.SelectionStart = le
                End If
            End If
 
        End If
 
    End Sub
 
    Private Sub DigitalTextBox_Validated(sender As Object, e As EventArgs) Handles MyBase.Validated
        On Error Resume Next
        ' Процедура удаления запятой в конце введенного значения, если после нее нет данных.
        Dim intSeparatorPosition As Integer = InStr(sender.text, ",", CompareMethod.Text)
        If intSeparatorPosition <> 0 AndAlso Len(sender.text) <> 0 Then
            If intSeparatorPosition = Len(sender.text) Then
                Dim tmp, tmp1 As String
                Dim le As Byte
                tmp = Me.Text
                le = Len(tmp)
                tmp1 = Mid(tmp, 1, le - 1)
                Me.Text = tmp1
                Me.SelectionStart = le
            End If
        End If
 
        ' Удаление знака плюс и минус, если после него нет никакой цифры
        If sender.text = "+" OrElse sender.text = "-" Then
            Dim tmp, tmp1 As String
            Dim le As Byte
            tmp = Me.Text
            le = Len(tmp)
            tmp1 = Mid(tmp, 1, le - 1)
            Me.Text = tmp1
            Me.SelectionStart = le
        End If
 
        ' Удаление знака плюс и минус, если значение в строке равно нулю.
        If InStr(sender.text, "+", CompareMethod.Text) <> 0 OrElse InStr(sender.text, "-", CompareMethod.Text) <> 0 Then
            If CDbl(sender.text) = 0 Then
                sender.text = "0"
            End If
        End If
 
        ' Удаление нулей после запятой, если в свойствах указано удалять.
        If sender.text <> "" Then
            If DTB_blnDeleteLastZero = False Then
                If CDbl(sender.text) = CInt(sender.text) Then sender.text = CInt(sender.text)
            End If
        End If
 
        ' Данные из пользовательского поля поместить в свойство
        ' Запустить процедуру отработки изменения пользовательских полей
        DTB_strTextBoxValue = Me.Text
        Call ModuleChangeDigitalTextBoxValue.ChangeValue()
    End Sub
 
    Private Sub DigitalTextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
        On Error Resume Next
        Dim blnNoClear As Boolean = False
 
        ' Выход из процедуры если нажатые кнопки не соответствуют курсорным, цифровым, знакам плюс, минус, точка, запятая
        If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) _
            AndAlso e.KeyChar <> "+" AndAlso e.KeyChar <> "-" _
            AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
            e.Handled = True
            blnNoClear = True
        End If
 
        ' Проверка на разрешение ввода плюса и минуса и выход из процедуры в случае запрета
        If e.KeyChar = "+" OrElse e.KeyChar = "-" Then
            If DTB_blnPlusMinus = False Then
                e.Handled = True
                blnNoClear = True
            End If
        End If
 
        ' Проверка на разрешение ввода точки и запятой и выход из процедуры в случае запрета
        If e.KeyChar = "," OrElse e.KeyChar = "." Then
            If DTB_blnSeparator = False Then
                e.Handled = True
                blnNoClear = True
            End If
        End If
 
        ' Если нажата точка, то она меняется на запятую.
        If e.KeyChar = "." Then
            e.KeyChar = ","
        End If
        ' Если запятая в начале строки, то запрет ставить запятую.
        If e.KeyChar = "," And sender.SelectionStart = 0 Then
            e.Handled = True
            blnNoClear = True
        End If
 
        ' Удаление повторно вводимого символа ","
        If e.KeyChar = "," And InStr(sender.text, ",", CompareMethod.Text) <> 0 Then
            e.Handled = True
            blnNoClear = True
        End If
 
        ' Удаление из поля всех данных если выбрат весь текст в ячейке и налата любая кнопка.
        If blnNoClear = False Then
            If Me.SelectionLength = Me.Text.Length Then Me.Text = Nothing
        End If
        blnNoClear = False
 
        Dim intFullLenght As Integer = Len(sender.text)
        Dim intSeparatorPosition As Integer = InStr(sender.text, ",", CompareMethod.Text)
        Dim intDelta As Integer = intFullLenght - intSeparatorPosition
        ' Контроль количества введенных символов
        Dim intMaximumValueLenght As Integer ' Длина максимально допустимого значения в текстовом поле
        intMaximumValueLenght = DTB_intMaximumValue.ToString.Length
        If sender.Text.StartsWith("+") Or sender.Text.StartsWith("-") Then ' Если введенные значения начинаются с плюса или минуса, то
            ' Если общая длина равна или больше длинне максимального числа + количеству знаков после запятой плюс 2 (запятая и плюс или минус)
            ' Если длинна символов после запятой равно или больше указанного максимального числа после запятой
            If InStr(sender.text, ".", CompareMethod.Text) <> 0 OrElse InStr(sender.text, ",", CompareMethod.Text) <> 0 Then
                If Len(sender.text) >= intMaximumValueLenght + DTB_intNumberOfDecimalPlaces + 2 OrElse intDelta >= DTB_intNumberOfDecimalPlaces Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        e.Handled = True
                    End If
                End If
            Else
                If Len(sender.text) >= intMaximumValueLenght + 1 Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        e.Handled = True
                    End If
                End If
            End If
        Else
            If InStr(sender.text, ".", CompareMethod.Text) <> 0 OrElse InStr(sender.text, ",", CompareMethod.Text) <> 0 Then
                If Len(sender.text) >= intMaximumValueLenght + DTB_intNumberOfDecimalPlaces + 1 OrElse intDelta >= DTB_intNumberOfDecimalPlaces Then
                    'If Len(sender.text) - InStr(sender.text, ".", CompareMethod.Text) > intNumberOfDecimalPlaces Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        If e.KeyChar = Chr(43) OrElse e.KeyChar = Chr(45) Then
                        Else
                            e.Handled = True
                        End If
                    End If
                    'End If
                End If
            Else
                If Len(sender.text) >= intMaximumValueLenght Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        If e.KeyChar = Chr(43) OrElse e.KeyChar = Chr(45) Then
                        Else
                            e.Handled = True
                        End If
                    End If
                End If
            End If
        End If
 
    End Sub
 
End Class
то в свойствах будут доступны и Width и Height и все что причитается к стандартному TextBox
0
Модератор
Эксперт .NET
3251 / 2912 / 448
Регистрация: 27.01.2014
Сообщений: 5,397
04.06.2019, 09:18 7
Allleksey, а еще, если вы замените строки 30-35 на
vb.net
1
2
3
4
5
6
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("PlusMinus"), System.ComponentModel.Description("Допускается ли плюм или минус в начале")> Public Property DTB_blnPlusMinus As Boolean
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("Separator"), System.ComponentModel.Description("Допускается ли разделение запятой")> Public Property DTB_blnSeparator As Boolean
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("DeleteLastZero"), System.ComponentModel.Description("Допускаются ли нули после запятой, или их нужно далять")> Public Property DTB_blnDeleteLastZero As Boolean
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("NumberOfDecimalPlaces"), System.ComponentModel.Description("Количество знаков после запятой")> Public Property DTB_intNumberOfDecimalPlaces As Integer
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("MaximumValue"), System.ComponentModel.Description("Максимальное значение, возможное в ячейке")> Public Property DTB_intMaximumValue As Integer
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("TextBoxValue"), System.ComponentModel.Description("Значение текстового поля, возвращаемого после завершения работы (ввода значения)")> Public Property DTB_strTextBoxValue As String
тогда ваши свойства будут в окне свойств красиво сгруппированы в категорию с вашим именем
Автоматическое изменение размера элемента управления в пользовательском элементе управления
2
Модератор
Эксперт .NET
3251 / 2912 / 448
Регистрация: 27.01.2014
Сообщений: 5,397
04.06.2019, 09:23 8
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

ну и финальный вариант от меня
Кликните здесь для просмотра всего текста
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
' Описание пользовательского текстового поля для ввода цифровой информации.
' Польовательский элемент управления.
' Представляет из себя единственное текстовое поле с дополнительными проверками и настройками по вводимой в поле информации
' Свойство DTB_blnPlusMinus указывает на возможность ввода в начале строки символов плюс и минус
' Свойство DTB_blnSeparator указывает на возможность ввода раздделительного символа запятой (ввод десятичной дроби)
' Свойство DTB_intMaximumValue указывает на максимальное значение, доступное в текстовом поле
' Свойство DTB_intNumberOfDecimalPlaces указывает на количество знаков после запятой в случае ее допустимости
' Свойство DTB_strTextBoxValue для возврата значения тектового поля после завершения его редактирования
'
' ОБЯЗАТЕЛЬНО наличие модуля ModuleChangeDigitalTextBoxValue и процедуры ChangeValue
' Эта процедура обрататывает значение пользовательского текстового поля при завершении его редактирования. 
' По факту эта процедура заменяет обработку события Validated для ткустового поля, но работает одна по всем пользовательским полям.
' Дополнительные процедуры обработки вводимой информации в процессе редактирования вписывается в код текущего класса
'
' Детально, что делает модуль обработки ввода текста
' 1. Игноритует нажатие любых кнопок кроме курсорны. удаление, знаков плюс и минус, запятая и точка, цифры
' 2. Разрешает ввод только одного символа плюм или минус в начале строки. Ввести эти символы повторно или не в начале строки невозможно
' 3. В случае запреста в свойствах ввода символов плюс или минус, блокирует ведение этих символов
' 4. Автоматически меняет введенный символ точка на запятую
' 5. В случае запрета ввода разделителя игноритует нажатие на кнопки точка и запятая
' 6. Запрещает ввод значения большего, чем указано в свойствах
' 7. Запрещает указание большего количества знаком восле запятой, чем указано в свойствах
' 8. Удаляет знак запятой в конце введенного значения, если за ней нет данных
' 9. Удаляет знаки плюс и минус, если после этих знаков ничего нет.
' 10. Удаляет знак плюс и минус в начале строки, если значение в строке равно нулю.
 
 
Public Class DigitalTextBox
    Inherits TextBox
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("PlusMinus"), System.ComponentModel.Description("Допускается ли плюм или минус в начале")> Public Property DTB_blnPlusMinus As Boolean
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("Separator"), System.ComponentModel.Description("Допускается ли разделение запятой")> Public Property DTB_blnSeparator As Boolean
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("DeleteLastZero"), System.ComponentModel.Description("Допускаются ли нули после запятой, или их нужно далять")> Public Property DTB_blnDeleteLastZero As Boolean
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("NumberOfDecimalPlaces"), System.ComponentModel.Description("Количество знаков после запятой")> Public Property DTB_intNumberOfDecimalPlaces As Integer
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("MaximumValue"), System.ComponentModel.Description("Максимальное значение, возможное в ячейке")> Public Property DTB_intMaximumValue As Integer
    <System.ComponentModel.Category("МОЯ КАТЕГОРИЯ"), System.ComponentModel.DisplayName("TextBoxValue"), System.ComponentModel.Description("Значение текстового поля, возвращаемого после завершения работы (ввода значения)")> Public Property DTB_strTextBoxValue As String
 
    Private Sub DigitalTextBox_TextChanged(sender As Object, e As EventArgs) Handles MyBase.TextChanged
        On Error Resume Next
        If sender.text = "" Then
            Me.BackColor = Color.LightYellow
        Else
            Me.BackColor = Color.White
        End If
 
        If sender.text <> "" OrElse sender.text <> Nothing Then
 
            If Not sender.text = "+" AndAlso Not sender.text = "-" Then
                If CDbl(sender.text) > DTB_intMaximumValue Then
                    Dim tmp, tmp1 As String
                    Dim le As Byte
                    tmp = Me.Text
                    le = Len(tmp)
                    tmp1 = Mid(tmp, 1, le - 1)
                    Me.Text = tmp1
                    Me.SelectionStart = le
                End If
            End If
 
        End If
 
    End Sub
 
    Private Sub DigitalTextBox_Validated(sender As Object, e As EventArgs) Handles MyBase.Validated
        On Error Resume Next
        ' Процедура удаления запятой в конце введенного значения, если после нее нет данных.
        Dim intSeparatorPosition As Integer = InStr(sender.text, ",", CompareMethod.Text)
        If intSeparatorPosition <> 0 AndAlso Len(sender.text) <> 0 Then
            If intSeparatorPosition = Len(sender.text) Then
                Dim tmp, tmp1 As String
                Dim le As Byte
                tmp = Me.Text
                le = Len(tmp)
                tmp1 = Mid(tmp, 1, le - 1)
                Me.Text = tmp1
                Me.SelectionStart = le
            End If
        End If
 
        ' Удаление знака плюс и минус, если после него нет никакой цифры
        If sender.text = "+" OrElse sender.text = "-" Then
            Dim tmp, tmp1 As String
            Dim le As Byte
            tmp = Me.Text
            le = Len(tmp)
            tmp1 = Mid(tmp, 1, le - 1)
            Me.Text = tmp1
            Me.SelectionStart = le
        End If
 
        ' Удаление знака плюс и минус, если значение в строке равно нулю.
        If InStr(sender.text, "+", CompareMethod.Text) <> 0 OrElse InStr(sender.text, "-", CompareMethod.Text) <> 0 Then
            If CDbl(sender.text) = 0 Then
                sender.text = "0"
            End If
        End If
 
        ' Удаление нулей после запятой, если в свойствах указано удалять.
        If sender.text <> "" Then
            If DTB_blnDeleteLastZero = False Then
                If CDbl(sender.text) = CInt(sender.text) Then sender.text = CInt(sender.text)
            End If
        End If
 
        ' Данные из пользовательского поля поместить в свойство
        ' Запустить процедуру отработки изменения пользовательских полей
        DTB_strTextBoxValue = Me.Text
        Call ModuleChangeDigitalTextBoxValue.ChangeValue()
    End Sub
 
    Private Sub DigitalTextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
        On Error Resume Next
        Dim blnNoClear As Boolean = False
 
        ' Выход из процедуры если нажатые кнопки не соответствуют курсорным, цифровым, знакам плюс, минус, точка, запятая
        If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) _
            AndAlso e.KeyChar <> "+" AndAlso e.KeyChar <> "-" _
            AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
            e.Handled = True
            blnNoClear = True
        End If
 
        ' Проверка на разрешение ввода плюса и минуса и выход из процедуры в случае запрета
        If e.KeyChar = "+" OrElse e.KeyChar = "-" Then
            If DTB_blnPlusMinus = False Then
                e.Handled = True
                blnNoClear = True
            End If
        End If
 
        ' Проверка на разрешение ввода точки и запятой и выход из процедуры в случае запрета
        If e.KeyChar = "," OrElse e.KeyChar = "." Then
            If DTB_blnSeparator = False Then
                e.Handled = True
                blnNoClear = True
            End If
        End If
 
        ' Если нажата точка, то она меняется на запятую.
        If e.KeyChar = "." Then
            e.KeyChar = ","
        End If
        ' Если запятая в начале строки, то запрет ставить запятую.
        If e.KeyChar = "," And sender.SelectionStart = 0 Then
            e.Handled = True
            blnNoClear = True
        End If
 
        ' Удаление повторно вводимого символа ","
        If e.KeyChar = "," And InStr(sender.text, ",", CompareMethod.Text) <> 0 Then
            e.Handled = True
            blnNoClear = True
        End If
 
        ' Удаление из поля всех данных если выбрат весь текст в ячейке и налата любая кнопка.
        If blnNoClear = False Then
            If Me.SelectionLength = Me.Text.Length Then Me.Text = Nothing
        End If
        blnNoClear = False
 
        Dim intFullLenght As Integer = Len(sender.text)
        Dim intSeparatorPosition As Integer = InStr(sender.text, ",", CompareMethod.Text)
        Dim intDelta As Integer = intFullLenght - intSeparatorPosition
        ' Контроль количества введенных символов
        Dim intMaximumValueLenght As Integer ' Длина максимально допустимого значения в текстовом поле
        intMaximumValueLenght = DTB_intMaximumValue.ToString.Length
        If sender.Text.StartsWith("+") Or sender.Text.StartsWith("-") Then ' Если введенные значения начинаются с плюса или минуса, то
            ' Если общая длина равна или больше длинне максимального числа + количеству знаков после запятой плюс 2 (запятая и плюс или минус)
            ' Если длинна символов после запятой равно или больше указанного максимального числа после запятой
            If InStr(sender.text, ".", CompareMethod.Text) <> 0 OrElse InStr(sender.text, ",", CompareMethod.Text) <> 0 Then
                If Len(sender.text) >= intMaximumValueLenght + DTB_intNumberOfDecimalPlaces + 2 OrElse intDelta >= DTB_intNumberOfDecimalPlaces Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        e.Handled = True
                    End If
                End If
            Else
                If Len(sender.text) >= intMaximumValueLenght + 1 Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        e.Handled = True
                    End If
                End If
            End If
        Else
            If InStr(sender.text, ".", CompareMethod.Text) <> 0 OrElse InStr(sender.text, ",", CompareMethod.Text) <> 0 Then
                If Len(sender.text) >= intMaximumValueLenght + DTB_intNumberOfDecimalPlaces + 1 OrElse intDelta >= DTB_intNumberOfDecimalPlaces Then
                    'If Len(sender.text) - InStr(sender.text, ".", CompareMethod.Text) > intNumberOfDecimalPlaces Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        If e.KeyChar = Chr(43) OrElse e.KeyChar = Chr(45) Then
                        Else
                            e.Handled = True
                        End If
                    End If
                    'End If
                End If
            Else
                If Len(sender.text) >= intMaximumValueLenght Then
                    If e.KeyChar <> Chr(8) AndAlso e.KeyChar <> "." AndAlso e.KeyChar <> "," Then
                        If e.KeyChar = Chr(43) OrElse e.KeyChar = Chr(45) Then
                        Else
                            e.Handled = True
                        End If
                    End If
                End If
            End If
        End If
 
    End Sub
 
End Class


и еще, вам стоит включить код из модуля ModuleChangeDigitalTextBoxValue в процедуре ChangeValue() в ваш пользовательский элемент, иначе, как у меня и как у всех остальных - будет ошибка, так как у нас то этого кода нету.

Добавлено через 1 минуту
а от меня - я не вижу смысла в этом элементе управления, так как практически все тоже самое можно сделать с помощью стандартного NumericUpDown
Автоматическое изменение размера элемента управления в пользовательском элементе управления
2
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 215
04.06.2019, 09:37  [ТС] 9
Цитата Сообщение от Yury Komar Посмотреть сообщение
я не вижу смысла в этом элементе управления
Я не волшебник, я только учусь У меня нет образования по программированию, по этому все, что я пытаюсь сделать, в основном базируется на самообучении и своих же ошибках. Я еще многое не знаю (хотя, наверное, будет правильнее сказать, что я практически ничего еще не знаю).
По этому и обращаюсь за помощью к уважаемым форумчанам, что бы поправить кривизну своих рук и хотя бы чему то научится.
Спасибо большое за помощь.

Добавлено через 4 минуты
И это мой первый опыт по созданию пользовательского элемента управления. С чего то нужно было начинать
0
Yury Komar
04.06.2019, 10:11     Автоматическое изменение размера элемента управления в пользовательском элементе управления
  #10

Не по теме:

Allleksey, я тоже не имею образования по программированию, тоже сам учусь, причем до сих пор учусь... Так что у вас все впереди.

0
04.06.2019, 10:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2019, 10:11
Привет! Вот еще темы с ответами:

Создание объединенных строк в элементе управления DataGridView
Необходимо создать таблицу в которой первая объединенная табличная строка «Телефонный справочник» ...

Периодическая смена интернет-адреса в элементе управления LinkLabel
Надо на VB подскажите код. Создать приложение, используя элемент управления Timer, с целью...

Изменение размера UserControl при изменении размера элемента на нем
Здравствуйте. У меня на UserControl находится TextBox. Выполняю построение. В конструкторе переношу...

Автоматическое изменение размера формы с сохранением пропорций элементов
Здравствуйте! Нужна помощь, есть программа с большим количеством форм. Все формы в ней FixedSingle...


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

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

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