この 2 つの方法を使用して、列の内容とヘッダーの応答に基づいて列の長さを調整します。
ListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); ListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
しかし、両方に基づいて調整する方法は? つまり、ヘッダーと列のコンテンツの長さが最も長くなるように調整します。
この 2 つの方法を使用して、列の内容とヘッダーの応答に基づいて列の長さを調整します。
ListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); ListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
しかし、両方に基づいて調整する方法は? つまり、ヘッダーと列のコンテンツの長さが最も長くなるように調整します。
lvw.Columns[0].Width = -2
詳細については、MSDN のコメントを参照してください: http://msdn.microsoft.com/en-us/library/system.windows.forms.columnheader.width.aspx
また、MSDN では「列見出しの幅に合わせて自動サイズ設定するには、Width プロパティを -2 に設定してください」と記載されていますが、実際には列見出しと列の内容に対して機能します。
これを証明するコードは次のとおりです。
lvw.Columns.Add(new String('x', 25)); // short header
lvw.Items.Add(new String('x', 100)); // long content
lvw.Columns[0].Width = -2;
// in result column width will be set to fit content
ここで回答したように、両方のサイズ変更オプションを呼び出すと、次のようになります。
myListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
myListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
これは、コンテンツとヘッダーの両方に合わせて列幅を調整するために使用するものです。
public static void autoResizeColumns(ListView lv)
{
lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
ListView.ColumnHeaderCollection cc = lv.Columns;
for (int i = 0; i < cc.Count; i++)
{
int colWidth = TextRenderer.MeasureText(cc[i].Text, lv.Font).Width + 10;
if (colWidth > cc[i].Width)
{
cc[i].Width = colWidth;
}
}
}
使用例:
autoResizeColumns(listView1);
メソッドは十分にテストされていませんが、少なくとも私が使用しているコンテキストでは機能します。
私の場合、次の手順でこれを行います (2 列のデータの場合)。
VB.NET の場合:
'Create two header objects as ColumnHeader Class
Dim header1, header2 As ColumnHeader
'Construcción de los objetos header
header1 = New ColumnHeader
header1.Text = "ID"
header1.TextAlign = HorizontalAlignment.Right
header1.Width = 10
header2 = New ColumnHeader
header2.Text = "Combinaciones a Procesar"
header2.TextAlign = HorizontalAlignment.Left
header2.Width = 10
'Add two columns using your news headers objects
ListView.Columns.Add(header1)
ListView.Columns.Add(header2)
'Fill three rows of data, for each column
ListView.Items.Add(New ListViewItem({"A1", "B1"}))
ListView.Items.Add(New ListViewItem({"A2", "B2"}))
ListView.Items.Add(New ListViewItem({"A3", "B3"}))
'Change the size of each column
Dim headsz1, headsz2 As Integer
SelectionInTable.ListView.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.HeaderSize)
SelectionInTable.ListView.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.HeaderSize)
headsz1 = header1.Width
headsz2 = header2.Width
SelectionInTable.ListView.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent)
SelectionInTable.ListView.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent)
headsz1 = Math.Max(headsz1, header1.Width)
headsz2 = Math.Max(headsz2, header2.Width)
header1.Width = headsz1
header2.Width = headsz2
Anton Kedrov の回答が最良の回答ですが、私の場合、50 列を超えるリストビューがあり、そのデータを頻繁に更新しています。
-2に設定する最初の方法
public void AutoUpdateColumnWidth(ListView lv)
{
for (int i = 0; i <= lv.Columns.Count - 1; i++) {
lv.Columns(i).Width = -2;
}
}
私が使用した2番目の方法(複数の呼び出しでちらつきが少ない)
public void AutoUpdateColumnWidth(ListView lv)
{
ListViewItem nLstItem = new ListViewItem(lv.Columns(0).Text);
for (int i = 1; i <= lv.Columns.Count - 1; i++) {
nLstItem.SubItems.Add(lv.Columns(i).Text);
}
v.Items.Add(nLstItem);
lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
lv.Items.RemoveAt(nLstItem.Index);
}
これは簡単です(理解するのに時間がかかりましたが)...
すべてのヘッダー テキストが表示されるように、幅は少なくとも列ヘッダーと同じ大きさでなければならないことがわかっています。それを超えて、幅はコンテンツを収容するために大きく拡張できます。したがって、次のことを行います。
他のポスターが示唆するように、幅を個別に追跡してリセットする必要はありません。列の最小幅を設定すると、ヘッダー テキストが変更されるまで問題が解決されます。この場合、最小幅を 0 に設定し、変更された列だけを自動サイズ調整してから、最小幅を現在の幅に再度設定します。
編集:申し訳ありませんが、標準のリストビューではなく、サードパーティ製品の BetterListView (無料版が利用可能) を使用していたことを忘れていました。標準のリストビュー列は、最小幅をサポートしていないようです。優れた代替手段として BetterListView を強くお勧めします (機能セットとパフォーマンスがはるかに優れています)。
これは、任意の ListView に使用できる C# ソリューションです。特定のリスト ビューで列数とヘッダーが変更されないことを前提としています。ヘッダーの幅を毎回再計算する場合 (ヘッダーが変更された場合、または列の数が変更された場合) は、listViewHeaderWidths ディクショナリを削除します。
private Dictionary<string, int[]> listViewHeaderWidths = new Dictionary<string, int[]>();
private void ResizeListViewColumns(ListView lv)
{
int[] headerWidths = listViewHeaderWidths.ContainsKey(lv.Name) ? listViewHeaderWidths[lv.Name] : null;
lv.BeginUpdate();
if (headerWidths == null)
{
lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
headerWidths = new int[lv.Columns.Count];
for (int i = 0; i < lv.Columns.Count; i++)
{
headerWidths[i] = lv.Columns[i].Width;
}
listViewHeaderWidths.Add(lv.Name, headerWidths);
}
lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
for(int j = 0; j < lv.Columns.Count; j++)
{
lv.Columns[j].Width = Math.Max(lv.Columns[j].Width, headerWidths[j]);
}
lv.EndUpdate();
}