2010-02-08 17 views
11

tengo un problema en un formulario, donde He añadido columnas a un control .NET ListView, en el siguiente orden:.NET problema orden de las columnas ListView

A | B | C | D 

El índice de visualización para las columnas AD es 0 -3, en ese orden, pero sigue mostrando en el orden equivocado:

A | B | D | C 
      ^-----^ these are switched at runtime 

Nota: Todo se ve como yo quiero que en tiempo de diseño.

Supongo, pero no sé por qué, que es porque agregué la columna C al ListView después de haber agregado la columna D. Lo moví a una muesca en el diálogo del editor de columnas, ajusté los índices de visualización, y verificó el orden de creación en el archivo .Designer.cs, todo está en orden AD, en ese orden.

Sin embargo, el problema persiste.

También tenga en cuenta: Esto no es solo un problema de etiqueta de encabezado, las columnas se intercambian, incluidos sus datos. Los datos se agregan en el orden en que espero que se muestren, pero las dos últimas columnas se intercambian.

¿Qué más debo verificar para averiguar por qué una de mis columnas está en la posición incorrecta?

Descubrí el problema. Por algún motivo, la propiedad DisplayIndex no se conserva, incluso si la configuré en el cuadro de diálogo.

Si cerré por completo el formulario y lo volví a abrir en Visual Studio, cambió. Aparentemente, esas propiedades no son detectadas por el editor de diálogo como "modificadas", y por lo tanto tampoco me importa guardar el mecanismo de guardar.

El código que añade las columnas, fue así:

this.lvResult = new System.Windows.Forms.ListView(); 
this.colResultId = new System.Windows.Forms.ColumnHeader(); 
this.colResultTitle = new System.Windows.Forms.ColumnHeader(); 
this.colResultLanguage = new System.Windows.Forms.ColumnHeader(); 
this.colResultTags = new System.Windows.Forms.ColumnHeader(); 
// 
// lvResult 
// 
this.lvResult.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
      | System.Windows.Forms.AnchorStyles.Left) 
      | System.Windows.Forms.AnchorStyles.Right))); 
this.lvResult.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { 
this.colResultId, 
this.colResultTitle, 
this.colResultLanguage, 
this.colResultTags}); 
this.lvResult.FullRowSelect = true; 
this.lvResult.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; 
this.lvResult.HideSelection = false; 
this.lvResult.Location = new System.Drawing.Point(12, 6); 
this.lvResult.Name = "lvResult"; 
this.lvResult.Size = new System.Drawing.Size(466, 117); 
this.lvResult.TabIndex = 0; 
this.lvResult.UseCompatibleStateImageBehavior = false; 
this.lvResult.View = System.Windows.Forms.View.Details; 
this.lvResult.SelectedIndexChanged += new System.EventHandler(this.lvResult_SelectedIndexChanged); 
// 
// colResultId 
// 
this.colResultId.Text = "#"; 
this.colResultId.Width = 35; 
// 
// colResultTitle 
// 
this.colResultTitle.Text = "Title"; 
this.colResultTitle.Width = 220; 
// 
// colResultTags 
// 
this.colResultTags.DisplayIndex = 2; 
this.colResultTags.Text = "Tags"; 
this.colResultTags.Width = 100; 
// 
// colResultLanguage 
// 
this.colResultLanguage.Text = "Language"; 

Cuando añadí las propiedades que faltan directamente en el archivo, funcionó.

Respuesta

5

¿Es posible que persista algo en .resx del formulario en lugar de .designer? No me puedo imaginar por qué haría eso, pero sí ...

Tal vez si todo lo demás falla, intente eliminar el ListView de su formulario. Luego, crea un nuevo formulario de basura en tu proyecto recreando el ListView en el formulario basura, prueba el formulario basura para asegurarte de que no obtienes el extraño comportamiento del vudú y luego copia el ListView del formulario basura a tu forma real.

terriblemente complicado, lo sé ...

+0

No, el archivo .resx del formulario está completamente vacío, a excepción de los elementos predeterminados. –

+0

Se agregó otra sugerencia ... Agarrando pajitas. :) – Yoopergeek

