ac#winformslistview
コントロールの列幅を自動に設定するにはどうすればよいですか。幅= -1 / -2のようなもの?
回答:
あなたは答えを与えました:-2は列ヘッダーのテキストの長さに列を自動サイズ変更し、-1は列の最も長い項目に自動サイズ変更します。すべてMSDNによると。ただし、-1の場合は、項目を追加した後に列幅を設定する必要があることに注意してください。したがって、新しいアイテムを追加する場合は、ListView
コントロール内のデータに従って自動サイズ設定する1つまたは複数の列のwidthプロパティも割り当てる必要があります。
これを使って:
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);
このソリューションは、最初に列データに基づいて列のサイズを変更します。サイズ変更された幅がヘッダーサイズよりも小さい場合、少なくともヘッダーに合うように列のサイズを変更します。これはかなり醜い解決策ですが、機能します。
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をparamに渡して、このようなものを使用できます
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キーを押します
myListView.Columns[0].Width = -1;