DataGridView denetimindeki sütunları otomatik olarak nasıl yeniden boyutlandırır VE kullanıcının aynı ızgaradaki sütunları yeniden boyutlandırmasına izin verirsiniz?


109

Bir Windows Formunda (C # 2.0, WPF değil) DataGridView denetimini dolduruyorum.

Amacım, mevcut tüm genişliği hücrelerle düzgün bir şekilde dolduran - yani sağda kullanılmayan (koyu gri) alanlar olmayan ve her sütunu içerdiği verilere göre uygun şekilde boyutlandıran , ancak aynı zamanda kullanıcının sütunlardan herhangi birini yeniden boyutlandırmasına olanak tanıyan bir ızgara görüntülemek . onların beğenisine.

Kılavuzun tüm alanının düzgün bir şekilde verilerle doldurulmasını sağlamak için DataGridViewAutoSizeColumnMode.Fill olarak ayarladığım sütunlardan biri dışında her sütunun AutoSizeMode'unu DataGridViewAutoSizeColumnMode.AllCells olarak ayarlayarak bunu başarmaya çalışıyorum . (Kullanıcı bu sütunu yeniden boyutlandırmaya çalıştığında, yatay alanın her zaman kullanılmasını sağlayan bir boyuta geri döndüğünü umursamıyorum.)

Ancak, bahsettiğim gibi, yüklendikten sonra kullanıcının sütunları kendi gereksinimlerine uyacak şekilde yeniden boyutlandırmasına izin vermek istiyorum - her sütun için bu AutoSizeMode değerlerini ayarlarken, kullanıcı bu sütunları yeniden boyutlandıramıyor gibi görünüyor.

Yeniden boyutlandırmaya izin veren tüm sütunların AutoSizeMode'unu ayarlamamayı denedim ANCAK hücrelerin içerdiği verilere göre başlangıç ​​boyutunu ayarlamıyor. Veriler yüklendikten sonra ızgaranın Otomatik Boyutlandırma Modunu "Ayarlanmamış" olarak değiştirirken de aynı sonuç oluşur.

Burada eksik olduğum, varsayılan sütun genişliklerinin otomatik olarak ayarlanmasına VE kullanıcının yeniden boyutlandırılmasına izin veren bir ayar var mı yoksa DataGridView denetimini doldururken kullanmam gereken başka bir teknik var mı?


"Ayarlanmadı" olarak ayarlamayın, "Yok" olarak ayarlayın , böylece yeniden boyutlandırma Geri dönmez
bh_earth0

Yanıtlar:


132

Bu numara benim için çalışıyor:

grd.DataSource = DT;

//set autosize mode
grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

//datagrid has calculated it's widths so we can store them
for (int i = 0; i <= grd.Columns.Count - 1; i++) {
    //store autosized widths
    int colw = grd.Columns[i].Width;
    //remove autosizing
    grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    //set width to calculated by autosize
    grd.Columns[i].Width = colw;
}

Burada olan şey, otomatik boyutlandırmayı ihtiyacınız olan her moda ayarlamanız ve ardından otomatik boyutlandırma hesaplamasından elde ettiği genişliği sütun sütun kaydetmeniz, otomatikleştirmeyi kaldırmanız ve genişliği daha önce kaydettiğiniz değere ayarlamanızdır.


1
Benzer kodu AutoResizeColumnWidthsYetAllowUserResizing adlı bir rutine koydum. Başlangıçta ızgara doldurulduktan sonra ve ayrıca kullanıcı verileri düzenledikten sonra (yani ızgaranın CellEndEdit olayından) çağrılır.
DeveloperDan

5
Bu harika bir kod. 'DataGridView1_DataSourceChanged' olayına yerleştirilmesi gerekiyor.
user890332

1
Bana öyle geliyor ki, bunu grd.Columns(i).Width = grd.Columns(i).Widthyapmak zaten işe yarayacak. Buraya bakın .
Antonio

2
c # benzer ancak köşeli parantezler için dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
barlop

Bu çok geç gelmiş olabilir, ancak herhangi bir şekilde, belirli bir satırın içeriğine göre yeniden boyutlandırabilir miyiz? Diyelim ki, diğer satırlardaki hücrelerin genişliğine bakılmaksızın, Birinci Sıradaki hücrelerin içeriğine göre?
Murtuza Husain

45

Belki arayabilirsin

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);

Veri kaynağını ayarladıktan sonra. Genişliği ayarlayacak ve yeniden boyutlandırmaya izin verecektir.

MSDN DataGridView.AutoResizeColumns Yöntemi (DataGridViewAutoSizeColumnsMode) hakkında daha fazla bilgi .


