زيادة عرض الأعمدة في Silverlight DataGrid لملء عرض DG بالكامل
-
23-08-2019 - |
سؤال
لدي عنصر تحكم DataGrid مرتبط بجدول SQL.
رمز XAML هو:
<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>
هل من الممكن زيادة أحجام أعمدة واحدة لملء العرض الكامل ل DataGrid؟
شكرا،
هنريك
تحرير: أعمدة مع "*" كما يأتي العرض مع Silverlight SDK 4.
المحلول
المحلول:
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));
}
}
}
نتيجة:
نصائح أخرى
اختبار فقط في WPF، وليس في Silverlight:
أقيمت في WPF 3.5 المزود بحزمة الخدمة SP1 ويعمل بشكل مثالي، ولا ضمانات حول Silverlight، ولكن إذا كان يعمل بالفعل ساحر.
<data:DataGridTextColumn Header="Time" Binding="{Binding}" Width="*" />
لقد أنشأت الملكية المرفقة بالنسبة ل DataGrid الذي يتيح لك القيام بذلك في 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>
بناء على إجابة هنريك ف، هذا الحل ببساطة يتخلص من الخطأ Width='*'
بحيث يمكنك تعيين أي عمود لتكون متناسبا كما يمكنك على الشبكة:
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);
}
}
أحببت إجابة هنريك ولكنها بحاجة إلى عمودين لملء المساحة الإضافية، مثل الشبكة.
في Silverlight 4: ما عليك سوى تعيين ColumnWidth = "*" في DataGrid
<data:DataGrid ColumnWidth="*" />
يمكنك تعيينه برمجيا:
var col = new DataGridTextColumn();
col.Width = new DataGridLength(100, DataGridLengthUnitType.Star);
Grid1.Columns.Add(col);
لا تنتمي إلى StackOverflow