colonnes augmenter la largeur de grille de données Silverlight pour remplir toute la largeur DG

StackOverflow https://stackoverflow.com/questions/894991

Question

J'ai un contrôle DataGrid qui est lié à une table SQL.

Le code XAML est:

<data:DataGrid x:Name="dg_sql_data" 
                       Grid.Row="1" 
                       Visibility="Collapsed" 
                       Height="auto" 
                       Margin="0,5,5,5"
                       AutoGenerateColumns="false"
                       AlternatingRowBackground="Aqua"
                       Opacity="80"
                       >
    <data:DataGrid.Columns>
        <data:DataGridTextColumn Header="Latitude" Binding="{Binding lat}" />
        <data:DataGridTextColumn Header="Longitude" Binding="{Binding long}" />
        <data:DataGridTextColumn Header="Time" Binding="{Binding time}" />
    </data:DataGrid.Columns>
</data:DataGrid>

Est-il possible d'augmenter les colonnes simples tailles pour remplir toute la largeur de la grille de données?

Merci,
Henrik

Edit: Les colonnes avec "*" comme largeur viennent avec le SDK Silverlight 4.

Était-ce utile?

La solution

Solution:

    void dg_sql_data_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        DataGrid myDataGrid = (DataGrid)sender;
        // Do not change column size if Visibility State Changed
        if (myDataGrid.RenderSize.Width != 0)
        {
            double all_columns_sizes = 0.0;
            foreach (DataGridColumn dg_c in myDataGrid.Columns)
            {
                all_columns_sizes += dg_c.ActualWidth;
            }
            // Space available to fill ( -18 Standard vScrollbar)
            double space_available = (myDataGrid.RenderSize.Width - 18) - all_columns_sizes;
            foreach (DataGridColumn dg_c in myDataGrid.Columns)
            {
                dg_c.Width = new DataGridLength(dg_c.ActualWidth + (space_available / myDataGrid.Columns.Count));
            }
        }
    }

Résultat:

text alt

Autres conseils

Testé uniquement dans WPF, pas Silverlight:

Je mis en place dans WPF 3.5 SP1 et il fonctionne parfaitement, à propos de Silverlight aucune garantie, mais si cela fonctionne en effet c'est charmant.

<data:DataGridTextColumn Header="Time" Binding="{Binding}" Width="*" />

Miser sur la réponse de Henrik P, cette solution tout simplement le redresse bug avec Width='*' de sorte que vous pouvez définir une colonne proportionnelle comme vous pouvez sur une grille:

    private void DgSQLDataSizeChanged(object sender, SizeChangedEventArgs e)
    {
        var myDataGrid = (DataGrid)sender;

        // Do not change column size if Visibility State Changed
        if (myDataGrid.RenderSize.Width == 0) return;

        double totalActualWidthOfNonStarColumns = myDataGrid.Columns.Sum(
            c => c.Width.IsStar ? 0 : c.ActualWidth);

        double totalDesiredWidthOfStarColumns = 
            myDataGrid.Columns.Sum(c => c.Width.IsStar ? c.Width.Value : 0);

        if ( totalDesiredWidthOfStarColumns == 0 ) 
            return;  // No star columns

        // Space available to fill ( -18 Standard vScrollbar)
        double spaceAvailable = (myDataGrid.RenderSize.Width - 18) - totalActualWidthOfNonStarColumns;

        double inIncrementsOf = spaceAvailable/totalDesiredWidthOfStarColumns;

        foreach (var column in myDataGrid.Columns)
        {
            if ( !column.Width.IsStar ) continue;

            var width = inIncrementsOf * column.Width.Value;
            column.Width = new DataGridLength(width, DataGridLengthUnitType.Star);
        }
    }

J'ai aimé la réponse de Henrik, mais besoin de deux colonnes pour remplir l'espace supplémentaire, comme une grille.

Dans silverlight 4: il suffit de définir ColumnWidth = "*" sur le DataGrid

<data:DataGrid ColumnWidth="*" />

Vous pouvez définir par programmation:

var col = new DataGridTextColumn();
col.Width = new DataGridLength(100, DataGridLengthUnitType.Star);                        
Grid1.Columns.Add(col);
scroll top