2010-12-17 15 views
7

Czy istnieje sposób, aby zatrzymać poziomy pasek przewijania od momentu pojawienia się w widoku listy? Chcę, aby pionowy pasek przewijania był wyświetlany w razie potrzeby, ale chcę, aby poziomy pasek przewijania nigdy się nie wyświetlał.C# ListView Wyłącz poziomy pasek przewijania

Wyobrażam sobie, że miałoby to coś wspólnego z WndProc?

Dzięki

Odpowiedz

4

można spróbować coś takiego, kiedyś w projekcie raz i to działało:

[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); 
} 

Nadzieję, że to pomaga.

+1

Witam, czy możesz to wyjaśnić, czy możesz mi powiedzieć, jak mogę przeczytać na temat wszystkich tych bezpośrednich wywołań api Windows? – swordfish

+1

Zamiast 'long hwnd' możesz użyć' IntPtr hwnd' jako pierwszego parametru do P/Invoke metoda. –

+0

Po drugie, dla P/Invokes, alsways patrzą na pinvoke. :) http://www.pinvoke.net/default.aspx/user32/ShowScrollBar.html podaje podpis [DllImport ("user32.dll")] [return: MarshalAs (UnmanagedType.Bool)] public static extern bool ShowScrollBar (IntPtr hWnd, int wBar, [MarshalAs (UnmanagedType.Bool)] bool bShow); Jedyny problem (chyba) to IntPtr, o którym wspomniał już Uwe. –

4

@ bennyyboi odpowiedź jest niebezpieczna, ponieważ nie wyważa stosu. należy użyć następującego kodu zamiast za 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 Obejmuje to w swoim komentarzu powyżej po spojrzeniu ponownie, więc myślę, że tu jest wszystko ładnie sformatowany.

6

Istnieje znacznie prostszy sposób na wyeliminowanie dolnego paska przewijania i wyświetlenie w pionie. Składa się z upewniając się nagłówek i jeśli bez nagłówka wiersze są szerokość listview.Width - 4 a jeśli pionowy pasek przewijania jest pokazać następnie listview.Width - Scrollbar.Width - 4;

następujący kod demostrates jak:

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

To rzeczywiście jest o wiele czystsze podejście niż wybrana odpowiedź, a właściwie główna przyczyna problemu. Kolumny ListView muszą być mniejsze. Dzięki za podpowiedź, zadziałało to dla mnie. – Tobias

+0

To jest proste i działa! Dobra robota! – NothinRandom

+0

Nie sądzę, że to zadziała, jeśli użyjesz wierszy w polu wyboru.Również nie sądzę, że stałe wartości są dobre, ponieważ inne projekty okien mogą używać różnych rozmiarów. I na koniec to nie jest czystsze podejście. Jeśli nie chcesz paska przewijania, powinieneś go ukrywać/dezaktywować, a nie dostosowywać czegoś innego, aby nie był pokazywany. Nie lubię rozwiązań p/Invoke, ale wciąż jest to lepsze podejście niż dostosowanie szerokości kolumny. –

1

Najlepszym rozwiązaniem to zaakceptowana odpowiedź podana tutaj: How to hide the vertical scroll bar in a .NET ListView Control in Details mode

Działa doskonale i nie potrzebujesz żadnych sztuczek, takich jak regulacja szerokości kolumny. Co więcej, wyłącza pasek przewijania tuż po utworzeniu kontrolki.

Wadą jest to, że musisz stworzyć własną klasę widoku listy, która wywodzi się z System.Windows.Forms.ListView, aby zastąpić WndProc. Ale to jest droga.

Aby wyłączyć poziomy pasek przewijania, należy pamiętać, aby użyć WS_HSCROLL zamiast WS_VSCROLL (który został użyty w połączonej odpowiedzi). Wartość dla WS_HSCROLL to 0x00100000.

Powiązane problemy