Bagaimana cara membuat XAML DataGridColumns mengisi seluruh DataGrid?


117

Saya menggunakan DataGrids di XAML (bukan Silverlight) dengan kolom yang dapat diubah ukurannya, DataGrid akan meluas jika pengguna mengubah ukuran layar.

Saat ini jika lebar semua kolom datagrid kurang dari lebar datagrid saya mendapatkan tambahan "kolom" muncul yang tidak dapat diklik dan tidak ada gunanya.

Adakah yang tahu bagaimana membuat satu kolom selalu berubah ukuran untuk mengisi semua ruang yang tersisa?

Jawaban:


248

Jika menggunakan Width="*"kolom akan mengisi untuk memperluas ruang yang tersedia.

Jika Anda ingin semua kolom membagi kisi secara merata, terapkan ini ke semua kolom. Jika Anda hanya ingin satu untuk mengisi ruang yang tersisa, terapkan saja ke kolom itu dengan sisanya menjadi "Otomatis" atau lebar tertentu.

Anda juga dapat menggunakan Width="0.25*"(misalnya) jika Anda ingin kolom mengambil 1/4 dari lebar yang tersedia.


2
dan bagaimana melakukan hal serupa jika saya menggunakan AutoGenerateColumns="True"?
javapowered

1
@javapowered - Sebaiknya ajukan pertanyaan Anda sendiri, dengan merujuk pertanyaan ini.
ChrisF

16
@javapowered<DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />
Xavier

11
@MohamedSakherSawan memang berfungsi untuk datagrid. Baik ColumnWidth="*"pada DataGrid dan Width="*"pada kolom individu memiliki efek yang diinginkan
Steve

1
Memberikan Error Sting tidak dapat dikonversi ke '*'
co2f2e

18

Pastikan datagrid Anda telah Widthdiatur ke sesuatu seperti {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

Seperti itu, pengaturan Width="*"atribut Anda pada DataGrid.Columns/DataGridXXXXColumnelemen harus berfungsi.


9

Seperti disebutkan, ini ColumnWidth="*"bekerja dengan sangat baik untuk datagrid di XAML.

Saya menggunakannya dalam konteks ini:

<DataGrid ColumnWidth="*" ItemsSource="{Binding AllFolders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />


3

2 Cent saya ->

Sangat terlambat ke pesta

DataGrid -> Kolom -> Lebar = "*" hanya berfungsi jika penampung induk DataGrid memiliki lebar tetap.

contoh: saya meletakkan DataGrid di Grid -> Kolom yang lebarnya = "Otomatis" lalu Lebar = "*" di DataGrid tidak berfungsi tetapi jika Anda mengatur Grid -> Lebar Kolom = "450" ​​berarti tetap maka berfungsi dengan baik


2

Putaran lain pada tema yang sama:

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    dataGrid.Width = e.NewSize.Width - (e.NewSize.Width * .1);

    foreach (var column in dataGrid.Columns)
    {
       column.Width = dataGrid.Width / dataGrid.Columns.Count;
    }
 }

1

Saya menambahkan HorizontalAlignment = "Center" (Default-nya adalah "Strech") dan itu memecahkan masalah saya karena itu membuat datagrid hanya selebar yang dibutuhkan. (Menghapus pengaturan Lebar datagrid jika Anda memilikinya.)

masukkan deskripsi gambar di sini


Dikombinasikan dengan jawaban yang dipilih dan yang ini memecahkan masalah bagi saya. Saya perlu menghapus lebar di Datagrid itu sendiri. Terima kasih.
Bryan Harrington

0

Ini tidak akan memperluas kolom terakhir dari kisi xaml untuk mengambil ruang yang tersisa jika AutoGeneratedColumns="True".


Saya telah menghapus AutoGenerateColumns, meskipun kolom tidak dibagi atau direntangkan di seluruh lebar kisi data / layar. Saya memiliki baris grid yang sesuai menjadi "*" dan lebar kolom tidak memiliki lebar yang ditentukan (baik "otomatis" atau "nilai tertentu"). Tapi saya masih mengalami masalah, berikut adalah kode xaml dari desain saya pastie.org/10085815
GK

0

setel lebar SATU kolom ke nilai apa pun, yaitu lebar = "*"


0

Bagi mereka yang mencari solusi C #:

Jika Anda memerlukan alasan tertentu untuk mengaktifkan "AutoGeneratedColumns", satu hal yang dapat Anda lakukan adalah menentukan lebar semua kolom kecuali yang ingin Anda ubah ukurannya secara otomatis (tidak akan mengambil ruang yang tersisa , tetapi akan mengubah ukurannya ke konten sel ).

Contoh (dgShopppingCart adalah DataGrid saya):

dgShoppingCart.Columns[0].Visibility = Visibility.Hidden; 
dgShoppingCart.Columns[1].Header = "Qty";
dgShoppingCart.Columns[1].Width = 100;
dgShoppingCart.Columns[2].Header = "Product Name"; /*This will be resized to cell content*/
dgShoppingCart.Columns[3].Header = "Price";
dgShoppingCart.Columns[3].Width = 100;
dgShoppingCart.Columns[4].Visibility = Visibility.Hidden; 

Bagi saya ini berfungsi sebagai solusi karena saya perlu mengubah ukuran DataGrid ketika pengguna memaksimalkan Window.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.