DataGridView Otomatik Sığdırma ve Doldurma


85

Bende 3 sütun var DataGridView. Yapmaya çalıştığım şey, ilk 2 sütunun içeriğin genişliğine otomatik olarak sığması ve 3. sütunun kalan alanı doldurması.

WinForms'da yapmak mümkün mü? Herhangi bir kullanım varsa, verilerimi bir EF DataContext'ten yüklüyorum. Şu anda nasıl göründüğüne dair bir resim ekledim.

görüntü açıklamasını buraya girin

Yanıtlar:


168

DataGridViewColumn.AutoSizeModeMülkü kullanmanız gerekir .

0 ve 1 numaralı sütun için şu değerlerden birini kullanabilirsiniz:

Tüm Hücreler: Sütun genişliği, başlık hücresi dahil olmak üzere sütundaki tüm hücrelerin içeriğine uyacak şekilde ayarlanır.
AllCellsExceptHeader: Sütun genişliği, başlık hücresi hariç olmak üzere sütundaki tüm hücrelerin içeriğine uyacak şekilde ayarlanır.
DisplayedCells: Sütun genişliği, başlık hücresi dahil olmak üzere ekranda görüntülenen satırlarda bulunan sütundaki tüm hücrelerin içeriğine uyacak şekilde ayarlanır.
DisplayedCellsExceptHeader: Sütun genişliği, başlık hücresi hariç, o anda ekranda görüntülenen satırlarda bulunan sütundaki tüm hücrelerin içeriğine uyacak şekilde ayarlanır.

Ardından sütun 2 için Doldurma değerini kullanırsınız

Sütun genişliği, tüm sütunların genişlikleri kontrolün görüntüleme alanını tam olarak dolduracak şekilde ayarlanır ...

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Diğer kullanıcıların da belirttiği gibi, varsayılan değer özellik datagridviewseviyesinde ayarlanabilir DataGridView.AutoSizeColumnsMode.

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

olabilirdi:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

Önemli Not:

Izgaranız bir veri kaynağına bağlıysa ve sütunlar otomatik olarak oluşturulmuşsa ( AutoGenerateColumnsözellik True olarak ayarlanmışsa), sütunlar oluşturulduktan SONRADataBindingComplete stili uygulamak için olayı kullanmanız gerekir .


Bazı senaryolarda (örneğin hücre değerini koda göre değiştirin) DataGridView1.AutoResizeColumns();ızgarayı yenilemek için aramak zorunda kaldım .


1
DataBindingComplete olayını kullanırken mükemmel çalışır.
James Jeffery

Datagrid doldurulduktan sonra DataBindingComplete yöntemini nasıl çağıracağımı anlayamıyorum
Dan

@Dan DataBindingComplete bir yöntem değil , abone olmanız gereken bir datagridview olayı . Bu cevap stackoverflow.com/a/31685874/2387010 bir örnek verir. Yardımcı olur mu?
Chris

Örnek açıklansaydı yararlı olurdu ama yeterli olacaktır. Sonradan de bağlantılı olduğu MSDN makale benim desen olarak kullanılan ancak çağrılan anlamaya olamaz ne bir yöntemi olarak gösterir onu.
Dan

1
@Chris, bu eksik bilgi parçası kesinlikle yardımcı oldu, teşekkürler. Okuyorum bu kitabı ve sadece umarım kısa süre daha mantıklı olacaktır bu yüzden delegeler ve lamda fonksiyonları üzerindeki bölümün lazım. Teşekkür ederim!
Dan

22

Bu benim en sevdiğim yaklaşım ...

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };

Sütun boyutu = 0 ise, index out of bound exceptionbunu düzeltin, teşekkürler !!
TiyebM

14

Sadece özelliği kontrol özelliğinden değiştirin: AutoSizeColumnsMode:Fill

VEYA koda göre

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;


1
Teşekkür ederim. Bunun gibi bir çözüm arıyordum! :)
Alin Ciocan

4

Test edilmedi ama deneyebilirsin. Test edildi ve çalışıyor. Ben seninle oynamak umut AutoSizeModeait DataGridViewColumneye ihtiyacınız elde etmek.

Ayarlamayı dene

dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode

//Set the following properties after setting datasource
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Bu çalışmalı


Bu çalışmıyor. DataContext'ten veri kaynağı eklenmeden önce form başlatıldığında bunu ayarlıyorum. Nedeni bu olabilir mi? Veriler çalışma zamanında yüklendiği ve sütunlar EF modelinden alındığı için onu nereye ayarlayacağımı bilmiyorum.
James Jeffery

Öyle görünüyor ama değil, üçüncü satır çalışmıyor, bunu 10 dakika önce test ettim.
King King

@JamesJeffery Sütunları Otomatik Dolduruyor musunuz yoksa manuel olarak mı dolduruyorsunuz?
Sriram Sakthivel

@SriramSakthivel DataContext'ten dönen bir Listeyi bağlamak için dataGridView1.DataSource özelliğini kullanıyorum.
James Jeffery

0

Yapmayı dene,

 AutoSizeColumnMode = Fill;

0
public static void Fill(DataGridView dgv2)
   {
        try
        {
            dgv = dgv2;
            foreach (DataGridViewColumn GridCol in dgv.Columns)
            {
                for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++)
                {
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                    GridCol.DataGridView.Columns[j].FillWeight = 1;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

1
Bu kod harika değil. Öncelikle, tüm sütunların genişlik modunu birçok kez (<sütun sayısı>) aynı şekilde ayarlayan iç içe döngüye ihtiyacınız yoktur; Her bir sütunun AutoSizeMode ve FillWeight özelliklerine doğrudan GridCol. İkincisi, her sütun için AutoSizeMode'u iki farklı değere ayarlıyor; ikinci atama ilkinin üzerine yazılacaktır.
JonP

0

AlfredBr'in cevabını geliştirmek için, sütunlarınızdan bazılarını gizlediyseniz, tüm sütunları otomatik olarak boyutlandırmak için aşağıdakileri kullanabilir ve ardından yalnızca son görünür sütunun boş alanı doldurmasını sağlayabilirsiniz:

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;

0

Bu, tüm sütunlar bunu yapamadığında "first_name" sütununun boşluğu doldurmasını sağlamak için yaptığım şeydir.

Izgara küçültüldüğünde "first_name" sütunu neredeyse görünmez olur (çok ince), böylece DataGridViewAutoSizeColumnMode'u diğer görünür sütunlar olarak AllCells olarak ayarlayabilirim. Performans sorunları için, verileri bağlamadan önce bunları Yok olarak ayarlamak ve ızgaranın DataBindingComplete olay işleyicisinde AllCell'e geri dönmek önemlidir. Umarım yardımcı olur!

private void dataGridView1_Resize(object sender, EventArgs e)
    {
        int ColumnsWidth = 0;
        foreach(DataGridViewColumn col in dataGridView1.Columns)
        {
            if (col.Visible) ColumnsWidth += col.Width;
        }

        if (ColumnsWidth <dataGridView1.Width)
        {
            dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
        else if (dataGridView1.Columns["first_name"].Width < 10) dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }

-1
public void setHeight(DataGridView src)
{
    src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 +   src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}

sadece bu işlevi çağırın, veri görünümü yüksekliğine içindeki satır sayısına göre karar verir
Durga Prasad Guntoju

1
Her şeyden önce, bu OP'nin sorusuna cevap vermiyor. Ayrıca (ileride başvurmak üzere) cevabın kendisine bu tür bir yorum ekleyin (bunu düzenleyebilirsiniz).
Joel

-2

Bunu dene :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
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.