با سلام.
من می خواهم یک شرطی بگذارم که کاربران در فیلد های نام و نام خانوادگی و نام پدر و سریال شناسنامه و ... که فقط مجاز به وارد کردن حروف می باشند را بنویسم.
اما می خواهم به جای ایکه یک کد را چندین بار تکرار کنم، یک چیزی شبیه به تابع باشه که قفط فراخوانی بشه و از اون شرط پیروی کنه.
حال سوال من :
1. این شرط که تنها حروف را وارد کند را بلد نیستم.
2. چگونه می توانم یک شرط را یکبار نوشته و چندین جا فراخوانی کنم.
با سپاس
در ویژوال استدیو منوی Project گزینه ...Add Class رو انتخاب کنید و یک کلاس جدید با نام Filter (فایل Filter.cs) بسازید.
بجز نام namespace پروژه تان بقیه موارد مطابق کد زیر ویرایش خواهند شد :
کد:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
[COLOR="#FF0000"][B]namespace نام_پروژه_شما[/B][/COLOR]
{
public class Filter
{
public delegate bool IsValid(ref char keyChar);
public enum FilterMode
{
None, Letter, English, Persian, UpperCase, LowerCase, Integer, Float
}
public static bool IsValidNone(ref char keyChar)
{
return true;
}
public static bool IsValidLetter(ref char keyChar)
{
return (char.IsLetter(keyChar) || (keyChar == ' '));
}
public static bool IsValidEnglish(ref char keyChar)
{
return (((keyChar >= 'a') && (keyChar <= 'z'))
|| ((keyChar >= 'A') && (keyChar <= 'Z'))
|| (keyChar == ' '));
}
public static bool IsValidPersian(ref char keyChar)
{
return (((keyChar >= 0x621) && (keyChar <= 0x64A))
|| ((keyChar >= 0x671) && (keyChar <= 0x6D5))
|| (keyChar == ' '));
}
public static bool IsValidUpperCase(ref char keyChar)
{
if ((keyChar >= 'a') && (keyChar <= 'z'))
{
keyChar = char.ToUpper(keyChar);
return true;
}
return ((keyChar >= 'A') && (keyChar <= 'Z'))
|| (keyChar == ' ');
}
public static bool IsValidLowerCase(ref char keyChar)
{
if ((keyChar >= 'A') && (keyChar <= 'Z'))
{
keyChar = char.ToLower(keyChar);
return true;
}
return ((keyChar >= 'a') && (keyChar <= 'z'))
|| (keyChar == ' ');
}
public static bool IsValidInteger(ref char keyChar)
{
return char.IsDigit(keyChar);
}
public static bool IsValidFloat(ref char keyChar)
{
return (char.IsDigit(keyChar) || (keyChar == '.'));
}
public static void Activate(FilterMode mode, params TextBox[] items)
{
foreach (TextBox txt in items)
{
switch (mode)
{
case FilterMode.None:
txt.Tag = new IsValid(IsValidNone);
break;
case FilterMode.Letter:
txt.Tag = new IsValid(IsValidLetter);
break;
case FilterMode.English:
txt.Tag = new IsValid(IsValidEnglish);
break;
case FilterMode.Persian:
txt.Tag = new IsValid(IsValidPersian);
break;
case FilterMode.UpperCase:
txt.Tag = new IsValid(IsValidUpperCase);
break;
case FilterMode.LowerCase:
txt.Tag = new IsValid(IsValidLowerCase);
break;
case FilterMode.Integer:
txt.Tag = new IsValid(IsValidInteger);
break;
case FilterMode.Float:
txt.Tag = new IsValid(IsValidFloat);
break;
}
txt.KeyPress += new KeyPressEventHandler(txt_KeyPress);
txt.TextChanged += new EventHandler(txt_TextChanged);
}
}
static void txt_TextChanged(object sender, EventArgs e)
{
TextBox txt = (TextBox)sender;
IsValid isValid = (IsValid)txt.Tag;
string prevText = txt.Text;
StringBuilder newText = new StringBuilder();
bool changed = false;
foreach (char ch in prevText)
{
char keyChar = ch;
if (isValid(ref keyChar))
{
newText.Append(keyChar);
}
else
{
changed = true;
}
}
if (changed)
{
int selectionStart = txt.SelectionStart;
txt.Text = newText.ToString();
txt.SelectionStart = selectionStart;
}
}
static void txt_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox txt = (TextBox)sender;
IsValid isValid = (IsValid)txt.Tag;
if (char.IsControl(e.KeyChar) == false)
{
char keyChar = e.KeyChar;
if (isValid(ref keyChar))
{
e.KeyChar = keyChar;
}
else
{
e.Handled = true;
}
}
}
}
}
حالا در هر فرمی که خواستید در رخداد Load فرم اون TextBox هایی که قرار است متن شان فیلتر شود را مشخص می کنید.
فرضا textBox1 فقط اعداد صحیح (بدون اعشار) و textBox2 فقط نام فارسی (حروف فارسی و کاراکتر فاصله) را قبول کند :
کد:
private void Form1_Load(object sender, EventArgs e)
{
Filter.Activate(Filter.FilterMode.Integer, textBox1);
Filter.Activate(Filter.FilterMode.Persian, textBox2);
}
پارامتر اول نوع فیلتر است که باید یکی از انواع فیلتر ها باشد و پارامتر دوم (و پارامتر های بعد از آن) نام کنترل های TextBox مورد نظر است.
یعنی لازم نیست برای textBox هایی که فیلتر یکسانی بکار می برند چندین سطر جداگانه بنویسید، فرضا textBox1 و textBox2 و textBox3 و textBox4 فقط حروف بزرگ
انگلیسی را قبول کنند، اگر حروف کوچک تایپ کنید بزرگ می شوند :
کد:
Filter.Activate(Filter.FilterMode.UpperCase, textBox1, textBox2, textBox3, textBox4);
اسامی فیلتر ها اینها هستند :
None هیچگونه فیلتر خاصی انجام نمی دهد، با TextBox عادی فرقی ندارد.
Letter حروف همه زبان ها را به همراه کاراکتر فاصله قبول می کند، بجز حروف سایر کاراکتر ها مثل رقم ها و * و ؟ را قبول نمی کند.
English فقط حروف انگلیسی و کاراکتر فاصله را قبول می کند.
Persian فقط حروف فارسی / عربی و کاراکتر فاصله را قبول می کند.
UpperCase فقط حروف بزرگ انگلیسی و کاراکتر فاصله را قبول می کند و حروف کوچک انگلیسی را بزرگ تایپ می کند.
LowerCase فقط حروف کوچک انگلیسی و کاراکتر فاصله را قبول می کند و حروف بزرگ انگلیسی را کوچک تایپ می کند.
Integer فقط رقم ها را قبول می کند، برای وارد کردن اعداد صحیح بدون اعشار مناسب است.
Float رقم ها و کاراکتر . (نقطه) را قبول می کند، برای وارد کردن اعداد اعشاری مناسب است.