PDA

View Full Version : گفتگو: TextBox با قابلیت های عددی



jaza_sa
دوشنبه 08 مهر 1387, 03:43 صبح
با سلام خدمت دوستان

حتما خیلی براتون اتفاق افتاده که بخواید یک TextBox رو بصورت سفارشی دربیارید
و خصوصیاتی از قبیل جدا کردن سه رقم ، سه رقم رو به اون اضافه کنید و ... رو به اون اضافه کنید
در مثالی که ضمیمه شده این خصوصیت به همراه چند ویژگی دیگه به TextBox اضافه شده

ویژگی ها :
Mode : با انتخاب هر یک از گزینه های IntNumber, DecNumber, Text میتونید حالت TextBox رو انتخاب کنید
Text : حالت معمولی یک TextBox
IntNumber : کاربر فقط میتونه عدد وارد کنه و در نتیجه میتونه اعداد صحیح رو تایپ کنه
DecNumber : کاربر علاوه بر عدد میتونه علامت '.' رو هم وارد کنه و در نتیجه میتونه اعداد اعشاری رو تایپ کنه
DigitGroup : این خصوصیت که مقدار اون از نوع bool هست به کاربر این امکان رو میده تا بتونه اعداد رو بصورت سه رقم ، سه رقم (3 رقم 3 رقم) از هم جدا کنه

SimpleText : متن TextBox رو بدون علامت ',' در خودش ذخیره میکنه و برای تبدیل مقدار TextBox به نوع دیگر بهتره از این مقدار استفاده کنید

اگر مشکلاتش رو مطرح کنید تا برطرف کنم ، ممنون میشم ...
با تشکر

