2011-05-12 27 views
15

He creado DataGrid simple con 4 columnas, que van más allá de los límites de DataGrid, y la barra de desplazamiento horizontal no se muestra. Intenté establecer el ancho de cada columna, pero no cambió nada. Aquí está mi XAML:WPF DataGrid barra de desplazamiento horizontal que no muestra

<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> 

Y aquí es lo que me pasa:

enter image description here

también he intentado envolver cuadrícula de datos con ScrollViewer. Nada. ¿Cómo puedo hacer que aparezca la barra de desplazamiento?

+0

¿Ha intentado establecer 'CanContentScroll' en' true'? Además, creo que cuando 'Datagrid' está vacío,' ScrollViewer' no maneja nada. ¿Puedes intentar llenar las columnas y ver si aparece el desplazamiento? – Damascus

+0

Sí, aparece el desplazamiento una vez que tiene contenido en DataGrid y este es el comportamiento predeterminado de DataGrid. No estoy seguro de cómo anular esto, es decircómo visualizar el desplazamiento incluso si no hay datos –

+0

@Damascus Tienes razón. Cuando configuro el desplazamiento de ItemsSource funciona. Gracias. Por favor, publique su comentario como respuesta, para que pueda aceptarlo. – Vale

Respuesta

5

creo que cuando el Datagrid está vacía, el ScrollViewer no controla nada. Intente completar las columnas agregando un ItemsSource, el desplazamiento debe aparecer :)

2

El desplazamiento funcionará automáticamente tan pronto como agregue algunos datos a la cuadrícula. Para probar que puede aplicar este código

Nombre de su red para "rejilla"

adjunta la ventana Cargado caso

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

Verá aparece el desplazamiento.

+2

Vaya tarde;) –

4

esto fue realmente un problema importante para mí ya que estoy creando muchas columnas y le permite al usuario filtrar teniendo controles de filtro en el encabezado.

Cuando el usuario se desplaza hacia la derecha y coloca un filtro en una columna y NO se devuelven filas debido a estos criterios, toda la cuadrícula se moverá hacia la izquierda (todas las columnas a la posición izquierda predeterminada) y la barra de desplazamiento horizontal ¡Desaparecer para que el usuario no pueda desplazarse a la columna de filtro para deshacer su acción!

Major pain!

El 'piratear' Yo sólo han colocado en el código es una manera de evitarlo: (el _dv apuntando a un DataView de un DataTable)

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

Esto ahora se asegura de que la red se mantiene en su posición exacta cuando las filas no se muestran!

15

También me disgusta este comportamiento, ya que uso filtros de encabezado. Mi "truco" es mucho más fácil que el de arriba: simplemente coloque la cuadrícula de datos dentro de un nuevo ScrollViewer con HorizontalScrollBarVisibility=Auto y VerticalScrollBarVisibility=Disabled (el DataGrid ya maneja esa fina). De este modo:

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

Claro, es más controles en la página, pero mucho más fácil que el código hacky anteriormente. Hasta ahora no he encontrado una manera de hacer que la cuadrícula de datos haga esto automáticamente.

El efecto secundario de esta solución puede ser la barra de desplazamiento vertical oculta hasta que se desplace hacia la derecha.

+3

advertencia: no utilizar * para el ancho de columna de la cuadrícula de datos si desea que la barra de desplazamiento horizontal sea visible en el cambio de tamaño de columna –

+2

esto causa un gran problema de rendimiento al representar dataGrid – Xilmiki

+2

Con esta solución, siempre utiliza el desplazamiento horizontal exterior barra incluso si hay elementos en la lista. Esto significa que la barra de desplazamiento vertical de las volutas se pierde de vista, lo cual no es realmente factible. – raznagul

Cuestiones relacionadas