PDA

View Full Version : نمایش اعداد داخل text box



ali_mnkt
پنج شنبه 17 بهمن 1387, 00:35 صبح
با سلام و خسته نباشید

من کدی نیاز دارم که تو رویداد key press یه text box بنویسم و با وارد کردن اعداد داخل text box

اعداد رو سه رقم سه رقم جدا کنه؟

__H2__
پنج شنبه 17 بهمن 1387, 00:50 صبح
سلام
از این کدهای خسته کننده میتوان نوشت ولی پیشنهاد میکنم برای نمایش اعداد از کنترلر مخصوصNumericUpDown استفاده کنید، هم محدوده میگیرد و هم با دکمه Up و Down دارد و هم میتواند سه رقمی جدا کند و...

MohsenPS
پنج شنبه 17 بهمن 1387, 10:14 صبح
سلام

int L = textBox1.TextLength + 1;
if (L%4==0)
{ textBox1.Text += ",";
textBox1.SelectionStart = L;
}

ali_mnkt
پنج شنبه 17 بهمن 1387, 13:25 عصر
سلام
از این کدهای خسته کننده میتوان نوشت ولی پیشنهاد میکنم برای نمایش اعداد از کنترلر مخصوصNumericUpDown استفاده کنید، هم محدوده میگیرد و هم با دکمه Up و Down دارد و هم میتواند سه رقمی جدا کند و...


می شه بیشتر در مورد numeric up down توضیح بدید یا اگه مثالی ازش داری بذاری ممنون

می شم

daneshjoo2
پنج شنبه 17 بهمن 1387, 13:46 عصر
سلام
کد برای انگلیسی و فارسی: (price عددیه که میخوای تو تکس باکس نوشته شه)

case Language.Farsi:
this.Text = Price.ToString(" ريال##,#0");
break;
case Language.English:
this.Text = Price.ToString("##,#0 $");ولی بهتره که توی event مربوط به leave بنویسیش.

__H2__
جمعه 18 بهمن 1387, 02:35 صبح
سلام

می شه بیشتر در مورد numeric up down توضیح بدید یا اگه مثالی ازش داری بذاری ممنون
مثال خاصی نمیخواهد، یک کنترلر ساده در toolbox است، مثل خود TextBox ولی مخصوص وارد کردن عدد است و خصوصیتهای ویژه زیر را به همین منظور دارد:

Minimum
حداقل عدد قابل ورود توسط کاربر.

Maximum
حداکثر عدد قابل ورود توسط کاربر.

ThousandsSeparator
جداکننده های سه رقمی را فعال میکند. (همین مورد که خواسته اید.)

Increment
میزان پله افزایش و کاهش با کلیک دکمه های کوچک Up و Down یا دکمه های نظیر کیبورد.

Hexadecimal
نمایش مبنای 16 را فعال میکند.

DecimalPlaces
مکان نقطه اعشار را مشخص میکند.

Value
مقدار عدد داخل را گرفته یا ست میکند.

مجموع این خواص استفاده از کنترلر NumericUpDown را به عنوان ورودی عددی بسیار مناسب و معقول میکند، ضمن اینکه کاربر با شکلش هم آشنا است و فوراً متوجه میشود این مکان وارد کردن یک عدد است.
در نهایت نیاز به این قبیل کدهای خسته کننده هم ندارید و میتوانید با لذت بیشتری برنامه نویسی کنید!!!

موفق باشید.

mohsen_metn
شنبه 19 بهمن 1387, 09:19 صبح
سلام

int L = textBox1.TextLength + 1;
if (L%4==0)
{ textBox1.Text += ",";
textBox1.SelectionStart = L;
}
سلام دوست عزیر
من کد شما رو تست کردم درست عمل می کنه فقط یه مشکلی داره اونم اینکه بعد از وارد کردن مقادیر دیگه نمی شه اونا رو تغییر داد.برای حل این مشکل چه کار کنیم؟

ali_mnkt
شنبه 19 بهمن 1387, 22:02 عصر
سلام

int L = textBox1.TextLength + 1;
if (L%4==0)
{ textBox1.Text += ",";
textBox1.SelectionStart = L;
}


این کد علاوه بر این که توی حذف درست عمل نمی کنه در جدا کردن اعداد نیز اعداد رو از

چپ 3 رقم 3 رقم جدا می کنه به جای این که از راست جدا کنه.

کسی راه حل دیگه ای نداره ؟