* آپدیت شد => پست 7 (http://barnamenevis.org/forum/showpost.php?p=605903&postcount=7) *
* آپدیت شد => پست 23 (http://barnamenevis.org/forum/showpost.php?p=614186&postcount=23) *

h.jaza
دوشنبه 08 مهر 1387, 20:47 عصر
jaza_sa خیلی ممنون ازت به خاطر این برنامه ی کاربردیت ولی یه سوال: فرق Decimal Mode با Without Digit چیه؟

ضمنا این عکسی رو هم که فرستادم یه نگاه بنداز، اگر از یجای دیگه کپی پیست بکنیم، اینجوری میشه. هر چند که این اصلا ربطی به اصول نداره و هیچ کسی هم از این کارا نمی کنه ولی اگر راهی برای حلش داشته باشی (البته به غیر از بستن کپی پیست) خیلی ممنون میشم که بگی.

با تشکر

jaza_sa
دوشنبه 08 مهر 1387, 21:45 عصر
jaza_sa خیلی ممنون ازت به خاطر این برنامه ی کاربردیت ولی یه سوال: فرق Decimal Mode با Without Digit چیه؟

ضمنا این عکسی رو هم که فرستادم یه نگاه بنداز، اگر از یجای دیگه کپی پیست بکنیم، اینجوری میشه. هر چند که این اصلا ربطی به اصول نداره و هیچ کسی هم از این کارا نمی کنه ولی اگر راهی برای حلش داشته باشی (البته به غیر از بستن کپی پیست) خیلی ممنون میشم که بگی.

با تشکر
دوست عزیز خیلی ممنونم
بله ، این مشکلی که مطرح کردید یکی از باگهایی بود که هر چی روش فکر کردم راهی به ذهنم نرسید
کنترل های دیگه ای هم که دوستان درست کرده بودند رو هم چک کردم ، همه ی اونها این مشکل رو داشت

اگر کسی از دوستان راه حلی داره ممنون میشم اگر مطرح کنند

باتشکر

migrant
دوشنبه 08 مهر 1387, 22:44 عصر
دوست عزیز ممنون از این نمونه جالب ولی آیا میشه از این امکانات در برنامه خودمون استفاده کنیم . آخه من یکی از معضلاتم همین وارد کردن عدد در textbox بود . من که در نمونه شما کدی که این کار رو انجام میده ندیدم . میشه بیشتر توضیح بدید . . . .

h.jaza
دوشنبه 08 مهر 1387, 22:59 عصر
دوست عزیز کلاس NumericTextBox رو نگاه بندازید.

jaza_sa
سه شنبه 09 مهر 1387, 00:51 صبح
دوست عزیز ممنون از این نمونه جالب ولی آیا میشه از این امکانات در برنامه خودمون استفاده کنیم . آخه من یکی از معضلاتم همین وارد کردن عدد در textbox بود . من که در نمونه شما کدی که این کار رو انجام میده ندیدم . میشه بیشتر توضیح بدید . . . .
بله
این نمونه شامل یک کلاس با نام NumericTextBox.cs هست که تمام اینکارها رو انجام میده
برای استفاده از اون فقط کافیه این کلاس رو کپی/پیست کنید و نام namespace ش رو تغیر بدید
بعد از ساخت این کلاس در پروژه خودتون ، در Toolbox یک کنترل با نام NumericTextBox در بالاترین گروه بندی اضافه میشه
حالا فقط کافیه مثل بقیه کنترل ها از اون استفاده کنید :چشمک:

اگر نتونستید اینکارو انجام بدید ، بگید تا بصورت یک فایل DLL درش بیارم

باتشکر

jaza_sa
سه شنبه 09 مهر 1387, 13:35 عصر
با سلام خدمت دوستان
کامپوننت رو به صورت DLL در اوردم تا اگر دوستان خواستند ازش استفاده کنند راحت باشند

ولی مشکل کپی/پیست هنوز حل نشده
از دوستان تقاضا دارم تا برای این مشکل راه حلی ارائه بدند

باتشکر

h.jaza
سه شنبه 09 مهر 1387, 16:23 عصر
خوب فکر می کنم درست شد.

با این کد، احتمالا دیگه نباید مشکلی وجود داشته باشه:



private void textBox1_TextChanged(object sender, EventArgs e)
{
for (int i = 0; i < textBox1.Text.Length; i++)
{
if (!char.IsNumber(textBox1.Text[i]))
{
textBox1.Text = textBox1.Text.Remove(i, 1);
}
}
}

البته من اینو وسه ی فقط اعداد نوشتم.

razavi_university
پنج شنبه 11 مهر 1387, 02:22 صبح
دوست عزیز با اجازه شما من خاصیت Currency و CurrencySymbol رو به کنترل اضافه کردم
که مثلا ریال رو به انتهای مقدار اضافه کنه
البته DLL است
کدش بهینه نیست و البته چندتایی باگ داره که وقت نشد درستش کنم مثلا در پاک کردن
سرفرصت و با کمک دوستان درستش می کنیم(فعلا باید برم سفر:افسرده:)

jaza_sa
پنج شنبه 11 مهر 1387, 08:50 صبح
دوست عزیز با اجازه شما من خاصیت Currency و CurrencySymbol رو به کنترل اضافه کردم
که مثلا ریال رو به انتهای مقدار اضافه کنه
البته DLL است
کدش بهینه نیست و البته چندتایی باگ داره که وقت نشد درستش کنم مثلا در پاک کردن
سرفرصت و با کمک دوستان درستش می کنیم(فعلا باید برم سفر:افسرده:)
خواهش میکنم
شما خودت صاحب اختیارید
فقط ایکاش یه Demo میزاشتید که مجبورد نباشیم برای تست اون کلی چربی بسوزونیم :لبخند: ...

ممنونم

razavi_university
پنج شنبه 11 مهر 1387, 11:31 صبح
این هم یک دمو برای قابلیت های اضافه شده البته این به صورت کلاس است (DLL نیست)

http://i34.tinypic.com/103ftoy.jpg

jaza_sa
پنج شنبه 11 مهر 1387, 11:42 صبح
این هم یک دمو برای قابلیت های اضافه شده البته این به صورت کلاس است (DLL نیست)


رضوی جان
این که در حد دکترا باگ داره !!!
وقتی یک کاراکتر رو پاک میکنیم ، همه چیز میریزه به هم

edisoon
سه شنبه 16 مهر 1387, 10:58 صبح
بله
این نمونه شامل یک کلاس با نام NumericTextBox.cs هست که تمام اینکارها رو انجام میده
برای استفاده از اون فقط کافیه این کلاس رو کپی/پیست کنید و نام namespace ش رو تغیر بدید
بعد از ساخت این کلاس در پروژه خودتون ، در Toolbox یک کنترل با نام NumericTextBox در بالاترین گروه بندی اضافه میشه
حالا فقط کافیه مثل بقیه کنترل ها از اون استفاده کنید :چشمک:

اگر نتونستید اینکارو انجام بدید ، بگید تا بصورت یک فایل DLL درش بیارم

باتشکر

دوست عزیز با تشکر
ببخشید که سئوال من اینقدر مبتدی و پیش پا افتاده است، من قصد داشتم از Dll شما در پروژه ای به زبان VB.NET استفاده کنم و این کار رو کردم و هیچ مشکلی نداشتم. ولی بنا به دلایلی قصد داشتم یه مقدار تغییراتی در آن بنا به نیاز خودم بدهم. به همین خاطر تصمیم گرفتم سورس شما رو به VB.Net تبدیل کنم و بصورت کلاس در پروژه ام استفاده کنم و همین کار رو هم کردم ولی چون بسیار مبتدی هستم نتوانستم آنرا در پروژه ام استفاده کنم.
من در پروژه ام یک کلاس جدید ایجاد کردم و سورس تبدیل شده به VB رو در اون کلاس قرار دادم ولی در ToolBox این کنترل در بالاترین گروه بندی Toolbox اضافه نمیشه و نمیتونم از اون در پروژه ام استفاده کنم.
من سورس تبدیل شده رو اینجا میگذارم اگر امکان داره نمونه ای با این سورس در یک پروژه VB.Net بسازید و ببینید مشکل در کجاست. (مطمئنا یه جای کار به خاطر ناشی بودن ایراد داره)
پروژه رو همراه با سورس کلاس تبدیل شده به VB رو ضمیمه کردم. یه نگاهی بندازید ممنون میشم. کارم گیره

jaza_sa
سه شنبه 16 مهر 1387, 11:17 صبح
دوست عزیز با تشکر
ببخشید که سئوال من اینقدر مبتدی و پیش پا افتاده است، من قصد داشتم از Dll شما در پروژه ای به زبان VB.NET استفاده کنم و این کار رو کردم و هیچ مشکلی نداشتم. ولی بنا به دلایلی قصد داشتم یه مقدار تغییراتی در آن بنا به نیاز خودم بدهم. به همین خاطر تصمیم گرفتم سورس شما رو به VB.Net تبدیل کنم و بصورت کلاس در پروژه ام استفاده کنم و همین کار رو هم کردم ولی چون بسیار مبتدی هستم نتوانستم آنرا در پروژه ام استفاده کنم.
من در پروژه ام یک کلاس جدید ایجاد کردم و سورس تبدیل شده به VB رو در اون کلاس قرار دادم ولی در ToolBox این کنترل در بالاترین گروه بندی Toolbox اضافه نمیشه و نمیتونم از اون در پروژه ام استفاده کنم.
من سورس تبدیل شده رو اینجا میگذارم اگر امکان داره نمونه ای با این سورس در یک پروژه VB.Net بسازید و ببینید مشکل در کجاست. (مطمئنا یه جای کار به خاطر ناشی بودن ایراد داره)
پروژه رو همراه با سورس کلاس تبدیل شده به VB رو ضمیمه کردم. یه نگاهی بندازید ممنون میشم. کارم گیره

باید Namespace مربوط به اون رو اصلاح کنید
یعنی در خط پنچم بجای اینکه Namespace MyTextBox باشه ، اونرو به Namespace MyProject تغیر بدید، مشاهده میکنید که این کنترل اضافه میشه
بعلاوه شما میتونید این کلاس رو در فرم هاتون Import کنید ، بدون اینکه Namespace رو بخواید تغیر بدید

ممنون

edisoon
سه شنبه 16 مهر 1387, 11:34 صبح
حرف شما متین، من این کار رو هم قبلا تست کرده بودم ولی طبق فرمایش شما باز هم این کار رو انجام دادم، ولی متاسفانه کنترل مورد نظر در ToolBox اضافه نمیشه، اگر هم این کنترل در ToolBox اضافه نشه نمیتونم اون رو Drag کنم و روی Form قرارش بدم و ازش استفاده کنم. اگه شما توی پروژه ای که ضمیمه کرده بودم این کار رو کردید و مشکلی ندارید همون پروژه ای که تغییر دادید رو برای من ارسال کنید ممنون میشم

jaza_sa
سه شنبه 16 مهر 1387, 11:50 صبح
حرف شما متین، من این کار رو هم قبلا تست کرده بودم ولی طبق فرمایش شما باز هم این کار رو انجام دادم، ولی متاسفانه کنترل مورد نظر در ToolBox اضافه نمیشه، اگر هم این کنترل در ToolBox اضافه نشه نمیتونم اون رو Drag کنم و روی Form قرارش بدم و ازش استفاده کنم. اگه شما توی پروژه ای که ضمیمه کرده بودم این کار رو کردید و مشکلی ندارید همون پروژه ای که تغییر دادید رو برای من ارسال کنید ممنون میشم
من با VS 2008 کار کردم ، احتمالا برای شما نسخه 2005 باشه !!!
فقط کافیه کلاس NumericTextBox رو با Notepd یا هر نرم افزار دیگه ای باز کنید و محتویات اونرو داخل کلاس مربوطه درپروژتون اضافه کنید.
من فایل خود کلاس رو هم گذاشتم ، تا درصورت نیاز این کلاس رو به پروژتون اضافه کنید

موفق باشید :چشمک:

edisoon
سه شنبه 16 مهر 1387, 12:49 عصر
آقا دمت گرم، ولی چرا NameSpace رو برداشتید؟ مشکل من فقط دلیلش وجود NameSpace بود؟ چون توی پروژه خودم هم NameSpace رو که برداشتم به ToolBox اضافه شد و درست شد.
به هر حال با زحمات و کمک شما، کلاس به VB هم تبدیل شد و دوستان VB کار هم میتونن حالشو ببرن.
ولی حالا که اینهمه زحمت میکشید یه توضیح کوچکی بدید که اگر بخوام کاربر رو محدود به وارد کردن مثلا فقط دو رقم اعشار کنم چطوری میتونم اینکار رو در این کلاس انجام بدم و این کار در Propertyهای قابل تنظیم باشه.

یکی دو تا اشکال هم داره که اگر رفع بشه محشر میشه.
1 - مثلا وقتی Maxlength رو 12 تعریف می کنید تعداد ورودی بیشتر از 10 کاراکتر نمیره و این یه اشکال عمده است. (یعنی تعداد کاراکتر قابل ورود غلط از کار درمیاد)
2 - اگر مقدار Textbox برابر با "0" باشد اونرو بصورت ".0" تبدیل میکنه
3 - اگه بشه کاراکتر اعشار بصورت انتخابی "," یا "/" باشه بازم خوبه

razavi_university
دوشنبه 22 مهر 1387, 18:30 عصر
در این نسخه جدید سعی کردم باگی که در حد دکترا بود رو رفع کنم (مشکلش با BackSpace) :چشمک: لطفا تستش کنین و مشکلات جدیدش رو بگید:لبخند:
انشالا سر فرصت اشکالاتی که جناب Edison فرمودند رو هم لحاظ می کنم
سایر دوستان هم اگر فرصت دارند بسم ا...

jaza_sa
دوشنبه 22 مهر 1387, 19:18 عصر
در این نسخه جدید سعی کردم باگی که در حد دکترا بود رو رفع کنم (مشکلش با BackSpace) :چشمک: لطفا تستش کنین و مشکلات جدیدش رو بگید:لبخند:
انشالا سر فرصت اشکالاتی که جناب Edison فرمودند رو هم لحاظ می کنم
سایر دوستان هم اگر فرصت دارند بسم ا...
1 - مشکل Copy/Paste رو هنوز داره
2 - امکان انتخاب متن و پاک کردن اون بصورت یکجا رو نداره
3 - دکمه Del کار نمیکنه

ممنون از همکاریتون :چشمک:

edisoon
دوشنبه 22 مهر 1387, 20:51 عصر
مرسی،
اگر لطف کنی مشکلاتی که من گزارش کردم رو زودتر حل کنی خیلی ممنون میشم. چون من از این کلاس در یک پروژه استفاده کردم و مشکلاتی که ذکر کردم یه مقداری داره اذیت میکنه.
ممنون میشم اگه زودتر حلش کنی. این دوتا مشکلی که Jaza_sa فرمودن هم بهتره حل بشه.
امیدوارم در ورژن بعدی که خیلی زود آماده بشه. تمام این مشکلات رفع شده باشه.

reza365
سه شنبه 23 مهر 1387, 15:26 عصر
من تازه حدود دو ماهه كه برنامه نويسي سي شارپو شروع كردم و چند وقتيه كه دنبال اين كد ميگشتم البته تو دلفي اينو داشتم . در هرصورت بسيار متشكر كه اين كد و در اختيار همه گذاشتيد .مرسي.

bardia goharbin
سه شنبه 23 مهر 1387, 15:42 عصر
دوست عزیز من هم از این کنترل استفاده میکنم و واقعا کنترلی هست که به کار همه میاد. ولی ای کاش این اشکالات جزئیش توسط خود شما که زحمتش رو کشیدید رفع میشد
1000 بار ممنونیم ازشما

jaza_sa
سه شنبه 23 مهر 1387, 20:58 عصر
ویژگی های جدید :

AuditorSymbole : (علامت ممیز) با استفاده از این خصوصیت میتوان کاراکتر مورد نظر برای علامت ممیز را تعیین کرد

FixMaxLength : با False بودن این خصوصیت ، MaxLength برابر با تعداد کاراکترهای عددی و ممیز میشود و علامت جداکننده ( , ) جزء تعداد کاراکتر ها محسوب نمیشود (البته یه اشکال کوچیک تو اعداد اعشاری داره)

*) درج عدد 0 با استفاده از کلید Space

*) درج عدد 0 بعد از کاراکتر ممیز درصورتی که بعد از علامت ممیز هیچ عددی درج نشود

