PDA

View Full Version : سوال: اجرای کد مورد نظر در کلیه ProcessCmdKey



مهدی هادیان2
یک شنبه 28 خرداد 1391, 19:41 عصر
بسم الله الرحمن الرحیم
با سلام
می خوام بدونم چه جوری میشه کد زیر رو در یک کلاس مستقل تعریف کرد و هر جا خواستیم ازش استفاده کنیم.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
switch (keyData)
{
case Keys.Enter:
try
{
if (dataGridView.CurrentCell.ColumnIndex == dataGridView.Columns.Count - 1)
{
dataGridView.Rows.Add();
dataGridView.CurrentCell = dataGridView[0,
dataGridView.CurrentCell.RowIndex + 1];
}
else
dataGridView.CurrentCell = dataGridView[dataGridView.CurrentCell.ColumnIndex + 1,
dataGridView.CurrentCell.RowIndex];
}
catch { } return true;
case Keys.Right:
try
{
dataGridView.CurrentCell = dataGridView[dataGridView.CurrentCell.ColumnIndex - 1,
dataGridView.CurrentCell.RowIndex];
}
catch { } return true;
case Keys.Left:
try
{
dataGridView.CurrentCell = dataGridView[dataGridView.CurrentCell.ColumnIndex + 1,
dataGridView.CurrentCell.RowIndex];
}
catch { } return true;
case Keys.Up:
try
{
dataGridView.CurrentCell = dataGridView[dataGridView.CurrentCell.ColumnIndex,
dataGridView.CurrentCell.RowIndex - 1];
}
catch { } return true;
case Keys.Down:
try
{
dataGridView.CurrentCell = dataGridView[dataGridView.CurrentCell.ColumnIndex,
dataGridView.CurrentCell.RowIndex + 1];
}
catch { } return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
با تشکر

mehdi.mousavi
دوشنبه 29 خرداد 1391, 21:42 عصر
سلام.
شما باید کلاسی (فرضا) به اسم DataGridViewEx باید ایجاد کنید و اونو از DataGridView درایو کنید. سپس در کلاس جدید، ProcessCmdKey رو override کنید و متود مورد نظر رو اونجا پیاده سازی کنید. در نهایت، هر جا نیاز به DataGridView داشتید، باید از DataGridViewEx استفاده کنید (به بیان دیگه باید کلاس جدید رو در فرم استفاده کنید). بدین ترتیب، DataGridView ای دارید که کلید های مورد نظر رو Handle میکنه و ...

public class DataGridViewEx : DataGridView
{
private const int WM_KEYDOWN = 0x100;
private const int WM_SYSKEYDOWN = 0x104;

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
int m = msg.Msg;
if (m == WM_KEYDOWN || m == WM_SYSKEYDOWN)
{
switch (keyData)
{
case Keys.Enter:
try
{
if (CurrentCell.ColumnIndex == Columns.Count - 1)
{
Rows.Add();
CurrentCell = this[0, CurrentCell.RowIndex + 1];
}
else
CurrentCell = this[CurrentCell.ColumnIndex + 1, CurrentCell.RowIndex];
}
catch
{
//DO NOT CATCH THE ENTIRE EXCEPTIONS!!! THIS CAUSES SERIOUS PROBLEMS!
}

return true;
}
}

//Implement this as required...
return base.ProcessCmdKey(ref msg, keyData);
}
}

88424

موفق باشید.

پاورقی: به Comment ای که در catch نوشته ام دقت کنید!

مهدی هادیان2
جمعه 02 تیر 1391, 21:35 عصر
بسم الله الرحمن الرحیم
از پاسخ کاملتون خیلی ممنون
2 تا سوال

هر جا نیاز به DataGridView داشتید، باید از DataGridViewEx استفاده کنید (به بیان دیگه باید کلاس جدید رو در فرم استفاده کنید).
1) لطفا این مورد رو توضیح بدید

به Comment ای که در catch نوشته ام دقت کنید!
چه جوری میتونم در قسمت catch کدی بنویسم که به جای override کردن مثل حالت پیش فرض عمل کند.
با تشکر فراوان

mehdi.mousavi
شنبه 03 تیر 1391, 13:01 عصر
از پاسخ کاملتون خیلی ممنون 2 تا سوال 1) لطفا این مورد رو توضیح بدید چه جوری میتونم در قسمت catch کدی بنویسم که به جای override کردن مثل حالت پیش فرض عمل کند. با تشکر فراوان

سلام.


شما احتمالا Form Designer رو باز می کنید و DataGridView رو بصورت Drag & Drop روی فرم قرار میدید و ...... اینکار باعث میشه تا Instance ای از DataGridView در کلاس فرم شما ایجاد بشه و ... حالا همین کارو، جای اینکه با DataGridView بکنید، با DataGridViewEx انجام بدید.
کافیه در catch بنویسید throw. اما اگر قرار نیست هنگام catch کردن خطا کاری انجام بدید، پس چرا اصلا باید خطا رو catch کنید؟

موفق باشید.