WPF DataGrid水平滚动条没有显示

时间:2011-05-12 09:08:22

标签: c# wpf .net-4.0 scroll

我创建了4列的简单DataGrid,它超出了DataGrid的范围,并且没有显示水平滚动条。我尝试将宽度设置为每列,但没有任何改变。这是我的XAML:

<Window x:Class="WPFTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <DataGrid Height="200" Width="200" HorizontalScrollBarVisibility="Visible">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Column 1" />
                <DataGridTextColumn Header="Column 2" />
                <DataGridTextColumn Header="Column 3" />
                <DataGridTextColumn Header="Column 4" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

这就是我得到的:

enter image description here

我也尝试用ScrollViewer包装DataGrid。没有。如何显示滚动条?

8 个答案:

答案 0 :(得分:19)

我也非常不喜欢这种行为,因为我使用了标头过滤器。我的“hack”比上面容易得多:只需将数据网格放在一个带有ScrollViewerHorizontalScrollBarVisibility=Auto的新VerticalScrollBarVisibility=Disabled内(DataGrid已经处理好了)。像这样:

<ScrollViewer HorizontalScrollBarVisibility="Auto"
              VerticalScrollBarVisibility="Disabled">
    <DataGrid>
        ...
    </DataGrid>
</ScrollViewer>

当然,这是对页面的更多控制,但比上面的hacky代码容易得多。到目前为止,我还没有找到一种方法让数据网格自动执行此操作。

此解决方案的副作用可能是隐藏垂直滚动条,直到您向右滚动。

答案 1 :(得分:4)

这对我来说实际上是一个主要问题,因为我创建了许多列并允许用户通过在标题中包含过滤器控件来进行过滤。

当用户向右滚动并在列中放置过滤器并且由于这些条件而返回NO行时,整个网格将向左移动(所有列到默认左侧位置)并且水平滚动条将消失所以用户无法滚动到过滤列以撤消他/她的动作!!

主要的痛苦!

我刚刚放入代码中的'hack'是一种解决方法:( _dv从DataTable指向DataView)

// construct an overall sql filter statement
string sqlFilter = _setttings.SGColumns.GetFilterSQL();

BindingListCollectionView view = CollectionViewSource.GetDefaultView(gridMain.ItemsSource) as BindingListCollectionView;

if (view != null)
    view.CustomFilter = sqlFilter;      // "XGROUP = 'E' AND GEOG = 'U'";

if (view != null && _dv.Count == 0)
{
    gridMain.ItemsSource = null;
    gridMain.Items.Add("hello");
    _RowHeightTemp = gridMain.RowHeight;
    gridMain.RowHeight = 0;
}
else
{
    if (gridMain.Items.Count == 1 && gridMain.Items[0].ToString() == "hello")
    {
        gridMain.Items.Clear();
        gridMain.ItemsSource = _dv;
        view = CollectionViewSource.GetDefaultView(gridMain.ItemsSource) as BindingListCollectionView;
        view.CustomFilter = sqlFilter;
        gridMain.RowHeight = _RowHeightTemp;
    }
}

现在可确保在显示无行时网格保持在其准确位置!

答案 2 :(得分:3)

我认为当Datagrid为空时,ScrollViewer无法处理任何事情。尝试通过添加ItemsSource来填充列,因此应该显示滚动:)

答案 3 :(得分:2)

只要向网格添加一些数据,滚动就会自动生效。要测试,您可以应用此代码

将网格命名为“grid”

附加了Window Loaded事件

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        grid.Items.Add(new object());
    }

您将看到滚动显示。

答案 4 :(得分:1)

虽然这个问题很老,但我认为它可能对某人有所帮助。基于劳伦的回答:

<ScrollViewer VerticalScrollBarVisibility="Disabled">
    <DataGrid x:Name="ScrollDataGrid"
        HorizontalScrollBarVisibility="Auto"
        VerticalScrollBarVisibility="Auto" ... >
    </DataGrid>
    <ScrollViewer.Style>
        <Style BasedOn="{StaticResource {x:Type ScrollViewer}}" TargetType="ScrollViewer">
            <Setter Property="HorizontalScrollBarVisibility" Value="Disabled" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=ScrollDataGrid, Path=Items.Count}" Value="0">
                    <Setter Property="HorizontalScrollBarVisibility" Value="Auto" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ScrollViewer.Style>
</ScrollViewer>

如果 DataGrid 有记录,ScrollViewer 不会显示滚动条,而是使用 DataGrid 的滚动条。

答案 5 :(得分:0)

Datagrid的属性设置为CanUserAddRows="True" IsReadOnly="True",并使用ScrollViewer对其进行包装。 CanUserAddRows给您空行。空行保留滚动条。 IsReadOnly隐藏空行,因为它是只读的。

缺点是,当垂直滚动时,数据网格标题将被隐藏。

答案 6 :(得分:0)

显然,您需要水平滚动条。

需要做两件事:

1。将属性IsReadOnly="True"添加到您的DataGrid

2。将MaxWidth="1200" VerticalScrollBarVisibility="Auto"添加到您的ScrollViewer

需要设置MaxWidth,您可以根据需要将1200更改为任何其他值。

<ScrollViewer MaxWidth="1200" VerticalScrollBarVisibility="Auto">
    <DataGrid IsReadOnly="True">

    </DataGrid>
</ScrollViewer>

答案 7 :(得分:0)

这对我有用

<ScrollViewer  ScrollViewer.HorizontalScrollBarVisibility="Auto"  Width="auto">
    <DataGrid></DataGrid>
</ScrollViewer>