2010-12-17 35 views
7

¿Hay alguna manera de evitar que la barra de desplazamiento horizontal se muestre alguna vez en una vista de lista? Quiero que se muestre la barra de desplazamiento vertical cuando sea necesario, pero quiero que la barra de desplazamiento horizontal nunca aparezca.C# ListView Desactivar barra de desplazamiento horizontal

Me imagino que tendría algo que ver con WndProc?

Gracias

Respuesta

4

usted podría intentar algo como esto, lo utilizan en un proyecto una vez y funcionó:

[DllImport ("user32")] 
private static extern long ShowScrollBar (long hwnd , long wBar, long bShow); 
long SB_HORZ = 0; 
long SB_VERT = 1; 
long SB_BOTH = 3; 

private void HideHorizontalScrollBar() 
{ 
    ShowScrollBar(listView1.Handle.ToInt64(), SB_HORZ, 0); 
} 

espero que ayude.

+1

Hola, ¿pueden explicar esto, o pueden decirme cómo puedo leer todas estas llamadas directas de Windows API? – swordfish

+1

En lugar de 'long hwnd', podrían usar' IntPtr hwnd' como el primer parámetro de la P/Invoke método. –

+0

En segundo lugar, para P/Invocaciones, siempre mira pinvoke. :) http://www.pinvoke.net/default.aspx/user32/ShowScrollBar.html da la firma [DllImport ("user32.dll")] [return: MarshalAs (UnmanagedType.Bool)] public static extern bool ShowScrollBar (IntPtr hWnd, int wBar, [MarshalAs (UnmanagedType.Bool)] bool bShow); El único problema (creo) es IntPtr que Uwe ya ha mencionado. –

4

@ La respuesta de bennyyboi no es segura, ya que desequilibra la pila. se debe utilizar el código siguiente en su lugar para el DllImport:

[System.Runtime.InteropServices.DllImport("user32", CallingConvention=System.Runtime.InteropServices.CallingConvention.Winapi)] 
     [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)] 
     private static extern bool ShowScrollBar(IntPtr hwnd, int wBar, [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)] bool bShow); 

Andreas Reiff cubre esto en su comentario anterior después de mirar de nuevo, así que supongo que aquí todo está bien formateado.

6

Hay una manera mucho más simple de eliminar la barra de desplazamiento inferior y mostrar la vertical. Consiste en hacer que la cabecera y si no hay cabecera de las filas son la anchura de la listview.Width - 4 y si la barra de desplazamiento vertical es mostrar a continuación listview.Width - Scrollbar.Width - 4;

el siguiente código demostrates cómo:

lv.Columns[0].Width = Width - 4 - SystemInformation.VerticalScrollBarWidth; 
+0

De hecho, es un enfoque mucho más limpio que la respuesta seleccionada y en realidad la causa raíz del problema. La (s) columna (s) de ListView deben ser más pequeñas. Gracias por esa pista, funcionó para mí. – Tobias

+0

¡Esto es simple y funciona! ¡Gran trabajo! – NothinRandom

+0

No creo que esto funcione si usa filas de casilla de verificación.Además, no creo que los valores fijos sean buenos ya que otros diseños de ventanas quizás usarán diferentes tamaños. Y por último pero no menos importante, este no es un enfoque más limpio. Si no desea una barra de desplazamiento, debe ocultarla/deshabilitarla y no ajustar otra cosa para que no se muestre. No me gustan las soluciones p/Invoke pero sigue siendo un mejor enfoque que el ajuste de ancho de columna. –

1

La mejor solución es la respuesta aceptada que se dio aquí: How to hide the vertical scroll bar in a .NET ListView Control in Details mode

Funciona perfectamente y no necesita algunos trucos como los ajustes de ancho de columna. Además, deshabilita la barra de desplazamiento a la derecha cuando crea el control.

El inconveniente es que debe crear su propia clase de vista de lista que deriva de System.Windows.Forms.ListView para anular WndProc. Pero este es el camino a seguir.

Para desactivar la barra de desplazamiento horizontal, recuerde utilizar WS_HSCROLL en lugar de WS_VSCROLL (que se utilizó en la respuesta vinculada). El valor para WS_HSCROLL es 0x00100000.

Cuestiones relacionadas