WinForms中多余的滚动条

时间:2013-09-14 17:18:54

标签: c# winforms resize scrollbar

我有一个带有ListView的WinForms应用程序,它可以与主程序窗口一起缩放。在OnResize中,我调整列的宽度以适合ListView的整个宽度。现在当我从全屏切换到正常时,我得到一个水平滚动条。此滚动条无法滚动,即它覆盖的宽度是ListView宽度的100%。换句话说,我想摆脱这个滚动条。如果我很快触摸窗口调整大小处理程序,而不实际调整窗口大小,则重新计算宽度并且滚动条消失。如何自动摆脱滚动条?

column1.Width = fixedWidth;
column2.Width = listView.Width - fixedWidth - System.Windows.Forms.SystemInformation.VerticalScrollBarWidth;

2 个答案:

答案 0 :(得分:3)

有两个问题。它首先使用listview的Width属性。对于带边框的ListView,这是不正确的,您需要使用ClientSize.Width属性。第二个问题与计算自动布局的方式有关,它会导致Resize事件过早发生。你可以通过使用Control.BeginInvoke()延迟调整来解决这个问题。像这样:

    private void listView1_Resize(object sender, EventArgs e) {
        this.BeginInvoke(new Action(() => {
            var lv = (ListView)sender;
            var w = 0;
            for (int ix = 0; ix < lv.Columns.Count - 1; ++ix) w += lv.Columns[ix].Width;
            w = Math.Max(0, lv.ClientSize.Width - w);
            lv.Columns[lv.Columns.Count - 1].Width = w;
        }));
    }

答案 1 :(得分:2)

要使用最后一列的宽度填充剩余空间,您可以执行此操作,当然,每当调整表单大小时,我们都必须执行此操作:

//Resize event handler for your Form1
private void Form1_Resize(object sender, EventArgs e){
    column2.Width = -2;
}
//ColumnWidthChanged event handler
private void listView1_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e){
    int lastIndex = listView1.Columns.Count - 1;
    if (e.ColumnIndex != lastIndex) listView1.Columns[lastIndex].Width = -2;
}
//ColumnWidthChanging event handler
private void listView1_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e){
    int lastIndex = listView1.Columns.Count - 1;
    if (e.ColumnIndex != lastIndex) listView1.Columns[lastIndex].Width = -2;
}

注意:你说你有ListView缩放with the main program window,我不知道你为此做了什么,但我建议你应该使用{{ 1}} property,set Anchor