slashslash2009
شنبه 19 بهمن 1387, 22:30 عصر
از numericupdown واسه این کار نمیشه استفاده کرد . اون واسه کارایه دیگه هستش معمولا رقمایه خیلی پایین در ضمن اون چیزی که شما گفتین ThousandsSeparator فقط موقعی اتفاق میفته که فلشای بالا پایینو فشار بدیم کلا زیاد جالب نیست اگر روی همون کد دوستمون بیشتر کار کنیم به نتیجه می رسیم

linux
شنبه 19 بهمن 1387, 23:22 عصر
بهترین راه ، درست کردن کلاس تازه ی هست که از TextBox به ارث گرفته شده باشد.
می توانید این کلاس را بیشتر توسعه بدهید

using System;
using System.Globalization;
using System.Windows.Forms;

namespace OOP_Test
{
public enum TextType { Text = 1, Number };

public class TextBoxEx : TextBox
{
TextType _DataType = TextType.Text;
public TextType DataType
{
get { return _DataType; }
set
{
_DataType = value;
if (_DataType == TextType.Number)
this.Text = "0";
else
this.Text = string.Empty;
}
}

protected override void OnTextChanged(EventArgs e)
{
if (_DataType == TextType.Number)
{
try
{
//NumberFormatInfo nfi = new NumberFormatInfo();
NumberFormatInfo nfi =
System.Threading.Thread.CurrentThread.CurrentCultu re.NumberFormat;
//N stand for Number
this.Text = long.Parse(this.Text, NumberStyles.Number).ToString("N0", nfi);
this.Select(this.Text.Length, 0);
}
catch (Exception)
{
this.Text = "0";
}
}
}

protected override void OnKeyPress(KeyPressEventArgs e)
{
if (_DataType == TextType.Number)
{
if (!(char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar)))
e.Handled = true;
}
}

private void myTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Alt && e.Control)
{
if (e.KeyCode == Keys.L)
MessageBox.Show
(string.Format("تعداد کارکترها={0}", this.Text.Length.ToString()));
}
}
}
}

NewFoxStudent
یک شنبه 20 بهمن 1387, 09:15 صبح
میتونی ار این کد هم استفاده کنی


TextBox1.Text = decimal.Parse(TextBox1.Text).ToString("#,#");
TextBox1.SelectionStart = TextBox1.Text.Lenght;

