C #, как вызвать ключевое событие в определенной вкладке tabcontrol? - PullRequest
1 голос
/ 24 января 2010

В моей форме есть tabControl1 с тремя TabPages с именами TabPage1, TabPage2 и TabPage3.

Когда TabPage 2 имеет фокус, мне нужно вызвать ключевое событие (клавиши со стрелками для навигации). Это событие не должно вызываться на других вкладках.

Кто-нибудь знает как?

Ответы [ 5 ]

3 голосов
/ 24 января 2010

В выбранном обработчике событий вы можете привести отправителя к нужному элементу управления и проверить его имя. Если событие генерируется из TabPage2, вы можете запустить ключевое событие.

Примерно так

private void TabPage_Selected(object sender, EventArgs e)
{
  TabPage source = sender as TabPage;
  if(source.Name.equals("TabPage2"))
    //Do whatever...
}
1 голос
/ 25 января 2010
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, окно сообщений сообщает мне «внутри», когда я нажимаю клавишу со стрелкой влево.

Пробалби, не то, что нужно делать, но, по крайней мере, пока это работает ...

1 голос
/ 25 января 2010

Вам необходимо получить собственный элемент управления из 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;
  }
}
0 голосов
/ 03 марта 2014
private void Main_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.C) // I used the C Key
    {
        if (tabControl.SelectedIndex == 0) // control is only in tab 1 (index 0) endabled
        {
            // Your Code
        }
    }
}
0 голосов
/ 25 января 2010

Я сделал это в VB .NET, я могу опубликовать это в C #, если вам это действительно нужно, но это должно показать вам, как обрабатывать перехват события.

Public Class Form1

    'give a variable as a TabPage here so we know which one is selected(in focus)
    Dim selectedPage As TabPage = TabPage1

    'If a key is pressed when the tab control has focus, it checks to see if it is the right tab page
    'and then show a message box(for demonstration)
    Private Sub TabControl1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TabControl1.KeyDown
        'The IF Not is to basically catch any odd happening that might occur if a key stroke gets passed with
        'no selected tab page
        If Not selectedPage Is Nothing Then
            'If the tabpage is TabPage2
            If selectedPage.Name = "TabPage2" Then
                MessageBox.Show("Key Pressed")
            End If
        End If
    End Sub

    'This handles the actual chaning of the tab pages
    Private Sub TabControl1_Selected(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles TabControl1.Selected
        selectedPage = TabControl1.SelectedTab
    End Sub

А теперь вам просто нужно использовать реальные нажатия клавиш.

Майкл Сарчет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...