1

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

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

2 回答 2

3

有两个问题。它从您使用列表视图的 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;
        }));
    }
于 2013-09-14T17:49:34.340 回答
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;
}

注意:你说你有你的ListViewscaled with the main program window,我不知道你做了什么来实现这一点,但我建议你应该使用Anchor属性 set listView1.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;

于 2013-09-14T17:33:03.263 回答