locked
DataGridの幅と高さをブラウザのサイズに合わせてスクロールバーを出す方法 RRS feed

  • 質問

  • こんにちは。アべです。

    DataGridの幅と高さをブラウザのサイズに合わせてスクロールバーを出す方法はあるのでしょうか?

    当方、ブラウザの大きさに合わせる画面設計をして開発を進めています。

    画面は、
         ・ヘッダ
         ・ボディ
         ・フッタ
    があり、ヘッダとフッタの高さは固定です。
    また、画面全体をブラウザに合わせるべく、UserControlとLayoutRootの
    幅、高さを自動(Auto)にしております。


    その設定で、ボディに非常に大きな行・列を持つデータグリッドを貼ると
    スクロールは出ずに表示されます。

    データグリッドのプロパティ
       ・幅=自動、高さ=自動
       ・スクロールバーの表示=自動

    どうも
    1)データグリッドは、幅と高さを指定しないと小さくならないので、
    スクロールバーが出ないようです。
    幅と高さを指定するとブラウザサイズに合わせた見た目にならないので使えない。

    2)データグリッドの幅と高さをUserControlやLayoutRootと
    バインドしたが、親もサイズが自動(Auto)なので、データグリッドの
    サイズが自動(Auto)になってしまう。

    などの問題があり、うまくいっておりません。

    何か回避方法はあるのでしょうか?
    ご確認を宜しくお願い致します。

    環境
      ・Windows XP / Siliverlight 3.0 / Expression Blend3

    以上

    2009年12月5日 10:34

回答

  • 回答を有難うございます。

    何となく自己解決しました。

    StackPanelを使うとそうなるらしいです。

    nk9kさん、有難うございます。

    まず、適応な小さなアプリを作ってみると動きます。
    これを問題の出ているコードに近づけていったのですが、
    StackPanelを入れたら変な動きになりました。

    変とはスクロールバーが出ない。↓垂直スクロールバーが画面を小さくしても表示されないサンプルコードです。
    今は、StackPanelを使わずに実現する方向で調整しています。

    <navigation:Page 
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    	mc:Ignorable="d"
    	xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
    	xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    	x:Class="SilverlightApplication1.PageStacPanel" 
    	Title="PageStacPanel Page"
    	>
    	
    	<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}" >
    		<Grid.RowDefinitions>
    			<RowDefinition Height="80"/>
    			<RowDefinition />
    			<RowDefinition Height="80"/>
    		</Grid.RowDefinitions>
    		<StackPanel Margin="2" Grid.Row="1" Orientation="Vertical" d:LayoutOverrides="Height">
    			<data:DataGrid  Margin="0,0,0,0" AutoGenerateColumns="False" ItemsSource="{Binding Collection}" >
    				<data:DataGrid.Columns>
    					<data:DataGridTextColumn Header="Property1" Binding="{Binding Property1}"/>
    					<data:DataGridCheckBoxColumn Header="Property2" Binding="{Binding Property2}"/>
    					<data:DataGridTextColumn Header="Property3" Binding="{Binding Property3}"/>
    					<data:DataGridTextColumn Header="Property4" Binding="{Binding Property4}"/>
    					<data:DataGridTextColumn Header="Property5" Binding="{Binding Property5}"/>
    				</data:DataGrid.Columns>
    			</data:DataGrid>
    		</StackPanel>
    	</Grid>
    </navigation:Page>


    • 回答としてマーク 山本春海 2010年5月14日 1:27
    2009年12月9日 10:51

すべての返信

  • ヘッダ部/ボディ部/フッタ部をどのパネル系コントロール(Grid,StackPanel等)を使用して
    どのようにセットしているかXAMLのコード例を差し支えなければのせて頂きたいです。
    そこがポイントのような気がします。

    • 回答の候補に設定 山本春海 2010年5月14日 1:27
    2009年12月7日 0:17
  • 回答を有難うございます。

    何となく自己解決しました。

    StackPanelを使うとそうなるらしいです。

    nk9kさん、有難うございます。

    まず、適応な小さなアプリを作ってみると動きます。
    これを問題の出ているコードに近づけていったのですが、
    StackPanelを入れたら変な動きになりました。

    変とはスクロールバーが出ない。↓垂直スクロールバーが画面を小さくしても表示されないサンプルコードです。
    今は、StackPanelを使わずに実現する方向で調整しています。

    <navigation:Page 
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    	mc:Ignorable="d"
    	xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
    	xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    	x:Class="SilverlightApplication1.PageStacPanel" 
    	Title="PageStacPanel Page"
    	>
    	
    	<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}" >
    		<Grid.RowDefinitions>
    			<RowDefinition Height="80"/>
    			<RowDefinition />
    			<RowDefinition Height="80"/>
    		</Grid.RowDefinitions>
    		<StackPanel Margin="2" Grid.Row="1" Orientation="Vertical" d:LayoutOverrides="Height">
    			<data:DataGrid  Margin="0,0,0,0" AutoGenerateColumns="False" ItemsSource="{Binding Collection}" >
    				<data:DataGrid.Columns>
    					<data:DataGridTextColumn Header="Property1" Binding="{Binding Property1}"/>
    					<data:DataGridCheckBoxColumn Header="Property2" Binding="{Binding Property2}"/>
    					<data:DataGridTextColumn Header="Property3" Binding="{Binding Property3}"/>
    					<data:DataGridTextColumn Header="Property4" Binding="{Binding Property4}"/>
    					<data:DataGridTextColumn Header="Property5" Binding="{Binding Property5}"/>
    				</data:DataGrid.Columns>
    			</data:DataGrid>
    		</StackPanel>
    	</Grid>
    </navigation:Page>


    • 回答としてマーク 山本春海 2010年5月14日 1:27
    2009年12月9日 10:51
  • ほぼ解決されているようで何よりです。

    私の経験上
    Row(Column)Definition Height(Width) = "Auto" と
    StackPanel は
    リキッドレイアウトを意識する際のポイントというか
    スクロールバーが出らずにはみ出してしまう場合に原因となっていることが多い気がします。

    上記コードの例ならStackPanelのOrientation="Horizontal"にすると縦スクロールは出そうな気もしますが。(未検証)

    • 編集済み nk9k 2009年12月10日 7:19 誤字修正
    2009年12月10日 1:02