Hco_Company
جمعه 15 خرداد 1388, 01:34 صبح
با سلام خدمت دوستان
با تشكر از زحمات بي دريغ شما دوستان
يه مشكل توي كنترول ديدم گفتم منعكس كنم اونم اينكه وقتي اعدادي رو وارد ميكنيم اگر با كليدهاي جهتدار بين اين اعداد حركت كنيم و عددي رو وارد كنيم كرسر به انتهاي اعداد ميره

HamidNazari
جمعه 15 خرداد 1388, 09:20 صبح
دوست عزیز تبریک میگم به خاطر کنترل خوبی که نوشتین و حس نوعدوستیتون برای به اشتراک گذاشتنش و کم کردن دردی از دردای برنامه نویسا ;) جسارتاً برای حل مشکل Paste این کد رو اضافه کنین و البته توجه داشته باشین فقط دارم ایده رو میدم بهتون و اضافه کردن این کد کلاً امکانات کنترل رو با مشکل روبرو میکنه :

private const int WM_PASTE = 0x0302;
[System.Diagnostics.DebuggerHidden()]
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_PASTE)
isTextPasted = true;

base.WndProc(ref m);
}
و بعد در متد OnTextChanged که قبلا Overrideش کردین اضافه کنین :

if (isTextPasted)
{
string text = String.Empty;

for (int i = 0; i < Text.Length; i++)
if (Char.IsNumber(Text[i]))
text += Text[i];

isTextPasted = false;

Text = text;
}راستی چرا برای ممیز سه رقم سه رقم از این کد استفاده نکردین ؟
مثلاً :

