如何将 ac# winformslistview
控件的列宽设置为自动。像 width = -1 / -2 这样的东西?
10 回答
您给出了答案:-2 会将列自动调整为列标题中文本的长度,-1 将自动调整为列中最长的项目。全部根据 MSDN。请注意,在 -1 的情况下,您需要在添加项目后设置列宽。因此,如果您添加一个新项目,您还需要根据ListView
控件中的数据分配要自动调整大小的列(或列)的宽度属性。
用这个:
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
从这里
我制作了一个程序,多次清除并重新填充我的列表视图。出于某种原因,每当我添加宽度 = -2 的列时,我都会遇到第一列太长的问题。我为解决这个问题所做的就是创建这个方法。
private void ResizeListViewColumns(ListView lv)
{
foreach(ColumnHeader column in lv.Columns)
{
column.Width = -2;
}
}
这种方法的好处是你几乎可以把它放在任何地方来调整所有列的大小。只需传入你的ListView
.
还有另一种有用的方法AutoResizeColumn
,它允许您使用所需参数自动调整特定列的大小。
你可以这样称呼它:
listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);
如果您在任何父面板中有 ListView(ListView 停靠填充),您可以使用简单的方法...
private void ListViewHeaderWidth() {
int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
foreach (ColumnHeader header in listViewInfo.Columns)
{
header.Width = HeaderWidth;
}
}
扩展一下 Fredrik 的回答,如果你想动态设置列的自动调整宽度,例如:将第一列的自动调整宽度设置为 70:
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.None);
myListView.Columns[0].Width = 70;
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
此解决方案将首先根据列数据调整列的大小,如果调整后的宽度小于标题大小,它将调整列的大小以至少适合标题。这是一个非常丑陋的解决方案,但它有效。
lstContacts.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
colFirstName.Width = (colFirstName.Width < 60 ? 60 : colFirstName.Width);
colLastName.Width = (colLastName.Width < 61 ? 61 : colLastName.Width);
colPhoneNumber.Width = (colPhoneNumber.Width < 81 ? 81 : colPhoneNumber.Width);
colEmail.Width = (colEmail.Width < 40 ? 40 : colEmail.Width);
lstContacts 是 ListView。colFirstName 是一列,其中 60 是适合标题所需的宽度。等等。
你可以使用这样的东西,在参数中传递你想要的 ListView
private void AutoSizeColumnList(ListView listView)
{
//Prevents flickering
listView.BeginUpdate();
Dictionary<int, int> columnSize = new Dictionary<int,int>();
//Auto size using header
listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
//Grab column size based on header
foreach(ColumnHeader colHeader in listView.Columns )
columnSize.Add(colHeader.Index, colHeader.Width);
//Auto size using data
listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
//Grab comumn size based on data and set max width
foreach (ColumnHeader colHeader in listView.Columns)
{
int nColWidth;
if (columnSize.TryGetValue(colHeader.Index, out nColWidth))
colHeader.Width = Math.Max(nColWidth, colHeader.Width);
else
//Default to 50
colHeader.Width = Math.Max(50, colHeader.Width);
}
listView.EndUpdate();
}
还值得注意的是,如果不先更改属性,ListView 可能无法按预期显示:
myListView.View = View.Details; // or View.List
对我来说,Visual Studio 似乎出于某种原因将其默认为 View.LargeIcon,因此在更改之前什么都不会出现。
在 ListView 中显示单个列并为垂直滚动条留出空间的完整代码。
lisSerials.Items.Clear();
lisSerials.View = View.Details;
lisSerials.FullRowSelect = true;
// add column if not already present
if(lisSerials.Columns.Count==0)
{
int vw = SystemInformation.VerticalScrollBarWidth;
lisSerials.Columns.Add("Serial Numbers", lisSerials.Width-vw-5);
}
foreach (string s in stringArray)
{
ListViewItem lvi = new ListViewItem(new string[] { s });
lisSerials.Items.Add(lvi);
}
我相信作者正在通过 IDE 寻找一种等效的方法,该方法将生成后面的代码并确保所有参数都到位等。从 MS 中找到了这个:
我自己来自 VB 背景,这就是我一直在寻找的,这是点击不良的简要版本:
- 单击要为其创建事件处理程序的窗体或控件。
- 在“属性”窗口中,单击“事件”按钮
- 在可用事件列表中,单击要为其创建事件处理程序的事件。
- 在事件名称右侧的框中,键入处理程序的名称并按 ENTER