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

时间:2012-12-17 11:26:27

标签: c# winforms inheritance datagridview event-handling

我在弄清楚如何创建一个扩展了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个月了,我还在学习=)

2 个答案:

答案 0 :(得分:3)

是的,在您继承的课程中只需覆盖OnKeyPress,您应该记得事后再致电base.OnKeyPress

protected override OnKeyPress(KeyPressEventArgs e)
{
   .. all your code

   base.OnKeyPress(e); // to ensure external event handlers are called
}

答案 1 :(得分:1)

您可以通过覆盖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);
}