2
Bu yanıtın neden daha fazla dikkat çekmediğinden emin değilim. Çok daha temiz. Hücre içeriği genişliğini eşleştirmek istiyorsanız DataGridViewAutoSizeColumnsMode.AllCells biraz daha iyi çalışır.
iwalkbarefoot

31
bu çözümü kullanarak bir sonraki hatayı alıyorum: "Parametre autoSizeColumnMode bu işlem için geçerli değil. NotSet, None veya Fill olamaz, ancak bir boyutlandırma kriteri belirtmesi gerekiyor." . Bu dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill'i
itsho

6
DataGridViewAutoSizeColumnMode.Fill kullanılması, sütunları boyutlandırırken hücre içeriğini yok saydığı için çalışmaz.
Stuart Helwig

Bu yöntemi ile kullandım DataGridViewAutoSizeColumnsMode.DisplayedCells. Ek olarak, Form Tasarımcısında, AutoSizeColumnsMode öğesi Yok olarak ayarlanmıştır. Her zaman (yeniden) boyutlarının düzgün olduğundan emin olmak için DataGridView'in DataBindingComplete olay işleyicisinde bu yöntem çağrısını yürütmem gerekiyordu.
Daan

7
Tüm ek oyları anlamıyorum ... Bu hiç çalışmıyor, MSDN dokümantasyonu açık, bunu yapmak autoSizeColumnsMode None veya Fill değerine sahipse bir ArgumentException oluşmasına neden oluyor.
Larry

31

Miroslav Zadravec kodunun AC # sürümü

for (int i = 0; i < dataGridView1.Columns.Count-1; i++)
{
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    int colw = dataGridView1.Columns[i].Width;
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dataGridView1.Columns[i].Width = colw;
}

Başkalarının itibarını bozmamak için Topluluk Wiki olarak yayınlandı


15

Uygulamamda belirledim

grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

Ayrıca,

grid.AllowUserToOrderColumns = true;
grid.AllowUserToResizeColumns = true;

Artık sütun genişlikleri değiştirilebilir ve sütunlar kullanıcı tarafından yeniden düzenlenebilir. Bu benim için oldukça iyi çalışıyor.

Belki bu senin için işe yarar.


Izgaranın AutoSizeColumnsMode ayarını "Fill" olarak ayarlamak, tüm sütunları aynı genişliklere ayarlıyor gibi görünüyor. Evet, sütunlar daha sonra yeniden boyutlandırılabilir, ancak başlangıç ​​genişlikleri yanlıştır. Sütun genişliklerini kodda "elle" ayarlamam gerekebilir.
Stuart Helwig

