listview
ac# winformsコントロールの列幅を自動に設定するにはどうすればよいですか。width = -1 / -2 のようなものですか?
10 に答える
答えは次のとおりです。-2 は列ヘッダーのテキストの長さに合わせて列を自動サイズ調整し、-1 は列内の最も長い項目に合わせて自動サイズ調整します。すべて MSDN によると。ただし、-1 の場合、項目を追加した後に列幅を設定する必要があることに注意してください。したがって、新しいアイテムを追加する場合は、コントロール内のデータに従って自動サイズ設定する列 (または列) の width プロパティも割り当てる必要がありますListView
。
リストビューを何度もクリアして補充するプログラムを作成しました。何らかの理由で、幅 = -2 の列を追加するたびに、最初の列が長すぎるという問題が発生しました。これを修正するために私がしたことは、このメソッドを作成することでした。
private void ResizeListViewColumns(ListView lv)
{
foreach(ColumnHeader column in lv.Columns)
{
column.Width = -2;
}
}
この方法の素晴らしい点は、これをどこにでも配置して、すべての列のサイズを変更できることです。を渡すだけListView
です。
親パネル(ListViewドックフィル)にListViewがある場合は、単純にメソッドを使用できます...
private void ListViewHeaderWidth() {
int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
foreach (ColumnHeader header in listViewInfo.Columns)
{
header.Width = HeaderWidth;
}
}
このソリューションは、最初に列データに基づいて列のサイズを変更します。サイズ変更された幅がヘッダー サイズよりも小さい場合は、少なくともヘッダーに収まるように列のサイズを変更します。これはかなり醜い解決策ですが、うまくいきます。
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();
}