ali_mnkt
یک شنبه 20 بهمن 1387, 11:52 صبح
بهترین راه ، درست کردن کلاس تازه ی هست که از TextBox به ارث گرفته شده باشد.
می توانید این کلاس را بیشتر توسعه بدهید
[
[/code]


مرسی از جوابتون من رو این کلاسی که نوشتید چند تا سوال دارم( تو oop تازه کارم)

1_ چطور از این کلاس استفاده کنم ؟ یعنی باید dll کنم بعد به پروژم اضافه کنم یا تور دیگه ای
باید استفاده بشه ؟ چون من همین کد رو تو یه پروژه در قسمت تعریف کلاس نوشتم error نداشت ولی نتونستم ازش رو form استفاده کنم.

2_نوع enum رو text type گرفتی آیا این همون نوعی است که قراره این کلاسی که تعریف
کردیم بگیره؟

3_در رابطه با property که تعریف کردی یه توضیحی بده که کی مقدار می گیره ؟


4_و سوال آخر این که توی متد ontextchange یه توضیح کوچیک در مورد نحوه ی کارش
می خوام یعنی کد زیر چطور کار می کنه ؟

this.Text = long.Parse(this.Text, NumberStyles.Number).ToString("N0", nfi)

ممنون می شم کمک کنی

linux
یک شنبه 20 بهمن 1387, 13:01 عصر
مرسی از جوابتون من رو این کلاسی که نوشتید چند تا سوال دارم( تو oop تازه کارم)

1_ چطور از این کلاس استفاده کنم ؟ یعنی باید dll کنم بعد به پروژم اضافه کنم یا تور دیگه ای
باید استفاده بشه ؟ چون من همین کد رو تو یه پروژه در قسمت تعریف کلاس نوشتم error نداشت ولی نتونستم ازش رو form استفاده کنم.

2_نوع enum رو text type گرفتی آیا این همون نوعی است که قراره این کلاسی که تعریف
کردیم بگیره؟

3_در رابطه با property که تعریف کردی یه توضیحی بده که کی مقدار می گیره ؟


4_و سوال آخر این که توی متد ontextchange یه توضیح کوچیک در مورد نحوه ی کارش
می خوام یعنی کد زیر چطور کار می کنه ؟

this.Text = long.Parse(this.Text, NumberStyles.Number).ToString("N0", nfi)
ممنون می شم کمک کنی
1- اگر برنامه را یکبار اجرا کنی در منوی تول باکس ، یک کنترل جدید اضافه خواهد شد که می توانی مانند بقیه کنترل ها روی فرم بندازی و کار کنی.
2- نوع enum را textType نگرفتم ،یک enum با نام textType تعریف کردم. همین.
3- یک پروپرتی از نوع enum که تعریف کردم هست که موقعی که مقداری تایپ میشه با کنترل این متغیر رفتار کلاس را مشخص می کنم.
4- Long.Parse را از روی MSDN می توانی بخوانی.

ali_mnkt
یک شنبه 20 بهمن 1387, 20:07 عصر
من کنترل رو به فرمم اضافه کردم و برنامه رو اجرا کردم اما هیچکدام از متد هایی که در کلاس تعریف

شده اجرا نمی شه یعنی وقتی حروف رو تایپ می کنم قبول می کنه و اگر هم عدد وارد کنم

سه رقم سه رقم جدا نمی کنه !!!!

در ضمن کد متد onchange رو جداگانه توی رویداد یه text box امتحان کردم یه error کوچیک داره

وقتی مثلا عدد 1,500 در text box وارد بشه و مکان نما رو بین 1 و "," قرار بدیم و back space

رو بزنیم error می گیره.

می شه در مورد property که از نوع enum گرفتی یه کم بیشتر توضیح بدی آخه من تا حالا

هرچی property دیدم توسط کد نویسی از طریق " اسم . نام کلاس " پر می شده

اما این property از جایی مقدار نمی گیره پس مقدارش چطوری تامین می شه ؟

linux
یک شنبه 20 بهمن 1387, 20:26 عصر
من کنترل رو به فرمم اضافه کردم و برنامه رو اجرا کردم اما هیچکدام از متد هایی که در کلاس تعریف

شده اجرا نمی شه یعنی وقتی حروف رو تایپ می کنم قبول می کنه و اگر هم عدد وارد کنم

سه رقم سه رقم جدا نمی کنه !!!!

در ضمن کد متد onchange رو جداگانه توی رویداد یه text box امتحان کردم یه error کوچیک داره

وقتی مثلا عدد 1,500 در text box وارد بشه و مکان نما رو بین 1 و "," قرار بدیم و back space

رو بزنیم error می گیره.

می شه در مورد property که از نوع enum گرفتی یه کم بیشتر توضیح بدی آخه من تا حالا

هرچی property دیدم توسط کد نویسی از طریق " اسم . نام کلاس " پر می شده

اما این property از جایی مقدار نمی گیره پس مقدارش چطوری تامین می شه ؟
enum که می دونی چی هست اگر خوب دقت کرده باشی در داخل کلاس تعریف نشده خارج از کلاس در namespace تعریف شده . پروپرتی ،TextType از نوع این enum هست .
توی برنامه فرض کن اسم کنترل شما باشد textBoxEx1
با ست کردن

textBoxEx1.DataType = TextType.Number;
این تکست باکس فقط عدد می گیرد
اگر در منوی پروپرتی دقت می کردی یک پروپرتی جدید به اسم datatype اضافه شده آن را به Number تغییر بده.
دیگه این مثال بود خطا و باگهاش را خودت درست کن.

__H2__
یک شنبه 20 بهمن 1387, 22:31 عصر
سلام
فقط یک توضیح کوتاه ...

از numericupdown واسه این کار نمیشه استفاده کرد . اون واسه کارایه دیگه هستش معمولا رقمایه خیلی پایین در ضمن اون چیزی که شما گفتین ThousandsSeparator فقط موقعی اتفاق میفته که فلشای بالا پایینو فشار بدیم کلا زیاد جالب نیست اگر روی همون کد دوستمون بیشتر کار کنیم به نتیجه می رسیم
- مقدارد Value در کنترلر فوق الذکر از نوع Decimal است که در نوع خود بزرگترین مقدار صحیح در دات نت محصوب میشود، در واقع هیچ مقدار صحیحی در دات نت بیش از محدوده Decimal فراتر نمیرود.

- فرمت داخلی با تنظیم ThousandsSeparator بر اساس از دست دادن فوکس کار میکند، یعنی به محض از دست دادن فوکس/تنظیم Value/کلیک دو دکمه کوچک فرمت انجام خواهد شد.

بهرحال شما به دلایل مختلف ممکن است بخواهید از منطق سفارشی خاص خود استفاده کنید.
موفق باشید.