PDA

View Full Version : آموزش: فعال شدن دکمه های عددی سمت راست در برنامه



Bahar_HS
چهارشنبه 03 شهریور 1389, 19:15 عصر
با سلام
یه برنامه نوشتم که کاربر عدد وارد می کنه و برنامه عدد رو به حروف برمی گردونه،در رویدادkey_Up،برای TextBox ای که قراره عدد ورودی رو بگیره،این کد رو نوشتم که فقط دکمه های عددی رو از کاربر قبول کنه:


if ((e.KeyValue > 47) && (e.KeyValue < 58) || (e.KeyCode == Keys.Back))

ولی برنامه دکمه های عددی سمت راست کیبرد رو قبول نمی کنه،چکار باید کرد که همه ی دکمه های عددی کیبرد رو قبول کنه و فقط دکمه های عددی رو؟:متفکر:

mostafa_shoakry
چهارشنبه 03 شهریور 1389, 21:36 عصر
اینو امتحان کن امید وارم کمکت کنه.


if ((e.KeyCode == Keys.Back) || (e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) || (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))یادت نره در آخر اینم اضافه کن

(e.KeyCode == Keys.Back)موفق باشی.
:قلب:

vandermond
چهارشنبه 03 شهریور 1389, 21:37 عصر
دوست عزيز
يكم. چرا Key_Up معمولا توي رويداد Key_Down مينويسن اين ها رو.
دوم. براي اينكه كد اسكي كليدها رو داشته باشي ميتوني اين كار رو بكني كه نياز به حفظ كردن هم نداره. اين كد پايين رو بزار توي رويداد مورد نظرت و كليدي كه ميخاي رو بزن كه بهت كد اسكي رو نشون بده(البته من از اين روش استفاده ميكنم. احتمالا و حتما MSDN ليست اينها رو داره. من خودم با اين كار راحتم:چشمک:)

MessageBox.Show(e.KeyValue.ToString());
حالا اون كدهايي رو هم كه ميخاي ميشه 96 تا 105 (صفر سمت راست ميشه 96 و نه سمت راست ميشه 105) ديگه بقيه كار رو كه خودت ميدوني.
اگه مشكلي بود بگو ...


ويرايش: پست همزمان.

mostafa_shoakry
چهارشنبه 03 شهریور 1389, 21:50 عصر
دوست عزيز
يكم. چرا Key_Up معمولا توي رويداد Key_Down مينويسن اين ها رو.

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

bool KeyHandle;
private void textBox9_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.Back) || (e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) || (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))
KeyHandle = false;
else
KeyHandle = true;
}
private void textBox9_KeyPress(object sender, KeyPressEventArgs e)
{

if (e.KeyChar == 8)
e.Handled = false;
if (KeyHandle == true)
e.Handled = true;

}
منم با این روش راحتترم.البته می تونی از هر روش(اگه احیانا روش ابتکاری دیگری داری ) ازش استفاده کنی. اینا واسه اینه که ذهنیتت باز باشه. :لبخند:
به جای این

if (e.KeyChar == 8)
e.Handled = false;می تونی از

(e.KeyCode == Keys.Back)نیز استفاده کنی

Bahar_HS
جمعه 05 شهریور 1389, 21:34 عصر
با سلام و باسپاس از راهنمایی هاتون،

در مورد این که چرا کد رو در رویداد key_up نوشتم و نه در رویداد key_down، دلیلش اینه استاد سی شارپم می گفتند که این کدهارو باید در رویداد key_up نوشت ، با توجه به این که کاربر چطور دکمه ی کیبرد رو فشار می ده ممکنه اینdown شدن چندبار اتفاق بیفته ،برای همین در رویداد key_up می نوسیم که یکبار اتفاق می افته و وقتی ازشون پرسیدیم که رویدادkey_dow کجاها کاربرد داره، بازی ها رو مثال زدند که دکمه ای مثلا برای تیراندازی در بازی در نظر گرفته شده که کاربر ممکنه دکمه رو پایین نگه داره و در چنین حالاتی اتفاقا می خوایم که این شدن downچند بار اتفاق بیفته،
(اگه منظور استادمون رو درست رسونده باشم)

این طور که دوستان گفتند:

keyCodeبرای دکمه های سمت چپ: 48_59،برای دکمه های سمت راست:96_105

keyValueبرای دکمه های سمت راست: NumPad0_NumPad9،برای دکمه های سمت چپ:D0_D9

ولی هیچ کدوم جواب ندادن،با این که با استفاده از MessageBox همین کدها برگردونده میشه،

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

بازهم ممنون از راهنمایی هاتون:تشویق:

vandermond
جمعه 05 شهریور 1389, 22:43 عصر
دوست عزيز
من به نظر استاد شما كاملا احترام ميزارم ولي باز هم Key_Down رو مناسب نميدونم چون كاربر وقتي ميزنه ميخاد ببينه كه چي شد. اونطوري بايد حتما كليد رو ول كنه كه بفهمه. در ضمن هر كسي كه يه خرده با كامپيوتر كار كرده باشه ميتونه كه براي نوشتن نبايد كليدي رو نگه داره و اتفاقا شايد وقتي ميخواد بنويسه مثلا 555 با گرفتن لحظه اي بخواد اين كار رو بكنه. در كل البته به نوع برنامه شما خيلي مربوط ميشه و اينكه كاربر كي هستش، ولي من Key_Press , Key_Down رو ترجيح ميدم. (باز هم با احترام به نظر استاد شما و خود شما)
براي اين مدل آره من هم خوب نميتونم باهاش كار كنم(اين كه اعداد NumPad به حروف تبديل ميشن). يه خاصيت نداره كه مستقيم هر چي داره رو بزاره.
ولي اگه شما ميخاي كه كاربر فقط عدد بتونه توي تكست باكس وارد كنه چرا اين كار رو نميكني:
http://barnamenevis.org/forum/showpost.php?p=1048492&postcount=7
البته ميدونم منظورت يه چيز ديگه هستش. ميتوني يه كارهايي هم بكني اگه ديگه نشد، ميتوني عدد جلوي NumPad2 رو مثلا اينجا 2 رو از رشته اون بگيري كه خودم اصلا دوست ندارم ولي اگه مجبور بشي فكر ميكنم راه آخر هستش.
البته حتما اساتيد در اين زمينه نظرات بهتري دارن. من الان نميتونم بيشتر از اين توضيح بدم. بايد برم. بعدا اگه شد روش كار ميكنم و جوابش رو ميدم...

