C # как вызвать ключевое событие на вкладке, специфичной для tabcontrol?

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

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

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


person Qrew    schedule 24.01.2010    source источник
comment
Честно говоря, то, что вы хотите, мне кажется немного странным с точки зрения дизайна. Может, лучше опишете реальную задачу?   -  person nightcoder    schedule 24.01.2010
comment
Ваш вопрос очень непонятный. Когда вы говорите «рейз», вы имеете в виду «ручку»?   -  person SLaks    schedule 24.01.2010
comment
Извините за непонятность. Мне нужно что-то сделать, когда TabPage2 находится в фокусе. Когда я нажимаю, например, Arrow_Up, он изменяет некоторые метки в TabPage2. Но это произойдет только в TabPage2, а не на других вкладках.   -  person Qrew    schedule 24.01.2010


Ответы (5)


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

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

private void TabPage_Selected(object sender, EventArgs e)
{
  TabPage source = sender as TabPage;
  if(source.Name.equals("TabPage2"))
    //Do whatever...
}
person mamoo    schedule 24.01.2010
comment
private void tabControl1_KeyDown (отправитель объекта, KeyEventArgs e) {MessageBox.Show (нажатие клавиши); } Должно ли это давать мне окно сообщений при нажатии клавиши и когда этот элемент управления вкладкой находится в фокусе? Маму: ваш код по какой-то причине не работал - person Qrew; 25.01.2010
comment
Возможно, имя обработчика событий и / или имя элемента управления TabPage не совпадают. В любом случае, после этого комментария все немного неясно ... Ожидаемое поведение: показать сообщение (или сделать что-то еще ...), если нажата клавиша И фокус находится на определенной TabPage? - person mamoo; 25.01.2010
comment
Я думаю, проблема в том, что вкладка Page не может иметь фокус (на странице нет объекта, который можно было бы выбрать, только набор ярлыков). Мы должны проверить, выбрана ли правильная вкладка, а затем что-то делать при нажатии клавиш. - person Qrew; 25.01.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;
  }
}
person Hans Passant    schedule 24.01.2010
comment
Я не могу заставить его работать. Он просто переключается между вкладками при нажатии стрелки влево / вправо. - person Qrew; 25.01.2010
comment
Где фокус? Разве это не на элементе управления на странице вкладки? - person Hans Passant; 25.01.2010
comment
На странице вкладки есть только ярлыки. Думаю, в этом проблема. Я хочу перейти к различным вкладкам с помощью клавиш F2 + F3 + F4, а затем, когда выбрана вкладка Page2, мне нужно позаботиться о клавишах со стрелками, потому что разные метки имеют номер и должны изменить цвет, чтобы увидеть, какая метка выбрана (ничего выбрано, но только визуально). Ярлыки представляют собой набор чисел, и мне нужно изменить отдельные ярлыки (числа) с помощью клавиш pageup и pagedown. - person Qrew; 25.01.2010
comment
Опубликованный код отлично работает, когда страница вкладки содержит только ярлыки. Вы действительно подключили событие ArrowKeys? Просто вставить код не получится. В окне «Свойства» щелкните значок молнии, затем дважды щелкните клавиши со стрелками. - person Hans Passant; 27.01.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, Messagebox сообщает мне «внутри», когда я нажимаю клавишу со стрелкой влево.

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

person Qrew    schedule 24.01.2010
comment
Это прекрасно работает! Мой код для очень похожей цели (для обнаружения клавиши ввода) выглядит следующим образом (в событии нажатия клавиши в элементе управления вкладкой: if (tc1.SelectedIndex == 2 && e.KeyValue == 13) GetPersonData (); - person Rob; 06.11.2012

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

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

Майкл Сарше

person msarchet    schedule 24.01.2010

Версия для C # ответа msarchet:

using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;

public class Form1
{

    // give a variable as a TabPage here so we know which one is selected(in focus)
    private TabPage selectedPage = 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 void TabControl1_KeyDown(System.Object sender, System.Windows.Forms.KeyEventArgs e)
    {
        // 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 (!selectedPage == null)
        {
            // If the tabpage is TabPage2
            if (selectedPage.Name == "TabPage2")
                MessageBox.Show("Key Pressed");
        }
    }

    // This handles the actual chaning of the tab pages
    private void TabControl1_Selected(System.Object sender, System.Windows.Forms.TabControlEventArgs e)
    {
        selectedPage = TabControl1.SelectedTab;
    }
}

Я надеюсь, это поможет вам :)

person Momoro    schedule 16.02.2020