none
wpf toolkit DataGrid 最大データ長に合わせて動的にColumnのWidthを変更する方法について RRS feed

  • 質問

  • お世話になります。

    wpf toolkit DataGridのことで2点ほど質問があります。よろしくお願いします。

    -----

    「質問1」
    wpf toolkit DataGridにて、Cell内のデータの長さによって動的にColumnのWidthを変更したいのですが、そのようなことは可能でしょうか?

    「手順」
    1.一度DataGridを表示する。(DataGridTextColumnデータ設定あり)
    2.DataGridのデータを書き換える。(DataGridTextColumn内を書き換える)
    3.データ長に合わせてColumnのWidthが動的に変わる。表示が変わる。

    下記のような感じです。
     --------------------
    | 111|  222| 333|
     --------------------
    | 111|  222| 333|
     --------------------

         ↓ データ書き換え

     ----------------------------
    | 111     |  222| 333   |
     ----------------------------
    | 11111111|  222| 333333|    ←書き換える:Columnの幅が変更され表示されるようにしたい。
     ----------------------------

    下記のようにWidthにSizeToCellsを指定すれば出来るのかと考えたのですが、初期表示時のみColumnのWidthがCellの最大データ長になりましたが、データの書き換えでは変わりませんでした。

    <my:DataGrid.Columns>
       <my:DataGridTextColumn Binding="{Binding Path=Data1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data1" Width="{Binding Path=SizeToCells}"/>
       <my:DataGridTextColumn Binding="{Binding Path=Data2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data2" Width="{Binding Path=SizeToCells}"/>
       <my:DataGridTextColumn Binding="{Binding Path=Data3,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data3" Width="{Binding Path=SizeToCells}"/>
    </my:DataGrid.Columns>

    -----

    「質問2」
    ColumnのWidthにデータバインドすることは出来るのでしょうか?

    下記のようにWidthにColumnWidthData1をバインドしたのですが、{Binding Path=SizeToCells}と同じ動きみたいです。
    Width="{Binding Path=ColumnWidthData1}"のような記述はできないのでしょうか?

    <my:DataGrid.Columns>
       <my:DataGridTextColumn Binding="{Binding Path=Data1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data1" Width="{Binding Path=ColumnWidthData1}"/>
    </my:DataGrid.Columns>

    正確には記述は出来ているのですが、ColumnWidthData1の値がWidthに反映されていないので、ColumnsのWidthにはこの記述は有効でなく、{Binding Path=SizeToCells}、{Binding Path=SizeToHeader}とかしか有効にならないのかな?とか思ったりしています。Width="{Binding Path=ColumnWidthData1}"をLabelなどのWidthにバインドした場合は変更できたので。そういう物なのでしょうか?

    wpf toolkitは2009の物を使用し、開発環境はVS2008を使用しております。

    もしご存じの方がおられましたら、よろしくお願い致します。

    よろしくお願い致します。
    2009年11月20日 6:56

回答

すべての返信

  •  -----------------------------------
    | 111         |  222| 333     |
     -----------------------------------
    | 11111111|  222| 333333|    ←書き換える:Columnの幅が変更され表示されるようにしたい。
     -----------------------------------
    2009年11月20日 6:59
  •  -----------------------------------
    | 111         |  222| 333     |
     -----------------------------------
    | 11111111|  222| 333333|    ←書き換える:Columnの幅が変更され表示されるようにしたい。
     -----------------------------------
    2009年11月20日 6:59
  • >Width="{Binding Path=SizeToCells}"
    Width="SizeToCells"  じゃないでしょうか?
    お世話になります。

    大変失礼しました。
    質問掲載用に編集した時に間違えてしまいました。
    実際のソースでは、Width="SizeToCells"を指定していました。

    <my:DataGrid.Columns>
       <my:DataGridTextColumn Binding="{Binding Path=Data1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data1" Width="SizeToCells"/>
       <my:DataGridTextColumn Binding="{Binding Path=Data2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data2" Width="SizeToCells"/>
       <my:DataGridTextColumn Binding="{Binding Path=Data3,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data3" Width="SizeToCells"/>
    </my:DataGrid.Columns>

    この指定ですと、初期表示時のみColumnのWidthがCellの最大データ長に合うようになるのですが、その後のデータを書き換えても初期表示時のColumnの幅のままデータだけが書き換わる動きになります。
    なんとか、自動で幅が変えたいのですが。。

    2009年11月20日 9:21

  • 追記です。
    いろいろ試したところ、

    <my:DataGrid.Columns>
       <my:DataGridTextColumn Binding="{Binding Path=Data1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data1" Width="SizeToCells"/>
       <my:DataGridTextColumn Binding="{Binding Path=Data2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data2" Width="SizeToCells"/>
       <my:DataGridTextColumn Binding="{Binding Path=Data3,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Data3" Width="SizeToCells"/>
    </my:DataGrid.Columns>

    この記述で入力に対するサイズの変更は行われていました。

    ただ、Cell内のデータ長がデータ変更前より変更後の方が長い場合だけサイズが変更されるようです。
    逆にデータ長がデータ変更前より変更後の方が小さい場合は、そのままのカラム幅のままデータだけが変更され、カラム幅が減少しませんでした。
    データ長が短くなった分、対象のカラムの右側が全て空いています。

    こういうものなのですかね???
    2009年11月20日 11:03
  • 縮小されないと書いてありますねぇ。

    現在の列サイズよりも大きいコンテンツをスクロールして表示すると、このサイズ変更モードによって列が拡張されます。コンテンツを表示領域の外側にスクロールした後も、列は縮小されません。
    http://msdn.microsoft.com/ja-jp/library/system.windows.controls.datagridlength.sizetocells(VS.95).aspx


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    • 回答としてマーク kmo3 2009年11月25日 1:34
    2009年11月20日 11:11
  • お世話になります。

    縮小は出来ないのですね・・。大変参考になりました。
    ありがとうございました。
    2009年11月25日 1:34