int i = 1234567890;
MessageBox.Show(i.ToString("#,##"));

فاطی.جدا
یک شنبه 10 مرداد 1389, 02:10 صبح
سلام دوستان.من از این کلاس توی برنامم استفاده کردم.اما یه مشکلی داره.وقتی میخوام مبلغ رو به عدد تبدیل کنم و از اون تو محاسبات استفاده کنم ،نمیشه.یعنی ارور نوع داده میده.چه کار کنم؟سریعا به پاسخش نیاز دارم

vandermond
یک شنبه 10 مرداد 1389, 02:29 صبح
سلام دوستان.من از این کلاس توی برنامم استفاده کردم.اما یه مشکلی داره.وقتی میخوام مبلغ رو به عدد تبدیل کنم و از اون تو محاسبات استفاده کنم ،نمیشه.یعنی ارور نوع داده میده.چه کار کنم؟سریعا به پاسخش نیاز دارم
دوست عزيز
راستش دانلود نكردم كنترل رو ولي اگه توي تكست باكس سه رقم سه رقم جداكننده داره (كه احتمالا داره) مشكل از همونه. مثلا به اين روش:

double Num;
string s = textBox.Text;
s.Replace(",", "");
Num = double.Parse(s);
اگه مشكل اين نبود بگيد كه دانلود كنم يا ........

