Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: TextBox Добавлено: 21.05.07 19:46  

Автор вопроса:  Айрат
Подскажите, плз, как мне сделать так, чтобы в текстовом поле вводились только числа?

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 21.05.07 20:04
Subclassing элемента управления
    Теперь самое время перейти к более интересному варианту - расширим свойства стандартного элемента управления TextBox. Для этого снова создайте новый проект (либо, опять-таки возьмите мой из архива). Прежде всего определимся, чего бы нам хотелось получить от этого нового-старого контрола. На этот раз не будем проявлять особую оригинальность и создадим компонент позволяющий вводить только числа, такой контрол нам всегда пригодится. При этом этот контрол не позволяет производить копирование и вставку текста и не отображает ниспадающего меню по щелчку правой кнопкой мыши. Также, в качестве тренировки, добавим запрет на присвоение значения Text непосредственно из кода.
    Добавьте в проект новый UserControl, назовите его NumbersBox . И переходите сразу к редактированию кода. По умолчанию новый класс наследуется от System.Windows.Forms.UserControl, но нам это не подходит, мы же не хотим добавить TextBox на наш контрол и создавать элемент управления содержащий TextBox. Наша задача - расширить функциональность TextBox непосредственно. Поэтому смело заменяем строку:

Inherits System.Windows.Forms.UserControl

На:

Inherits System.Windows.Forms.TextBox

    Так мы получили контрол, который уже включает в себя все функции, методы и свойства стандартного элемента TextBox. Теперь в Toolbox на вкладке My User Controls отображается наш NumbersBox. Налюбовавшись на это чудо дивное, перейдем непосредственно к реализации задуманного. Опять-же, основная часть кода будет сосредоточена в WndProc.

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case WM_CHAR
' Если не число или Backspace, то не надо нам этого вообще
If (m.WParam.ToInt32 > 57 Or m.WParam.ToInt32 < 48) And _
m.WParam.ToInt32 <> 8 Then Return
' Не пускаем Ctrl+C, Ctrl+V или Ctrl+X
If Me.ModifierKeys.Control And (m.WParam.ToInt32 = 3 Or _
m.WParam.ToInt32 = 22 Or m.WParam.ToInt32 = 24) Then Return
Case WM_RBUTTONDOWN ' Не надо нам никаких менюшек при правом клике
Return
End Select
MyBase.WndProc(m) ' Передаем события дальше
End Sub

    А для того, чтобы запретить присвоение значения Text из кода (то есть текст может быть введен только непосредственно с клавиатуры), нужно переопределить свойство Text базового контрола TextBox. Заметьте, мы не можем сделать это свойство ReadOnly, т.к. базовое свойство таковым не является, но это легко обходится с помощью небольшой хитрости.

Public Overrides Property Text() As String
Get
Return MyBase.Text.ToString
End Get
Set(ByVal Value As String)
' А тут ничего не делаем
End Set
End Property

    Теперь вы можете просто перетащить контрол на форму, запустить проект на выполнение и порадоваться этому "гениальному" творению.

Ответить

Номер ответа: 2
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #2 Добавлено: 22.05.07 02:00
Private Sub txtNumber_KeyPress(byVal sender as Object, _
ByVal e as Systen.Windows.forms.KeyPressEventArgs) _
Handles txtNumber.KeyPress

'Это не позволит ввести ничего кроме числа

If Not (e.KeyChar.IsDigit(e.KeyChar)) And _
e.KeyChar<>ChrW(Keys.Back) Then

  e.Handles=True
End if

End Sub

Ответить

Номер ответа: 3
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #3 Добавлено: 22.05.07 05:40
yxaxa

Дай пожалуйста ссылку на эту книгу или статью.

Ответить

Номер ответа: 4
Автор ответа:
 Arvitaly



ICQ: 301746136 

Вопросов: 28
Ответов: 549
 Web-сайт: okazani.ru
 Профиль | | #4
Добавлено: 22.05.07 12:49
просто стиль задать и все

'This project needs a TextBox
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Const GWL_STYLE = (-16)
Const ES_NUMBER = &H2000&
Public Sub SetNumber(NumberText As TextBox, Flag As Boolean)
    ;Dim curstyle As Long, newstyle As Long

    'retrieve the window style
    curstyle = GetWindowLong(NumberText.hwnd, GWL_STYLE)

    If Flag Then
       curstyle = curstyle Or ES_NUMBER
    Else
       curstyle = curstyle And (Not ES_NUMBER)
    End If

    'Set the new style
    newstyle = SetWindowLong(NumberText.hwnd, GWL_STYLE, curstyle)
    'refresh
    NumberText.Refresh
End Sub
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net

    SetNumber Text1, True
    Me.Caption = "Now, try typing some letters into the textbox"
End Sub

Ответить

Номер ответа: 5
Автор ответа:
 Annie



Вопросов: 19
Ответов: 40
 Профиль | | #5 Добавлено: 30.11.07 20:49
yxaxa, я вроде все по инструкции делаю, но у меня такой контрол получается в точности как текст бокс.
проясните мне плиз,может библиотеки какие-то подключить нужно?
 а еще сборки VB просит сделать.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам