Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinForms中多余的滚动条_C#_Winforms_Resize_Scrollbar - Fatal编程技术网

C# WinForms中多余的滚动条

C# WinForms中多余的滚动条,c#,winforms,resize,scrollbar,C#,Winforms,Resize,Scrollbar,我有一个带有ListView的WinForms应用程序,它可以随主程序窗口进行缩放。在调整大小时,我调整列的宽度以适应ListView的全宽。现在,当我从全屏切换到普通屏幕时,我会看到一个水平滚动条。此滚动条无法滚动,即它覆盖的宽度为ListView宽度的100%。换句话说,我想摆脱这个滚动条。如果我短时间触摸窗口大小调整处理程序,而没有实际调整窗口大小,则重新计算宽度,滚动条消失。我怎样才能自动摆脱滚动条 column1.Width = fixedWidth; column2.Width =

我有一个带有ListView的WinForms应用程序,它可以随主程序窗口进行缩放。在调整大小时,我调整列的宽度以适应ListView的全宽。现在,当我从全屏切换到普通屏幕时,我会看到一个水平滚动条。此滚动条无法滚动,即它覆盖的宽度为ListView宽度的100%。换句话说,我想摆脱这个滚动条。如果我短时间触摸窗口大小调整处理程序,而没有实际调整窗口大小,则重新计算宽度,滚动条消失。我怎样才能自动摆脱滚动条

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

要用最后一列的宽度填充剩余空间,您可以这样做,当然,每当调整表单大小时,我们都必须这样做:

//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,我不知道您是如何做到这一点的,但我建议您应该使用Anchor属性,设置listView1.Anchor=AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom

要用最后一列的宽度填充剩余空间,您可以这样做,当然,每当调整表单大小时,我们都必须这样做:

//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,我不知道您是如何做到这一点的,但我建议您应该使用Anchor属性,设置listView1.Anchor=AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom

有两个问题。首先使用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;
        }));
    }

有两个问题。首先使用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;
        }));
    }


您是否从listview的宽度中减去垂直滚动条的宽度(如果有的话)来计算每列的宽度?@AlessandroD'Andria是的,将代码添加到问题中Column1和column2是列标题,但不确定这是否有区别OK我找到了一些旧代码,我的解决方案是column2.Width=listView.Width-fixedWidth-System.Windows.Forms.SystemInformation.VerticalScrollBarWidth-8;是的,它很傻,但很有效:嗨,亚历山德罗,问题不是我不能计算宽度,问题是正确的宽度仍然会创建一个无用的滚动条。我知道它是对的,因为即使是scollbar也知道它是对的,一旦我点击它,它就会消失,脸上带着尴尬的表情;您是否从listview的宽度中减去垂直滚动条的宽度(如果有的话)来计算每列的宽度?@AlessandroD'Andria是的,将代码添加到问题中Column1和column2是列标题,但不确定这是否有区别OK我找到了一些旧代码,我的解决方案是column2.Width=listView.Width-fixedWidth-System.Windows.Forms.SystemInformation.VerticalScrollBarWidth-8;是的,它很傻,但很有效:嗨,亚历山德罗,问题不是我不能计算宽度,问题是正确的宽度仍然会创建一个无用的滚动条。我知道它是对的,因为即使是scollbar也知道它是对的,一旦我点击它,它就会消失,脸上带着尴尬的表情;King King的回答是正确的,我在过去也遇到过同样的问题,它的解决方案很好。谢谢,这是一件有趣的事情,但它不起作用。它将大小设置为所有元素的最大长度,而不是将其剪切。当有足够的空间时,它就不能充分利用它。但是我还需要在第一列应用它,而不是最后一列-?关于你的笔记,它是通过listView.Dock=System.Windows.Forms.DockStyle.Fill完成的;当坐在一个具有相同属性的拆分面板中时,这并不能解决真正的问题。这个magic-2只是一个用来补偿ListView边框的技巧,使用ClientSize.Width而不是Width可以很容易地修复。@Nicolas78它对我很有用,我想你改变了其中一列的宽度,如果是这样,我们还必须更新最后一列的宽度。代码只应用于最后一列,所有其他列的宽度都应该是固定的,但是使用我更新的代码,您可以在运行时调整它们的宽度,以便所有列都填充网格的宽度。但是我希望第一列填充宽度。然而,计算宽度是我能做的,问题出在其他地方,看汉斯的回答,金的答案是正确的,我过去有时也遇到过同样的问题
它的解决方案很好。谢谢,这是一件有趣的事情,但它不起作用。它将大小设置为所有元素的最大长度,而不是将其剪切。当有足够的空间时,它就不能充分利用它。但是我还需要在第一列应用它,而不是最后一列-?关于你的笔记,它是通过listView.Dock=System.Windows.Forms.DockStyle.Fill完成的;当坐在一个具有相同属性的拆分面板中时,这并不能解决真正的问题。这个magic-2只是一个用来补偿ListView边框的技巧,使用ClientSize.Width而不是Width可以很容易地修复。@Nicolas78它对我很有用,我想你改变了其中一列的宽度,如果是这样,我们还必须更新最后一列的宽度。代码只应用于最后一列,所有其他列的宽度都应该是固定的,但是使用我更新的代码,您可以在运行时调整它们的宽度,以便所有列都填充网格的宽度。但是我希望第一列填充宽度。然而,计算宽度是我能做的事情,问题出在其他地方,请参见Hans的回答谢谢!这不仅工作得很好,我以不同的方式计算宽度,而且将计算包装到BeginInvoke中就可以做到这一点,但是过早触发事件的概念也非常适合观察到的行为。更不用说使用ClientSize显然更好,因为我已经意识到了这一点;出于好奇,BeginInvoke除了延迟执行之外还有其他功能吗?希望仍然需要做的事情都能完成?当然,只要阅读MSDN文章进行控制。BeginInvoke。它实际上并没有提到这个用法:不,我的意思是,好吧,读这篇文章也不会有什么坏处;谢谢这不仅工作得很好,我以不同的方式计算宽度,而且将计算包装到BeginInvoke中就可以做到这一点,但是过早触发事件的概念也非常适合观察到的行为。更不用说使用ClientSize显然更好,因为我已经意识到了这一点;出于好奇,BeginInvoke除了延迟执行之外还有其他功能吗?希望仍然需要做的事情都能完成?当然,只要阅读MSDN文章进行控制。BeginInvoke。它实际上并没有提到这个用法:不,我的意思是,好吧,读这篇文章也不会有什么坏处;