Aumentar las columnas anchura en Silverlight DataGrid para llenar toda la anchura DG
-
23-08-2019 - |
Pregunta
I tiene un control DataGrid que está unido a una tabla de SQL.
El código XAML es:
<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>
¿Es posible aumentar el tamaño de las columnas individuales para llenar el ancho completo de la cuadrícula de datos?
Gracias,
Henrik
Editar: Columnas con "*" como anchura están llegando con el SDK de Silverlight 4.
Solución
Solución:
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));
}
}
}
Resultados:
Otros consejos
Probado sólo en WPF, Silverlight no en:
I fijó en WPF 3.5 SP1 y funciona perfecto, no hay garantías sobre Silverlight, pero si funciona Es de hecho encantador.
<data:DataGridTextColumn Header="Time" Binding="{Binding}" Width="*" />
He creado una adjunto para la cuadrícula de datos que le permite hacer esto en XAML:
<UserControl
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
x:Class="GridProperties.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:gp="clr-namespace:GridProperties">
<Grid x:Name="LayoutRoot" Background="White">
<data:DataGrid gp:GridEx.StarColumn="2">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Column 1"/>
<data:DataGridTextColumn Header="Column 2"/>
<data:DataGridTextColumn Header="Column 3"/>
</data:DataGrid.Columns>
</data:DataGrid>
</Grid>
</UserControl>
Sobre la base de la respuesta de Henrik P, esta solución sólo se endereza el error con Width='*'
de manera que se puede establecer cualquier columna para ser proporcional como se hace en una cuadrícula:
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);
}
}
Me gustó la respuesta de Henrik pero necesitaba dos columnas para llenar el espacio extra, como una cuadrícula.
En silverlight 4: Basta con establecer ColumnWidth = "*" en la cuadrícula de datos
<data:DataGrid ColumnWidth="*" />
Se puede establecer mediante programación:
var col = new DataGridTextColumn();
col.Width = new DataGridLength(100, DataGridLengthUnitType.Star);
Grid1.Columns.Add(col);