فاطی.جدا
دوشنبه 11 مرداد 1389, 18:41 عصر
دوستان حل نشد.یعنی از replace که استفاده میکنم کاما ها حذف نمیشن

vandermond
دوشنبه 11 مرداد 1389, 20:06 عصر
دوستان حل نشد.یعنی از replace که استفاده میکنم کاما ها حذف نمیشن
دوست عزيز
قرار نيست حذف بشن توي تكست باكس.
توي رشته اي كه من اسمش رو s گذاشتم حذف ميشن و بررسي ميشه. و تكست باكس همونطوري ميمونه.
مشكلي داره؟ خطا ميگيره؟يا ........... اگه اينطوري هست بگيد كه كد رو كاملتر بزارم.

Masoome_das
دوشنبه 11 مرداد 1389, 21:00 عصر
سلام
این هم چند نوع TexBoxساده
عددی که با ورود و خروج کرسر بر روی آن تغییر رنگ میده
ورود کاراکتر غیرمجاز تغییر رنگ میده
...
خودتان امتحان کنید.
البته Combo کار نمی کنه

فاطی.جدا
دوشنبه 11 مرداد 1389, 21:07 عصر
SimpleText : متن TextBox رو بدون علامت ',' در خودش ذخیره میکنه و برای تبدیل مقدار TextBox به نوع دیگر بهتره از این مقدار استفاده کنید

