我的表单中有一个tabControl1,其中有三个名为TabPage1、TabPage2和TabPage3的TabPages。
当TabPage 2具有焦点时,我需要引发一个按键事件(用于导航的箭头键)。此事件不应在其他TabPages中引发。
有人知道怎么做吗?
发布于 2010-01-25 05:50:07
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
bool blnProcess = false;
if (keyData == Keys.Left)
{
blnProcess = true;
MessageBox.Show("Key left");
if (myTabControl1.SelectedIndex == 1)
MessageBox.Show("inside");
}
}这段代码似乎可以工作,所以当我选择tabPage2时,当我按下向左箭头键时,一个消息框会告诉我“在里面”。
Probalby不是做正确的事情,但至少现在它是有效的。
发布于 2010-01-25 04:48:16
在选定的事件处理程序上,您可以将发送方强制转换为适当的控件,并检查其名称。如果该事件是从TabPage2生成的,则可以触发key事件。
像这样的东西
private void TabPage_Selected(object sender, EventArgs e)
{
TabPage source = sender as TabPage;
if(source.Name.equals("TabPage2"))
//Do whatever...
}发布于 2010-01-25 05:03:48
您需要从TabControl派生自己的控件,以便能够拦截箭头键并生成事件。向您的项目添加一个新类,并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖放到窗体上。
using System;
using System.Windows.Forms;
class MyTabControl : TabControl {
public event EventHandler<KeyEventArgs> ArrowKeys;
protected void OnArrowKeys(KeyEventArgs e) {
EventHandler<KeyEventArgs> handler = ArrowKeys;
if (handler != null) handler(this, e);
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == Keys.Up || keyData == Keys.Down || keyData == Keys.Left || keyData == Keys.Right) {
var e = new KeyEventArgs(keyData);
OnArrowKeys(e);
if (e.Handled) return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}表单中的示例用法:
private void myTabControl1_ArrowKeys(object sender, KeyEventArgs e) {
if (myTabControl1.SelectedIndex == 1) {
// Do something with e.KeyData
//...
e.Handled = true;
}
}https://stackoverflow.com/questions/2128711
复制相似问题