Bahar_HS
شنبه 06 شهریور 1389, 11:48 صبح
با سلام،
ممنون از راهنمایی تون،
کدی رو که گفته بودید در رویدادchange_Text نوشتم ولی باز هم نشد،
چیزی که در TextBox نوشته میشه (وقتی این کد و همین طور کدهایی که دوستان دیگه گفتند)کاراکترهای الفبایی ،
درصورتی که کلیدهای سمت راست کیبرد عددی و کنترلی هستند، چرا این اتفاق می افته؟:متفکر:

NIK
شنبه 06 شهریور 1389, 13:16 عصر
اگه درست متوجه شده باشم، این کد مشکل رو حل میکنه.
فقط در رویداد Key Press باید نوشته بشه.

if ((e.KeyChar != 8) && (e.KeyChar != 13))
e.Handled = !char.IsDigit(e.KeyChar);

Bahar_HS
یک شنبه 07 شهریور 1389, 11:33 صبح
دوباره سلام،
مشکل همچنان باقی است!
دوستان تاکید می کنم که دکمه های عددی سمت راست در TextBox کاراکترهای الفبایی وارد می کنن،


private void txtInput_KeyUp(object sender, KeyEventArgs e)
{
string strCheck = "";
ClassNumbericToText1 numberic = new ClassNumbericToText1();
try
{

//if ((e.KeyValue > 47) && (e.KeyValue < 58) || (e.KeyValue>=96 && e.KeyValue <= 105)||(e.KeyCode == Keys.Back))
if((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9)||(e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))// || (e.KeyCode == Keys.Back))
{

if (e.KeyCode == Keys.Back)
{
strCheck = txtInput.Text.Remove(txtInput.Text.Trim().Length - 1, 1);
if (strCheck != "")
{
txtInput.Text = strCheck;
lblAddComma.Text = numberic.AddComma(txtInput.Text.Trim());
lblLetter.Text = numberic.NumbericToLetters(txtInput.Text.Trim());
}
else
{
txtInput.Text = " ";
lblAddComma.Text = " ";
lblLetter.Text = " ";
}
}
else
{
txtInput.Text += Convert.ToChar(e.KeyValue);
lblAddComma.Text = numberic.AddComma(txtInput.Text.Trim());
lblLetter.Text = numberic.NumbericToLetters(txtInput.Text.Trim());

}
}
else
{
MessageBox.Show("فقط عدد وارد كنيد", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtInput.Text = "";
lblAddComma.Text = "";
lblLetter.Text = "";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}

}
وقتی کلیدی غیر از کلیدهای عددی سمت راست کیبرد و دکمه های غیر عددی سمت چپ
کلیک میشه،قسمت else و پیام "فقط عدد وارد کنید" نمایش داده میشه،ولی وقتی کلیدهای عددی سمت راست کلیک می شن ، چیزی که د رTextBox نوشته میشه کاراکترهای الفبایی و پیام
بخش catch اجرا میشه،برنامه رو با یه TextBox شفارشی شده که قراره فقط عد بگیره تکرار کردم ولی بازهم همون مشکل رو داشت.

باسپاس از راهنماییی هاتون:تشویق:

mostafa_shoakry
یک شنبه 07 شهریور 1389, 14:27 عصر
این یه نمونه کد هست ولی با keyPress و KeyDown هست.انشاالله که کمکت کنه.

Bahar_HS
سه شنبه 09 شهریور 1389, 09:45 صبح
سلام ،
ممنون از نمونه برنامه ای که گذاشتید، خیلی لطف کردید،
با این کد دکمه های عددی سمت راست رو قبول می کنه،
1) ولی حالا نمی دونم قطعه کدی رو که ورودی TextBox رو می گیره ، کجا بذارم؟
البته حالات مختلف رو امتحان کردم ولی نشد، فکر می کنم حالا دیگه لازم نباشه که برنامه چک کنه که Backspace کلیک شده یا نه،ولی نمی دونم گرفتن ورودی از TextBox در کدوم رویداد و کدوم قسمت برنامه باشه؟
2) چرا وقتی کلید کلیک شده در محدوده ی موردنظره Handler = false میشه؟


if ((e.KeyCode == Keys.Back) || (e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) || (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))
Handler = false;
else
Handler = true;


:تشویق:باز هم ممنون از راهنمایی هاتون:تشویق:

Bahar_HS
سه شنبه 09 شهریور 1389, 11:30 صبح
بالاخره درست شد!

:تشویق:باسپاس از همه ی دوستانی که لطف کردند وراهنمایی کردند،:تشویق:

قطعه کدی که خودم نوشته بودم رو در رویداد TextChange _به همراه کمی تغییرات در تنظیمات TextBox _ اضافه کردم وبالاخره درست شد!
کنترل روی دکمه های عددی در رویدادهای key_down و key_press به همراه متغیر بولین.

خیلی خیلی ممنون

خیلی خوشحالم!:لبخندساده: