2010-01-24 3 views
1

У меня есть tabControl1 в моей форме с тремя вкладками с именем TabPage1, TabPage2 и TabPage3.C# как запустить ключевое событие на вкладке tabcontrol?

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

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

+0

Честно говоря, что вы хотите, кажется немного странным для меня с точки зрения дизайна. Может быть, будет лучше, если вы опишете свою настоящую задачу? – nightcoder

+0

Ваш вопрос очень неясен. Когда вы говорите «рейз», вы имеете в виду «ручку»? – SLaks

+0

Жаль, что неясно. Мне нужно что-то сделать, когда TabPage2 имеет фокус. Когда я нажимаю Arrow_Up, например, он изменит некоторые метки в TabPage2. Но это будет только в TabPage2, а не в других вкладках. – Qrew

ответ

1
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 в MessageBox говорит мне «внутри», когда я нажмите левую клавишу со стрелкой.

Probalby не правильная вещь, чтобы сделать вещь, но по крайней мере это работает сейчас ...

+0

Это отлично работает! Мой код для очень сходной цели (для обнаружения ключа ввода) подобен этому (в событии keydown в элементе управления вкладкой: if (tc1.SelectedIndex == 2 && e.KeyValue == 13) GetPersonData(); – Rob

3

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

Что-то вроде этого

private void TabPage_Selected(object sender, EventArgs e) 
{ 
    TabPage source = sender as TabPage; 
    if(source.Name.equals("TabPage2")) 
    //Do whatever... 
} 
+0

private void tabControl1_KeyDown (отправитель объекта, KeyEventArgs e) { MessageBox.Show (клавиша нажата); } Должно ли это дать мне сообщение, когда нажата клавиша и когда этот элемент управления табуляции имеет фокус? Mamoo: ваш код не работает по какой-либо причине – Qrew

+0

Возможно, имя обработчика события и/или имя элемента управления TabPage не совпадают. Во всяком случае, некоторые вещи неясны после этого комментария ... Ожидаемое поведение: Показать сообщение (или сделать что-то еще ...), если нажата клавиша И фокус находится на определенной вкладке? – mamoo

+0

Я думаю, что проблема заключается в том, что страница вкладки не может иметь фокус (на странице не может быть объекта, который может быть выбран, просто кучка меток). Мы должны проверить, выбрана ли правильная вкладка, а затем дозировка при нажатии клавиш. – Qrew

1

Вы должны получить свой собственный элемент управления из 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

Я не могу работать с ней.Он просто переключается между вкладками при нажатии стрелки влево/вправо. – Qrew

+0

Где находится фокус? Это не элемент управления на вкладке? –

+0

На закладке есть только метки. Я думаю, что это проблема. Я хочу перейти к различным вкладкам с помощью клавиш F2 + F3 + F4, а затем, когда Tab Page2 был выбран, мне нужно позаботиться о клавишах со стрелками, потому что разные метки являются цифрами и должны менять цвет, чтобы увидеть, какая метка выбрана, (ничего не выбрано, но только визуально). Этикетки представляют собой кучу чисел, и мне нужно изменить отдельные метки (числа) с помощью кнопки «страница» и «pagedown». – Qrew

0

Я сделал это в 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 

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

Майкл Sarchet

0
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 
     } 
    } 
} 
Смежные вопросы