DV- grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumn-> s <- Mode.Fill; (s'yi kaçırdınız, ColumsMode sol taraf ve sağ taraftadır, böylece satırınız derlenmez) Datagridview'u otomatik boyutlandırmak için kod, olduğu gibi çok can sıkıcıdır, bu yüzden en azından önce cevabınızı kontrol edin . Bu yazdığın ilk satır ve yanlış.
barlop

@barlop cevabınız için teşekkürler. Soruları ve cevapları düzenleme ayrıcalığına sahipsiniz. Kodumda bir hata görürseniz, düzenlemekten çekinmeyin.
Jehof

12

Verileri ızgaraya ekledikten sonra, sütunu her bir hücredeki verilerin uzunluğuna göre ayarlayacak aşağıdaki kodu ekleyin.

dataGrid1.AutoResizeColumns();            
dataGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

İşte Sonuç

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


9

Bunu şöyle yaptım:

dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgvReport.AutoResizeColumns();
dgvReport.AllowUserToResizeColumns = true;
dgvReport.AllowUserToOrderColumns = true;

bu belirli sırayla. Sütunlar yeniden boyutlandırılır (genişletilir) VE daha sonra kullanıcı sütunları yeniden boyutlandırabilir.


6

Soruyu doğru anladıysam, ihtiyacınız olanı başarmanın daha kolay bir yolu olmalı. Aramak dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

Bu hile yapmalı. Ancak, DataGridView denetiminizi doldurduktan sonra bu yöntemi doğrudan arayamayacağınız için bir tuzak vardır. Bunun yerine, VisibleChanged olayı için bir EventHandler eklemeniz ve oradaki yöntemi çağırmanız gerekir.


1
Bu, sütunları içeriğe göre yeniden boyutlandırır, ancak mevcut tüm ızgara alanının kullanılmasını sağlamaz. Yani, varsa kalan alanı "doldurmaz".
Stuart Helwig

5

İki satırlık basit bir kod benim için çalışıyor.

dataGridView.DataSource = dataTable;
dataGridView.AutoResizeColumns();

4

Sorunun özgeçmişi:
Sütun genişliğini içeriğe uyarlayın (sütun boyunca farklı yöntemlerle),
ancak daha sonra kullanıcının sütun genişliğini ayarlamasına izin verin ...

Dan Gelişmekte Miroslav Zadravec cevabı hemen bilgisayarlı otomatik kullanıyordum çalıştı bana ne, column.Widthsete ... column.Width!

foreach (DataGridViewColumn column in dataGridView.Columns)
{
    if (/*It's not your special column*/)
    {
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
        column.Width = column.Width; //This is important, otherwise the following line will nullify your previous command
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
    }
}

//Now do the same using Fill instead of AllCells for your special column

Bu, çalıştığı zaman test edilir. DataGridView zaten yaratılır gibi bir hile kullanarak, bu .


Kodunuz gibi foreach kullanmayı tercih ederim. Döngünün tepesinde matematik olmadığında daha okunaklı hale getirir. Ben bu şekilde yaptım ve "column.Width = column.Width;" ilginç.
Greg Barth

4

Bu benim için harikalar yarattı:

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

1
Basit çözüm!
Mark Kram

1
Benim için dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
işe

3

Bu, tüm sütunları içeriklerine göre otomatik olarak sığdırır, belirli bir sütunu uzatarak kalan boş alanı doldurur ve son sütunu gelecekteki herhangi bir yeniden boyutlandırma için dolduracak şekilde ayarlayarak 'atlama' davranışını önler.

// autosize all columns according to their content
dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
// make column 1 (or whatever) fill the empty space
dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
// remove column 1 autosizing to prevent 'jumping' behaviour
dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
// let the last column fill the empty space when the grid or any column is resized (more natural/expected behaviour) 
dgv.Columns.GetLastColumn(DataGridViewElementStates.None, DataGridViewElementStates.None).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Bunun eski bir cevap olduğunu biliyorum, ama sütunların sayısı önceden bilinmese bile güzelce çalışıyorum.
Nilo Paim

2

Miroslav Zadravec kodundan, tüm sütunların otomatik olarak boyutlandırılacağını varsayarak biraz daha düzgün C # kodu

for (int i = 0; i < dgvProblems.Columns.Count; i++)
{
    dgvProblems.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    int colw = dgvProblems.Columns[i].Width;
    dgvProblems.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dgvProblems.Columns[i].Width = colw;
}

2

Miroslav Zadravec kodunun başka bir versiyonu, ancak biraz daha otomatik ve evrensel:

    public Form1()
    {
        InitializeComponent();
        dataGridView1.DataSource = source;
        for (int i = 0; i < dataGridView1.Columns.Count - 1; i++) {
            dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
        }
        dataGridView1.Columns[dataGridView1.Columns.Count].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

    }

    void Form1Shown(object sender, EventArgs e)
    {
        for ( int i = 0; i < dataGridView1.Columns.Count; i++ )
        {
            int colw = dataGridView1.Columns[i].Width;
            dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
            dataGridView1.Columns[i].Width = colw;
        }
    }

İkinci kısmı ayrı bir olaya koydum, çünkü datagridvewformun ilklendirmesini dolduruyorum ve her iki kısım da varsa, hiçbir şey değişmiyor, çünkü muhtemelen otomatik boyut datagridviewgörüntülendikten sonra genişlikleri hesaplıyor , bu nedenle genişlikler Form1()yöntemde hala varsayılan . Bu yöntemi bitirdikten sonra, otomatik boyutlandırma işini yapar ve bundan hemen sonra (form gösterildiğinde) genişlikleri kodun ikinci kısmına göre ayarlayabiliriz (burada Form1Shownolayda). Bu benim için bir cazibe gibi çalışıyor.


2

Miroslav Zadravec'in c # cevabının basitleştirilmiş bir kodu:

CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader;
for (int i = 0; i < dataGridView1.Columns.Count; i++) dataGridView1.Columns[i].Width = dataGridView1.Columns[i].Width;
CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

1

FillWeightMülkünüzü kurmaya çalıştınız mı?DataGridViewColumnsNesnenizin çalıştınız mı?

Örneğin:

this.grid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
this.grid1.Columns[0].FillWeight = 1.5;

Bence senin durumunda çalışmalı.


1

Schnapple versiyonundan küçük bir gelişme

int nLastColumn = dgv.Columns.Count - 1;
for (int i = 0; i < dgv.Columns.Count; i++)
{
    if (nLastColumn == i)
    {
        dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }
    else
    {
        dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }
}

for (int i = 0; i < dgv.Columns.Count; i++)
{
    int colw = dgv.Columns[i].Width;
    dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dgv.Columns[i].Width = colw;
}


1

Sütun genişlikleri içeriğine uyacak şekilde ayarlandı. Aşağıdaki ifadeyi kullandım, Sorunumu çözdü.

İlk adım :

RadGridViewName.AutoSize = true;

İkinci adım :

// This mode  fit in the header text and column data for all visible rows. 
this.grdSpec.MasterTemplate.BestFitColumns();

Üçüncü adım :

for (int i = 0; i < grdSpec.Columns.Count; i++) 
{
    // The column width adjusts to fit the contents all cells in the control.
    grdSpec.Columns[i].AutoSizeMode = BestFitColumnMode.AllCells; 
}

1
foreach (DataGridViewColumn c in dataGridView.Columns)
    c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);

