PDA

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



behzadkhan
سه شنبه 13 مرداد 1394, 20:24 عصر
با سلام

به همه کاربران

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

اما زمانی که کنترل غیر فعال می شود دیگر رویداد کلیک را تشخیص نمی دهد.

البته منظور من از کنترل DataTimePicker هست.

لطفا روی این کنترل تست خود را انجام دهید.

من از کد زیر هم استفاده کردم:


protected override void OnClick(EventArgs e)
{
// Call the base class
base.OnClick(e);


Point locationTime = dtpProgramRealStartTime.PointToScreen(Point.Empty) ;
Rectangle rectTime = new Rectangle(locationTime, dtpProgramRealStartTime.Size);

if(rectTime.Contains(Cursor.Position))
{
MessageBox.Show("clicked");
}
}


اما به جایی نرسیدم.

جالب که کد بالا برای یک کنترل دیگه کار می کنه اما برای DataTimePicker کار نمی کنه.

با تشکر

مهرداد صفا
سه شنبه 13 مرداد 1394, 23:23 عصر
سلام.
چرا کنترل مورد نظرتون رو غیر فعال کردید؟
شاید راه بهتری هم باشه.

behzadkhan
چهارشنبه 14 مرداد 1394, 00:22 صبح
سلام.
چرا کنترل مورد نظرتون رو غیر فعال کردید؟
شاید راه بهتری هم باشه.

با سلام

دوست عزیز

من هنگام ویرایش یک رکورد مجبورم که کنترل DataTimePicker را که فقط زمان را نشان می دهد غیر فعال کنم تا کاربر نتواند مقدار آن را تغییر دهد.

حالا کاربر برای اینکه متوجه بشود چرا آن مورد غیر فعال شده سعی می کند تا روی آن کلیک کنید

بنابراین

درست موقع کلیک روی آن کنترل یک پیغام باز شود و علتش را به کاربر نشان دهد.

البته به قول شما راه دیگری هم دارد.

مثلا در همان فرم فقط موقع ویرایش یک متنی نشان داده شود که علت عدم ویرایش DataTimePicker را نشان دهد.

البته من یک کنترل تقویم دارم که برای نشان دادن تاریخ هست

و روی آن کنترل زمانی که غیر فعال هست رویداد کلیک را با استفاده از همان کدی که در پست اول گذاشتم تشخیص می دهد.

حالا

برای من سوال هست که چرا برای کنترل DataTimePicker جواب نمی دهد؟

با تشکر

behzadkhan
چهارشنبه 14 مرداد 1394, 10:13 صبح
با سلام

دوستان عزیز

مشکل حل شد.

باید خط زیر را به کد اضافه می کردم:


locationTime.X = dtpProgramRealStartTime.Size.Width;


علت این کار به این دلیل هست که وقتی خاصیت RightToLeftLayout را برابر با True شود. Location کنترل هم از سمت چپ به راست منتقل می شود.(واقعا جالب بود)

بنابراین

اگر به همچین مشکلی برخورد کردید. حتما Location کنترل مورد نظر را بررشی کنید ببینید که برعکس نشده است.

و

کد نهایی:


protected override void OnClick(EventArgs e)
{
// Call the base class
base.OnClick(e);


Point locationTime = dtpProgramRealStartTime.PointToScreen(Point.Empty) ;
locationTime.X = dtpProgramRealStartTime.Size.Width;
Rectangle rectTime = new Rectangle(locationTime, dtpProgramRealStartTime.Size);


if (rectTime.Contains(Cursor.Position))
{
MessageBox.Show("clicked");
}
}


موفق و پیروز باشید.

با تشکر