با این که چندبار این تاپیک و مطالبش رو مرور کردم این نکته رو ندیده بودم.این ویژگی مشکل رو حل میکنه.

fullsite1900
سه شنبه 04 تیر 1392, 14:39 عصر
مرسی از کدی که گذاشتی
خیلی کارم راه افتاد

aminafz
چهارشنبه 03 دی 1393, 22:40 عصر
سلام، من تازه دارم سی شارپ کار می کنم،
ببخشید که پرسشم خیلی مبتدیه :خجالت:

اساتید محترم بقرمایید من چطور این امکان تکس باک با قابلیت عددی رو که دوستان زحمت کشیدن و نوشتن رو تو برنامم استفاده کنم؟!

یعنی کلاس نوشته شده یا dll رو جطور به برنامم اضافه کنم؟ آیا باید تو قسمت رفرنس یا اسمبلی برنامه تغییراتی ایجاد کنم؟ :ناراحت:

mansuri-65
دوشنبه 22 تیر 1394, 13:58 عصر
باسلام
برای غیر فعال کردن کپی و paste در تکست باکس از کد زیر در رویداد Enter استفاده کنید:
private void textbox1_Enter(object sender, EventArgs e)
{
Clipboard.Clear();
}


ویا اگه می خواین همه رویدادها رو یکجا باهم داشته باشین :
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == 22))
{
e.Handled = true;
}


}