2010-05-28 21 views
20

Actualmente determino en qué página de un tabcontrol se hizo clic mediante el evento SelectedIndexChanged.¿Cómo puedo detectar un cambio de página de pestaña en TabControl antes del evento SelectedIndexChanged?

Me gustaría detectar antes de el índice seleccionado realmente cambia, para fines de validación. Por ejemplo, un usuario hace clic en una página de pestaña que no sea la que está viendo. Se presenta un diálogo si los datos del formulario no se guardan y le pregunta si está bien para continuar. Si el usuario hace clic en no, el usuario debe permanecer en la pestaña actual.

Actualmente tengo que recordar la página de pestañas anterior y volver a ella después de una respuesta de 'no'.

Consideré MouseDown (y la lógica de cálculo surtida), pero dudo que sea la mejor manera.

Respuesta

28

Agregar un evento a la tabcontrol cuando Form_Load:

tabControl1.Selecting += new TabControlCancelEventHandler(tabControl1_Selecting); 

void tabControl1_Selecting(object sender, TabControlCancelEventArgs e) 
{ 
    TabPage current = (sender as TabControl).SelectedTab; 

    // Validate the current page. To cancel the select, use: 
    e.Cancel = true; 
} 
+0

Precisamente el evento que estaba buscando (y que aparentemente no veo). Gracias. – JYelton

+4

La TabPage "actual" que tiene aquí no es la que desea validar (es la nueva). El TabPage anterior debe ser administrado, p. en el evento seleccionado. – Gerard

+0

De hecho, tuve que hacer esto yo mismo y también descubrí que debe usar la validación de pestañas según la respuesta de Chris Schmich. Ni los eventos Seleccionado, Selección (ni los eventos TabIndexChanged o SelectedIndexChanged) hacen referencia a la pestaña actual. – mattpm

6

El TabControl tiene una colección de TabPages, cada uno de los cuales se puede hacer cumplir la validación de, por ejemplo:

public partial class MyForm : Form 
{ 
    public MyForm() 
    { 
     InitializeComponent(); 

     foreach (var page in _tabControl.TabPages.Cast<TabPage>()) 
     { 
      page.CausesValidation = true; 
      page.Validating += new CancelEventHandler(OnTabPageValidating); 
     } 
    } 

    void OnTabPageValidating(object sender, CancelEventArgs e) 
    { 
     TabPage page = sender as TabPage; 
     if (page == null) 
      return; 

     if (/* some validation fails */) 
      e.Cancel = true; 
    } 
} 
+1

He usado eventos de validación antes y los he considerado nuevamente, pero a los efectos de esta aplicación, es más de lo que necesito. Gracias sin embargo. – JYelton

3

tengo de hecho, probé todos los eventos, incluidas las sugerencias aquí, y ninguno de los eventos mencionados ocurre en el momento adecuado para atrapar realmente el movimiento de la pestaña.

Incluso el evento de validación de la página de pestañas se dispara cuando se ingresa a la pestaña en lugar de salir de ella, o hay algo extraño en mi máquina o .NET 4. Por otro lado, en .NET 4 está el evento de anulación de selección que se dispara en el momento adecuado para mis propósitos.

private void tab_Deselecting(object sender, TabControlCancelEventArgs e) 
    { 

    } 
Cuestiones relacionadas