web-dev-qa-db-ja.com

WPFDataGridの水平スクロールバーが表示されない

DataGridの境界外にある4つの列を持つ単純な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

DataGridをScrollViewerでラップすることも試みました。何もありません。スクロールバーを表示するにはどうすればよいですか?

18
Vale

Datagridが空の場合、ScrollViewerは何も処理しないと思います。 ItemsSourceを追加して列を埋めてみてください。したがって、スクロールが表示されます:)

3
Damascus

また、ヘッダーフィルターを使用しているため、この動作は非常に嫌いです。私の「ハック」は上記よりもはるかに簡単です。データグリッドを新しいScrollViewer内にHorizontalScrollBarVisibility=AutoVerticalScrollBarVisibility=Disabledを付けて配置するだけです(DataGridはすでにそれをうまく処理しています)。そのようです:

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

確かに、それはページ上のより多くのコントロールですが、上記のハッキーなコードよりもはるかに簡単です。これまでのところ、データグリッドにこれを自動的に実行させる方法は見つかりませんでした。

このソリューションの副作用は、右にスクロールするまで垂直スクロールバーが非表示になることです。

19
lauren

私は多くの列を作成していて、ヘッダーにフィルターコントロールを含めることでユーザーがフィルター処理できるようにしているため、これは実際には私にとって大きな問題でした。

ユーザーが右にスクロールして列にフィルターを配置し、これらの基準のために行が返されない場合、グリッド全体が左に移動し(すべての列がデフォルトの左位置に)、水平スクロールバーが消えてユーザーが表示されますフィルタ列までスクロールしてアクションを元に戻すことはできません!!

大きな痛み!

私がコードに配置した「ハック」はそれを回避する方法です:(DataTableからDataViewを指す_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;
    }
}

これにより、行が表示されていないときにグリッドが正確な位置にとどまることが保証されます。

4
Marcel

グリッドにデータを追加するとすぐに、スクロールが自動的に機能します。テストするには、このコードを適用できます

グリッドに「grid」という名前を付けます

WindowLoadedイベントを添付しました

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

スクロールが表示されます。

2

DatagridのプロパティをCanUserAddRows="True" IsReadOnly="True"として設定し、ScrollViewerでラップします。 CanUserAddRowsは空の行を表示します。空の行はスクロールバーを保持します。 IsReadOnlyは読み取り専用であるため、空の行を非表示にします。

欠点は、垂直方向にスクロールすると、データグリッドヘッダーが非表示になることです。

0
Jones

明らかに、水平スクロールバーが必要です。

2つのことをする必要があります:

1。プロパティIsReadOnly="True"をDataGridに追加します

2。MaxWidth="1200" VerticalScrollBarVisibility="Auto"ScrollViewerに追加します

MaxWidthを設定する必要があります。必要に応じて、1200を他の値に変更できます。

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

    </DataGrid>
</ScrollViewer>
0
Bravo Yeung