Bu, dataGridViewgörüntülenmiş olsa da olmasa da çalışmalıdır (yani, sınıf yapıcısından çağrılsa bile).

Aynı yöntem, ancak ile DataGridViewAutoSizeColumnMode.DisplayedCells, yukarıdaki durumda bariz bir nedenden ötürü başarısız olur - henüz hiçbir hücre görüntülenmedi! Belli olmayan bazı nedenlerden dolayı, AutoResizeColumnsbu durumda da başarısız olur.


0

Örneğin, veri kaynağınızı bir veriye bağlarsanız, bağlama tamamlandıktan sonra özellikleri ayarlamanız gerekir:

        private void dgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
            dgv.AutoResizeColumns();
            dgv.AllowUserToResizeColumns = true;
        }

0
  • Yukarıdaki çözüm için teşekkürler (Tekrarlamak DataGridView.Columns, AutoSizeModegeçerli bir değerle değiştirmek , genişlik değerini toplamak ve değiştirdikten sonra tekrar ayarlamak AutoSizeModeiçinDataGridViewAutoSizeColumnMode.None ).
  • Bununla mücadele ettim ve sınıf kurucusundan veya önceki Form.Show()veya önceki herhangi bir satırdan çağrıldığında işe yaramayacağını fark ettim Form.ShowDialog(). Bu yüzden bu kod parçacığını Form.Shownetkinliğe koydum ve bu benim için çalışıyor.
  • Dönüştürülen kodum, önceden DataGridView.AutoSizeColumnsModeayarlanmış ne olursa olsun , genişlik değerini hemen DataGridViewColumn.GetPreferredWidth()değiştirmek DataGridViewColumn.AutoSizeModeve ayarlamak yerine kullanıyorum , sonra bir DataGridView.AutoSizeColumnsModekez değiştiriyorum :

    private void form_Shown(object sender, EventArgs e)
    {
            foreach (DataGridViewColumn c in dataGridView.Columns)
                c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.DisplayedCells, true);
            dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    }
  • Ayarladığınızdan emin olun

            dataGridView.AllowUserToResizeColumns = true;
  • Bu nasıl olur bilmiyorum ancak form gösterildikten sonra çalışıyor.


0

Bunu VB'de yapmak zorunda kaldım ve onu bir Modüle yerleştirdiğim bir yönteme bölmeyi tercih ettim. İsterseniz, Dolgu sütununu başka bir ByRef parametresi olarak ekleyebilirsiniz.

''' <summary>
''' Makes all columns in a DataGridView autosize based on displayed cells,
''' while leaving the column widths user-adjustable.
''' </summary>
''' <param name="dgv">A DataGridView to adjust</param>
Friend Sub MakeAdjustableAutoSizedGridCols(ByRef dgv As DataGridView)
    Dim width As Integer

    For Each col As DataGridViewColumn In dgv.Columns
        col.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
        width = col.Width
        col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None
        col.Width = width
    Next
    dgv.AllowUserToResizeColumns = True
End Sub

0

Bunun gibi bir şey yapabilirsiniz:

   grd.DataSource = getDataSource();

    if (grd.ColumnCount > 1)
    {
        for (int i = 0; i < grd.ColumnCount-1; i++)
            grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

        grd.Columns[grd.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }

    if (grd.ColumnCount==1)
        grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Sonuncusu ızgarayı doldurması dışında tüm sütunlar içeriğe uyarlanacaktır.


0

$ Dizi bir PSCustomObject öğesinin içeriği olduğunda, bu çalışır:

$dataGridView1.DataSource=[collections.arraylist]($array)
$dataGridView1.Columns | Foreach-Object{$_.AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::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.