【问题标题】:Increase columns width in Silverlight DataGrid to fill whole DG width增加 Silverlight DataGrid 中的列宽以填充整个 DG 宽度
【发布时间】:2010-10-28 01:21:02
【问题描述】:

我有一个绑定到 SQL 表的 DataGrid 控件。

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>

是否可以增加单个列的大小来填充数据网格的完整宽度?

谢谢,
亨里克

编辑: Silverlight SDK 4 提供了以“*”为宽度的列。

【问题讨论】:

标签: c# silverlight datagrid width


【解决方案1】:

解决方案:

    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));
            }
        }
    }

【讨论】:

  • 仅供参考,图片链接已损坏
【解决方案2】:

仅在 WPF 中测试,未在 Silverlight 中测试:

我在 WPF 3.5 SP1 中进行了设置,它运行良好,对 Silverlight 没有任何保证,但如果它运行起来确实很迷人。

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

【讨论】:

  • 太棒了!在 WPF 中工作,不确定 Silverlight
  • 不过,这有一个讨厌的错误 - 如果您有这样的列并且在 RowDetails 中有右对齐的内容,则当网格宽度减小时它不会向左移动。
  • 对,这个sux,我也经历过。
【解决方案3】:

我为 DataGrid 创建了一个 attached property,让您可以在 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>

【讨论】:

    【解决方案4】:

    以 Henrik P 的回答为基础,此解决方案使用 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);
            }
        }
    

    我喜欢 Henrik 的回答,但需要两列来填充额外的空间,比如网格。

    【讨论】:

      【解决方案5】:

      在 silverlight 4 中:只需在 DataGrid 上设置 ColumnWidth="*"

      <data:DataGrid ColumnWidth="*" />
      

      【讨论】:

      • 我用一个简单的 DataGrid 尝试过(我试图让最后一列占据可用空间),但我遇到了this 问题,有什么建议吗?
      【解决方案6】:

      您可以通过编程方式设置它:

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

      【讨论】:

        猜你喜欢
        • 2021-12-18
        • 2020-07-31
        • 2022-01-26
        • 1970-01-01
        • 2017-04-13
        • 2012-07-29
        • 2020-03-12
        • 1970-01-01
        • 2015-11-29
        相关资源
        最近更新 更多