+0

Lo volveré a agregar más adelante si no puedo resolverlo, pero dado que no es un problema de tope, por ahora, lo guardaré, con la esperanza de que yo (o alguien aquí) pueda ayudarme a resolverlo, para poder evitarlo en el futuro –

1

Hay una manera de hacer esto, mueva el código de tiempo de diseño generado para el ListView, y es columnas, luego empujarlos en un método ... ver aquí para un ejemplo

 
public Mainform(){ 
    InitializeComponent(); 
    // 
    InitListView(); 
} 

public void InitListView(){ 
    // Design time generated code and manually add it here. 
} 

es la forma porquería de hacer frente a los problemas de tiempo de diseño extraño .... el único inconveniente es que, si desea agregar otra columna, se lo ve en tiempo de diseño ...

Espero que esto ayude, Saludos cordiales, Tom.

5

Tuve este problema al usar Visual Studio 2010. Cuando miré el código generado por el diseñador, había establecido el DisplayIndex para solo algunas de las columnas.En el momento del diseño, las columnas estaban en el orden correcto, pero en el tiempo de ejecución estaban en un orden diferente. Cuando agregué mis columnas, todavía tenían los nombres generados por el diseñador, p. ColumnHeader1, etc. Cuando los renombré a nombres más significativos y ejecuté mi aplicación, el orden de las columnas en tiempo de ejecución fue correcto. Miré el código generado por el diseñador y vi que había reordenado el código de creación de columna y había eliminado todos los valores de DisplayIndex (ya que no eran necesarios)

+1

Lo mismo aquí. Pude corregir las cosas editando el código generado por el diseñador. Esto es totalmente cojo que tenemos que lidiar con esto. –

+0

Mismo problema en VS 2015. Agregué nuevas columnas, pero cambié el orden y los índices de visualización a lo que quería. El diseñador muestra el diseño correcto y el editor de columnas muestra los índices correctos. El código generado lo ignora.La solución para mí fue similar a lo que sugiere, cambie el nombre de una columna y luego el código generado pierde los índices de visualización. El orden se toma del orden en que están almacenados en la matriz (que es correcto). – tjmoore

-1

Sé cómo solucionar esto, es necesario reconstruir el proyecto, saldrá bien de nuevo.

+0

no funciona. vs2013 –

+0

no funciona - el orden permanece. – Asher

0

Más que mover los miembros, debe restablecer DisplayIndex. Establezca DisplayIndex para la columna C en 3 y DisplayIndex para D en 4

+0

"ajustó los índices de visualización" - por lo que ya se intentó. He tenido el mismo problema. Ignora los índices que configura, aunque los almacena en algún lugar, pero no en el código generado. – tjmoore

0

Edito el diseñador y escribo a mano para cada columna la propiedad DisplayIndex. Compila bien, funciona bien. Aunque ahora veo que el diseñador está un poco cambiado, pero para mí funciona bien.

-1

Tengo este problema de vez en cuando, pero solo cuando hago muchos cambios en un proyecto e inserto columnas antes que otros en el ListView.

Encontré tres arreglos por separado, pero ninguno funciona todo el tiempo. Sin embargo, lo siguiente siempre me ha funcionado:

  1. Mueva cualquier columna en el medio hacia arriba y hacia abajo.
  2. Reconstruir la generación de proyecto >> Reconstruir
  3. Cerrar vuelva a abrir el proyecto

me parece que ni (1) ni (2) funciona todo el tiempo, y que no hacer (3) puede dar lugar a la condición fuera de orden para regresar al próximo abierto.

0

Me encontré con el mismo problema en Visual Studio 2017. En el momento del diseño, estaban en el orden correcto. Pero en el tiempo de ejecución, se cambiaron las 2 últimas columnas.

Lo que finalmente se solucionó fue ir a la lista de tareas de vista (el pequeño botón que aparece en la esquina superior derecha de la vista de lista) y cambiar la vista a Iconos grandes. Ejecute el proyecto. Salir. Regrese y cambie la vista a Detalles y ejecútelo. Eso lo solucionó para mí.

Cuestiones relacionadas