2009-01-19 20 views
6

He cambiado Treeview.HideSelection = false; Pero, ¿cómo puedo asegurar que cuando se pierda el foco el objeto seleccionado siga siendo el original seleccionado?C# cómo me aseguro de que el nodo seleccionado permanezca resaltado cuando se perdió el foco

EDIT:

tengo una vista de lista en un formulario que contiene una lista de eventos del proceso. Junto con Treeview en la misma forma hay una serie de selecciones que el usuario completa para clasificar el evento en la vista de lista. Sin embargo, cuando el usuario realiza una selección en uno de los controles de clasificación, el elemento de vista en árbol seleccionado resaltado en azul cambia a un color gris. Esperaba encontrar la propiedad que define este color para que sea del mismo color azul.

Cualquier sugerencia.

Actualización:

public partial class myTreeView : TreeView 
{ 
    TreeNode tn = null; 
    public myTreeView() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnAfterSelect(TreeViewEventArgs e) 
    { 
     if (tn != null) 
     { 
      tn.BackColor = this.BackColor; 
      tn.ForeColor = this.ForeColor; 
     } 
     tn = e.Node; 
     base.OnAfterSelect(e); 
    } 
    protected override void OnBeforeSelect(TreeViewCancelEventArgs e) 
    { 

     e.Node.BackColor = Color.Green; 
     e.Node.ForeColor = Color.White; 
     base.OnBeforeSelect(e); 
    } 
    protected override void OnGotFocus(System.EventArgs e) 
    { 

     base.OnGotFocus(e); 
    } 

    protected override void OnLostFocus(System.EventArgs e) 
    { 

     if (tn != null) 
     { 
      tn.BackColor = Color.Green; 
      tn.ForeColor = Color.White; 
     } 
     // tn.BackColor = Color.Red; 

     base.OnLostFocus(e); 
    } 
} 
+0

¿Estás hablando de enfoque a toda la aplicación o solo a ese campo específico? Además, ¿debería permanecer seleccionado el elemento o debería eliminarse? –

+0

Sospecho que estás tratando de resolver algún otro problema, y ​​jugar con el color de selección es tu idea de cómo resolverlo. Creo que es una mala idea. Pregunte sobre su problema original en su lugar. Seguramente hay una mejor solución. –

Respuesta

11

El ajuste ListView.HideSelection en verdadero significa que cuando se pierde el foco, ocultará la selección. Al establecer HideSelection en falso, el elemento seleccionado seguirá teniendo el indicador de color que muestra qué elemento está seleccionado.

+0

gracias, error de ortografía de mi parte – Brad

1

En general, no lo hace. El cambio de color es una de las señales visuales que indican qué control tiene el foco. No confunda a sus clientes al deshacerse de eso.

Si desea cambiar las reglas de la convención, puede hacer que su control sea dibujado por el propietario, y luego puede pintar los elementos del color que desee.

Otra opción, en su caso, es utilizar un cuadro combinado desplegable en lugar de un cuadro de lista. Entonces, la selección actual siempre es clara, sin importar si el control tiene el foco. O bien, podría considerar usar una grilla, donde cada evento tiene todas sus configuraciones por separado, y luego la "selección" no importa en absoluto.

+0

La convención es hipócrita ... prueba ListBox o DataGridView. Ambos conservan el brillo azul incluso cuando no están enfocados. – Christian

+0

Me da una buena risa con este tipo de respuestas. "No funciona así. Haz la tuya". Al igual que cualquiera haría un control de usuario desde cero simplemente por el color de resaltado de una selección – makoshichi

0

Si lo estuviera haciendo, simplemente tendría una etiqueta adicional junto con ListView, encima de los controles de clasificación seleccionados, que indicaría qué evento de proceso se ha seleccionado. También puede usar dicha etiqueta para agregar detalles adicionales sobre el evento (si corresponde).

De esta forma, se apega a las convenciones de interfaz de usuario estándar y, por lo que es mucho más claro para el usuario cuál es su selección actual.

-2

Me gusta HideSelection = false; respuesta, porque:

  1. Es fácil

  2. tengo una función de búsqueda que gira a través de los nodos y las marcas de los relevantes cambiando su fondo a amarillo, cuando el usuario hace clic en el nodo de un cuadro de texto rellenos con la información relevante adjunta a ese nodo, antes de usar este método, si el usuario hacía clic en el cuadro de texto para desplazarse, deshabilitaría el nodo y dificultaría el seguimiento de qué nodo se seleccionó, de esta manera aún resaltado en un color gris claro que muestra que no está enfocado, opuesto al resalte azul que se usa cuando está enfocado. Pude haber "pintado" el nodo, pero con el fondo amarillo para los resultados de búsqueda habría complicado la vida más de lo necesario.

  3. ¿Mencioné que fue fácil?

0

Utilizo este código; esto funciona para mi.

diseño: Mytreeview.HideSelection = True resaltará manualmente el nodo de perder foco seleccionado.

Private Sub MyTreeview_Leave(sender As Object, e As EventArgs) Handles MyTreeview.Leave 
    MyTreeview.SelectedNode.BackColor = Color.LemonChiffon 
End Sub 

Private Sub MyTreeview_BeforeSelect(sender As Object, e As TreeViewCancelEventArgs) Handles MyTreeview.BeforeSelect 
    If MyTreeview.SelectedNode IsNot Nothing Then 
     MyTreeview.SelectedNode.BackColor = Color.White 
End Sub 
Cuestiones relacionadas