非实例化对象C#的继承和事件处理



我在弄清楚如何创建一个继承类时遇到了一点困难,该继承类将windows窗体控件扩展为始终具有一个事件处理程序,该事件处理程序将处理该对象的每个实例的按键事件。

我可能解释得不好。本质上,我想在windows窗体中扩展DatagridView类,以便始终为我的扩展DatagridView类的任何实例化对象提供keyPress事件处理程序。

我想知道是否有可能有一个事件处理程序来监听按键并用类似于我下面所写的代码来处理它们:

private void dgvObject_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsLetterOrDigit(e.KeyChar))
{
//start the loop at the currently selected row in the datagridview
for (int i = dgvObject.SelectedRows[0].Index; i < dgvObject.Rows.Count; i++)
{
//will only evaluate to true when the current index has iterated above above the 
//selected rows index number AND the key press event argument matches the first character of the current row
// character of the 
if (i > dgvObject.SelectedRows[0].Index && dgvObject.Rows[i].Cells[1].FormattedValue
.ToString().StartsWith(e.KeyChar.ToString(), true, CultureInfo.InvariantCulture))
{
//selects current iteration as the selected row
dgvObject.Rows[i].Selected = true;
//scrolls datagridview to selected row
dgvObject.FirstDisplayedScrollingRowIndex = dgvObject.SelectedRows[0].Index;
//break out of loop as I want to select the first result that matches
break;
}
}
}
}

上面的代码只是选择下一行,该行以按键事件触发时其事件参数中的任何字符开头。我想知道我是否可以将其作为一个始终存在的继承处理程序。我认为这比在windows窗体中为每个单独的DatagridView对象显式创建数百个处理程序要好。如果我的想法是错误的,请随时纠正我!无论如何,感谢您的意见。

我已经用C#编程了大约5个月了,还在边学习边学习=)

是的,在继承的类中只覆盖OnKeyPress,之后应该记得调用base.OnKeyPress

protected override OnKeyPress(KeyPressEventArgs e)
{
.. all your code
base.OnKeyPress(e); // to ensure external event handlers are called
}

您可以通过重写ProcessCmdKey:来捕获所有按键甚至组合

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{
if (keyData == (Keys.Control | Keys.F)) 
{
//your code here
}
return base.ProcessCmdKey(ref msg, keyData);
}

相关内容

  • 没有找到相关文章

最新更新