C # ListView Sütun Genişliği Otomatik


82

Ac # winforms listviewkontrolünün sütun genişliğini otomatik olarak nasıl ayarlayabilirim . Genişlik = -1 / -2 gibi bir şey?

Yanıtlar:


107

Cevabı verdiniz: -2, sütunu sütun başlığındaki metnin uzunluğuna otomatik olarak boyutlandıracak, -1 sütundaki en uzun öğeye otomatik boyutlandırılacaktır. Hepsi MSDN'ye göre . -1 durumunda, öğe (ler) i ekledikten sonra sütun genişliğini ayarlamanız gerekeceğini unutmayın. Bu nedenle, yeni bir öğe eklerseniz, denetimdeki verilere göre otomatikleştirmek istediğiniz sütunun (veya sütunların) genişlik özelliğini de atamanız gerekir ListView.


MSDN makalesi ColumnHeader'a başvururken, bunun yalnızca sütun anlamına geldiğini unutmayın. Kod örneği:myListView.Columns[0].Width = -1;
Eric G

103

Bunu kullan:

yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

dan burada


8
Ancak maksimum başlık veya veri genişliğini istiyorsanız ne olur? Titreşimsiz mi?
Toddmo

@toddmo Her iki dizeyi de kullanın. Ve gerekirse listView.BeginUpdate () arasında; ... listView.EndUpdate ();
Artem Zh.

23

Liste görünümümü birçok kez temizleyen ve yeniden dolduran bir program yaptım. Bazı nedenlerden dolayı, genişlik = -2 olan sütunları her eklediğimde, ilk sütunun çok uzun olmasıyla ilgili bir sorunla karşılaştım. Bunu düzeltmek için yaptığım şey bu yöntemi oluşturmaktı.

private void ResizeListViewColumns(ListView lv)
{
    foreach(ColumnHeader column in lv.Columns)
    {
        column.Width = -2;
    }
}

Bu yöntemle ilgili harika olan şey, tüm sütunlarınızı yeniden boyutlandırmak için bunu hemen hemen her yere koyabilmenizdir. Sadece geç ListView.


1
bu, genişliği ListView'ınızdaki son öğenin genişliğine ayarlayacaktır
Qsiris

Kodunuzu kullanıyorum, ancak liste görünümümde yalnızca bir sütunum varsa, her yatay kaydırma çubuğu aldığımda. En az iki sütun varsa, kod iyi çalışır. Bu davranışın nereden geldiğini biliyor musunuz?
prototype0815

2

Herhangi bir Üst panelde ListView varsa (ListView dock dolgusu), basitçe yöntemi kullanabilirsiniz ...

private void ListViewHeaderWidth() {
        int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
        foreach (ColumnHeader header in listViewInfo.Columns)
        {
            header.Width = HeaderWidth;
        }
    }

2

AutoResizeColumnGerekli parametre ile belirli bir sütunu otomatik olarak boyutlandırmanıza izin veren başka bir kullanışlı yöntem vardır .

Şöyle diyebilirsiniz:

listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);

1

Sütunun otomatik yeniden boyutlandırma genişliğini anında ayarlamak istiyorsanız, Fredrik'in cevabını biraz genişletmek, örneğin: ilk sütunun otomatik boyut genişliğini 70 olarak ayarlamak:

myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.None);
myListView.Columns[0].Width = 70;
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

1

Bu çözüm önce sütunları sütun verilerine göre yeniden boyutlandıracak, yeniden boyutlandırılan genişlik başlık boyutundan küçükse sütunları en azından başlığa sığacak şekilde yeniden boyutlandıracaktır. Bu oldukça çirkin bir çözüm ama işe yarıyor.

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'dir. colFirstName, 60'ın başlığa sığması için gereken genişlik olduğu bir sütundur. Vb.


0

Bunun gibi bir şey kullanabilirsiniz, istediğiniz ListView'ü param olarak geçirebilirsiniz.

    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();
    }

0

Ayrıca, özelliği değiştirmeden ListView'ün beklendiği gibi görüntülenmeyebileceğini de belirtmek gerekir:

myListView.View = View.Details; // or View.List

Benim için Visual Studio, herhangi bir nedenle View.LargeIcon olarak varsayılan olarak görünüyor, bu nedenle değiştirilene kadar hiçbir şey görünmüyor.

ListView'da tek bir sütun göstermek ve dikey bir kaydırma çubuğu için alan sağlamak için kodu tamamlayın.

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);
}

-1

Yazarın, IDE aracılığıyla arkasındaki kodu oluşturacak ve tüm parametrelerin yerinde olmasını sağlayacak eşdeğer bir yöntem aradığına inanıyorum. Bunu MS'den buldum:

Windows Forms Designer'da Olay İşleyicileri Oluşturma

Kendim bir VB geçmişinden geliyorum, aradığım şey buydu, işte tıklama tersinin kısa versiyonu:

  1. Olay işleyicisi oluşturmak istediğiniz formu veya denetimi tıklayın.
  2. Özellikler penceresinde, Olaylar düğmesini tıklayın
  3. Mevcut olaylar listesinde, olay işleyicisi oluşturmak istediğiniz olayı tıklayın.
  4. Olay adının sağındaki kutuya işleyicinin adını yazın ve ENTER tuşuna basın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.