PDA

View Full Version : سوال: از کار انداختن بلافاصله رویداد keydown در سی شارپ



barman.ar16
شنبه 15 مهر 1396, 11:45 صبح
سلام به اساتید
قبلش این مسئله رو عنوان کنم که کلی راجع به این مطلب و سوالی که میخوام خدمتتون عرض کنم سرچ کردم و کلی راه رو امتحان کردم نشد که نشد

قضیه اینه که من یه برنامه جهت صدور گواهی کسر از حقوق نوشتم برای یک کیوسک و مهمترین مسئله اش اینه که این کیوسک مانیتورش تاچ نیست برنابراین اومدم برای استفاده بهتر از این کیوسک برای عموم دکمه ی F1 رو رنگ سبز کردم و دکمه F12 رو قرمز که سبز برای ادامه و قرمز برای برگشت به عقب هست و البته ماوس هم نگذاشتیم به دلایلی .... خب همه چیز خوب پیش میره و مشکلی نیست و اطلاعات بصورت صفحه به صفحه از کاربر پرسیده میشه و تا انتها که همه اطلاعات گرفته شده در صفحات در صفحه آخر نمایش داده میشه و در نهایت میپرسیم اطلاعات رو تایید می کنید در صورت تایید دکمه سبز که همون F1 هست رو بزن تا بره برای چاپ

خب فکر کنم نیازی نباشه این رو یادآوری کنم که در هر صفحه بوسیله رویداد keydown خود فرم برای دو تا دکمه ای که گفتم کدهام رو نوشتم

مشکل من دقیقا اینه که توی صفحه آخر که کاربر F1 رو میزنه و چاپ میگیره یا حالا به دلیل کم حوصله بودن و یا به دلیل ناشی بودن یا زرنگی و هر چیز دیگه ای این دکمه را چندین بار میزنه و از اونجایی که صفحه چاپ رو من بصورت دایرکت پرینت گذاشتم به تعداد دفعاتی که کاربر دکمه رو میزنه چاپ گرفته میشه

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

danialafshari
شنبه 15 مهر 1396, 12:37 عصر
با سلام
از sleep استفاده کنید ببینید مشکلتون حل میشه؟
بلا فاصله بعد از دستور پرینت کد زیر رو قرار بدید

System.Threading.Thread.Sleep(5000);

5000 معادل 5 ثانیه است
موفق باشید

ژیار رحیمی
شنبه 15 مهر 1396, 12:46 عصر
سلام
این سوال قبلا هم به شیوه دیگه ای مطرح شده . شما یک تابع Print داری در هر صورت باید یکبار اجرا شود (اولین باری که کلید F1 زده شد) بکمک یک فیلد ار نوع بولین وضعیت را کنترل کنید

bool PrintEnable=true;


private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode==Keys.F1 && PrintEnable)
{
PrintEnable=false;
Print();
}
}

میتونی Ctrl+F1 رو هم کنار F1 داشته باشی درصورتیکه با F1 رو زد چاپ خروجی ناقص بود یا به هر دلیلی نیاز به چاپ مجدد بود از این کلید ترکیبی استفاده کند

danialafshari
شنبه 15 مهر 1396, 13:08 عصر
با سلام
روش های مختلفی وجود داره

روش 2 :

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
CheckForIllegalCrossThreadCalls = false;
Task t = Task.Run(() =>
{
for (int i = 0; i <= 20; i++)
{
Thread.Sleep(1000);
this.Text = i.ToString();
}
});
t.Wait();
}
}

می تونید از BackgroundWorker و ... هم استفاده کنید
موفق باشید