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