PDA

View Full Version : textbox



setak
چهارشنبه 22 فروردین 1386, 14:40 عصر
من یک textbox دارم که طول 10 دارد و در کاراکتر 5 ام textbox کاراکتر '/' را تایپ کرده ام .
حالا می خوام زمانی که برنامه اجرا می شود خاصیت readonly تکست باکس false باشد اما کاربر نتواند کاراکتر 5 1م تکست باکس را حذف کند یا تغییر دهد . راه حل این مسئله چیه ؟
با تشکر

miimii
چهارشنبه 22 فروردین 1386, 16:17 عصر
فکر کنم از این طریق بتوانید مشکلتان را حل کنید.
به جای textbox از کنترل maskededitbox استفاده کنید.
این کنترل را باید ااز toolbox اضافه کنید.
پس از اضافه کردن این کنترل در proprties خاصیت maxlenght را با عدد 10 set کنید.
و خاصیت mask را به صورت #####/#### set کنید.
زمانی که برنامه را اجرا می کنید maskededitbox به این صورت نمایش داده می شود:
-----/---- و کاربر نمی تواند کاراکتر / را حذف کند و فقط در قسمتهای خالی می تواند چیزی وارد نماید.

موفق باشید

setak
شنبه 25 فروردین 1386, 09:14 صبح
ممنون
حالا من اگه بخوام range برای اعدادم در maskededitbox تعریف کنم فکر می کنی باید یک کنترل خودم بنویسم ؟

miimii
شنبه 25 فروردین 1386, 09:28 صبح
منظورتان از range برای اعداد چیه؟ واضح تر توضیح دهید.یعنی فقط یک سری از ارقام خاص را وارد کنید؟

setak
شنبه 25 فروردین 1386, 11:12 صبح
بله
مثلا من خاصیت mask را به صورت زیر مقدار دهی کردم : ####/##/## حالا می خوام 4 عدد سمت چپ مثلا range داشته باشد : از 1360 تا 1400

miimii
شنبه 25 فروردین 1386, 11:59 صبح
برای محدود کردن range اعداد وارد شده باید خودتان دستی کنترل کنید.مثلا می توانید در event leave کنترل maskededitbox این کنترل را انجام دهید و برای این کار هم می توانید از تابع mid استفاده کنید.

اولین پارامتر این تابع رشته موردنظرتان و دومی نقطه شروع و سومی طول مورد نظر از آن رشته است.
کد را در قسمت ذیل می توانید مشاهده کنید.

Private Sub MaskedEditBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MaskedEditBox1.Leave

If Mid(MaskedEditBox1.Text, 1, 4) > 1400 Or Mid(MaskedEditBox1.Text, 1, 4) <1360 Then
("msgbox("error
End If

End Sub
در صورت وجود سوال و یا ابهامی اطلاع دهید.

موفق باشید

setak
شنبه 25 فروردین 1386, 12:09 عصر
خوب من می خوام maskededitbox رو customized کنم و در واقع یک usercontrol ایجاد کنم که مثلا دارای خاصیت range باشه

Keramatifar
شنبه 25 فروردین 1386, 12:18 عصر
دوست عزیز توی دات نت برای تعیین کردن Range یک کامپوننت در قسمت Validation به نام Range Validator وجود داره، شما این کامپوننت رو بذار توی فرمت بعد توی Propertyهاش در قسمت ControlToValidate کنترلی که می خوای محدود باشه رو مشخص کن و در قسمت MaxValue و MinValue حداکثر و حداقل عددی رو که می خوای بشه وارد کرد رو وارد کن، در قسمت ErrorMessage متنی که می خوای موقع خطا نمایش داده بشه رو تعیین کن
توی Propertyهای خود کنترل هم قسمت CauseValidation رو True کن و اگر می خوای Validation به چند کنترل همزمان اعمال بشه در قسمت ValidationGroup کنترلها و Validator یک عدد واحد مثلا 1 رو وارد کن.
در ضمن بد نیست که تابعی که میخوای عملیات رو انجام بده رو توی یک IF با شرط IF (IsValidate) قرار بده

Alireza_Salehi
شنبه 25 فروردین 1386, 12:59 عصر
دوست عزیز توی دات نت برای تعیین کردن Range یک کامپوننت در قسمت Validation به نام Range Validator وجود داره، شما این کامپوننت رو بذار توی فرمت بعد توی Propertyهاش در قسمت ControlToValidate کنترلی که می خوای محدود باشه رو مشخص کن و در قسمت MaxValue و MinValue حداکثر و حداقل عددی رو که می خوای بشه وارد کرد رو وارد کن، در قسمت ErrorMessage متنی که می خوای موقع خطا نمایش داده بشه رو تعیین کن
توی Propertyهای خود کنترل هم قسمت CauseValidation رو True کن و اگر می خوای Validation به چند کنترل همزمان اعمال بشه در قسمت ValidationGroup کنترلها و Validator یک عدد واحد مثلا 1 رو وارد کن.
در ضمن بد نیست که تابعی که میخوای عملیات رو انجام بده رو توی یک IF با شرط IF (IsValidate) قرار بده
اینجا بحث winform هستش نه webform !

در winform باید خاصیت CauseValidation کنترل مورد نظر رو true کنید بعد هرموقع خواستید Validate بشه متد Me.Validate رو فراخوانی کنید ، و در رویداد Validating هر کنترل شرایط مورد نظر رو چک کنید ،
برای نشون دادن آیکون اخطار کنار کنترل مورد نظر هم از این لینکhttp://msdn2.microsoft.com/en-us/library/f6xht7x2.aspx کمک بگیرید.

البته اگر کنترلی به منبع داده متصل باشه اتوماتیک (بعد از فراخوانی متد Me.Validate) مقدار وارد شده با نوع داده منبع بررسی میشه .

البته کامپوننت ها اماده برای validation در winforms هم وجود داره.

setak
شنبه 25 فروردین 1386, 14:28 عصر
مرسی
اما آیا من می تونم این عملیات رو به یک کنترل تبدیل کنم ؟ مثلا به maskededitbox یک property اضافه کنم که عملیات validating رو set میکنه؟

Alireza_Salehi
شنبه 25 فروردین 1386, 19:18 عصر
بله...
کافیه یک کلاس جدید که از maskededitbox ارث ببره یا یک یوزر کنترل جدید که maskededitbox رو توسعه بده بعد قابلیت های ویژه مورد نظرتون رو در اون تعریف کنید و در هر پروژه ای خواستید از این کنترل جدید استفاده کنید.

http://www.codeproject.com/vb/net/validtext3.asp

این هم یک مثال ساده :


Public Class myMaskedEditBox
Inherits MaskedTextBox
Dim mValidate As Boolean
Dim mEP As ErrorProvider
Public Sub New()
mValidate = False
mEP = New ErrorProvider()
End Sub
Protected Overrides Sub OnValidating(ByVal e As System.ComponentModel.CancelEventArgs)
If mValidate Then
If Not IsNumeric(Me.Text) Then
mEP.SetError(Me, "Not a numeric value.")
Else
mEP.SetError(Me, "")
End If
Else
MyBase.OnValidating(e)
End If
End Sub
PublicProperty Validate() As Boolean
Get
Return mValidate
End Get
Set(ByVal value As Boolean)
mValidate = value
End Set
End Property


این روش رو برای هر کنترلی می تونید به کار ببرید ولی کنترل maskededitbox خاصیتی به نام ValidatingType داره که برای کنترل مقدار ها بکار میره- مثلا میتونید یک Type جدید تعریف کنید که محدوده عددیش مشخص باشه و... این مثال MSDN رو ببینید :