ورود

View Full Version : textbox که تنها عدد به عنوان ورودی قبول می کند



mina68
یک شنبه 31 اردیبهشت 1391, 07:53 صبح
سلام
هنگام گشت و گذار تو اینترنت مثالی دیدم از یه Textbox که فقط عدد قبول می کنه
آموزش ساختن این Textbox که نویسنده اش اون رو Digitbox اسم گذاری کرده رو می توننین در آدرس
http://www.rhyous.com/2010/06/18/how-to-limit-or-prevent-characters-in-a-textbox-in-csharp/
ببینید
نظر مثال خیلی کاملی میاد
کد هاش به صورت زیر هست

using System;
using System.Windows.Controls;
using System.Windows.Input;

namespace System.Windows.Controls
{
public class DigitBox : TextBox
{
#region Constructors
/// <summary>
/// The default constructor
/// </summary>
public DigitBox()
{
TextChanged += new TextChangedEventHandler(OnTextChanged);
KeyDown += new KeyEventHandler(OnKeyDown);
}
#endregion

#region Properties
new public String Text
{
get { return base.Text; }
set
{
base.Text = LeaveOnlyNumbers(value);
}
}

#endregion

#region Functions
private bool IsNumberKey(Key inKey)
{
if (inKey < Key.D0 || inKey > Key.D9)
{
if (inKey < Key.NumPad0 || inKey > Key.NumPad9)
{
return false;
}
}
return true;
}

private bool IsActionKey(Key inKey)
{
return inKey == Key.Delete || inKey == Key.Back || inKey == Key.Tab || inKey == Key.Return || Keyboard.Modifiers.HasFlag(ModifierKeys.Alt);
}

private string LeaveOnlyNumbers(String inString)
{
String tmp = inString;
foreach (char c in inString.ToCharArray())
{
if (!IsDigit(c))
{
tmp = tmp.Replace(c.ToString(), "");
}
}
return tmp;
}

public bool IsDigit(char c)
{
return (c >= '0' || c <= '9');
}
#endregion

#region Event Functions
protected void OnKeyDown(object sender, KeyEventArgs e)
{
e.Handled = !IsNumberKey(e.Key) && !IsActionKey(e.Key);
}

protected void OnTextChanged(object sender, TextChangedEventArgs e)
{
base.Text = LeaveOnlyNumbers(Text);
}
#endregion
}
}

و کد Xaml اون


<Window x:Class="TextBoxIntsOnly.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TextBoxIntsOnly"
Title="Window1" Height="300" Width="300">
<Grid>
<local:DigitBox Margin="87,27,71,0" VerticalAlignment="Top" x:Name="textBox1" />
<Label Height="28" HorizontalAlignment="Left" Margin="9,25,0,0" Name="label1" VerticalAlignment="Top" Width="72">Integers:</Label>
<TextBox Height="23" Margin="87,56,71,0" Name="textBox2" VerticalAlignment="Top" />
<Label Height="28" HorizontalAlignment="Left" Margin="9,54,0,0" Name="label2" VerticalAlignment="Top" Width="72">Alphabet:</Label>
</Grid>
</Window>

ولی من به علت تازه کار بودن توی wpf نمی دونم چه طور باید از کلاس DigitBox توی برنامه ام استفاده کنم چون هنگام استفاده تو قسمت clr-namespace: خطا می ده

حالا من از دوستانی که تجربه بیشتری توی wpf دارن می خوام یه برنامه ساده با استفادهClass Digitbox
بالا بسازن تا هم من از اون استفاده کنم هم دیگر دوستان

mina68
یک شنبه 31 اردیبهشت 1391, 08:22 صبح
خودم بالا خره روش استفاده از این کلاس رو فهمیدم
یک برنامه نمونه می ذارم تا بقیه دوستان هم اگر خواستن ازش استفاده کنن

mina68
یک شنبه 31 اردیبهشت 1391, 09:57 صبح
Digitbox بالا 2 تا Bug داره
یکی اینکه اعداد را به صورت اعشاری قبول نمی کنه یعنی . نمی پذیره
دوم اینکه اگر از textbox دیگری حروف کپی کنید و تو این Paste کنید حروف هم قبول می کنه

Bug های فوق رو بر طرف کردم و برنامه جدیدش رو براتون می ذارم.