2011-05-12 248 views
15

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

<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。没有。我怎样才能让滚动条出现?

+0

您是否尝试将'CanContentScroll'设置为'true'?另外,我认为当'Datagrid'为空时,'ScrollViewer'不处理任何东西。你可以尝试填充列,看看滚动是否出现? – Damascus 2011-05-12 09:16:50

+0

是的,一旦在DataGrid中有内容,滚动就会出现,这是DataGrid的默认行为。我不知道如何覆盖这个即即使没有数据,如何显示滚动 – 2011-05-12 09:25:48

+0

@Damascus你是对的。当我设置ItemsSource滚动工程。谢谢。请将您的评论发布为答案,以便我可以接受。 – Vale 2011-05-12 09:26:32

回答

5

我认为当Datagrid为空时,ScrollViewer不处理任何东西。尝试通过添加一个ItemsSource来填充列,滚动应该因此出现:)

2

只要向网格添加一些数据,滚动就会自动运行。为了测试,你可以使用这个代码

名称网格为“电网”

附加的窗口已加载事件

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

你会看到显示的滚动。

+2

哎呀im迟了;) – 2011-05-12 09:31:58

4

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

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

重大疼痛!

的“黑客”我刚才放在代码是变通的办法:(该_dv指着从数据表中的数据视图)

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

现在,这确保了电网停留在它的确切位置当没有行显示!

15

我也非常不喜欢这种行为,因为我使用标题过滤器。我的“黑客”比上面的要容易得多:只需将数据网格放入新的ScrollViewerHorizontalScrollBarVisibility=AutoVerticalScrollBarVisibility=Disabled(DataGrid已经可以处理那个罚款)。像这样:

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

当然,这是页面上的多个控件,但比上面的代码哈克轻松了许多。到目前为止,我还没有找到一种方法使数据网格自动执行此操作。

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

+3

警告 - 不要使用*作为datagrid列的宽度如果你想水平滚动条在列上可见调整大小 – 2014-03-20 07:43:35

+2

这会导致渲染dataGrid的性能问题 – Xilmiki 2014-10-20 08:38:47

+2

这个解决方案总是使用外部水平滚动即使列表中有项目,也是如此。这意味着滚动条的垂直滚动条不可见,这是不可行的。 – raznagul 2015-07-14 15:31:05