locked
Silverlight Datagrid C#からの列名のセットの仕方 RRS feed

  • 質問

  • こんにちは。お世話になります。

    初歩的なところから抜け出せないでぃあいです。。。

     

    SilverlightのDataGridの列名をC#のコードで設定したいのですがどのようにしたら実現出来ますでしょうか。

    現在は、DataGridをC#で生成していますが、

    ItemsSource にセットしたクラスのプロパティ名がそのまま列名になっています。

    これをコード上で、その都度違う列名に変更しながらDataGridを表示したいと考えています。

     

    XAMLでは Header = "列A" のような感じで列名を設定可能なのでC#からもセットできるはずと思っているのですが、

    こういうのって何を調べれば良いでしょうか。

     

    http://msdn.microsoft.com/ja-jp/library/cc189753%28v=VS.95%29.aspx

     

    上記のページをじーっとみていても、ヘッダーの列名のセットの仕方が見えてこないのですが、

    何か見落としてしまっていますでしょうか。

     

    このちょっとのことがわからない地獄から抜け出せなくて悲しいです。

    どうぞよろしくお願い致します。

     


    2011年3月3日 1:13

回答

  • DataGridTemplateColumn column = new DataGridTemplateColumn();
    column.Header = "aiueo";
    dGrid.Columns.Add(column);
    
    列の型にもよりますが、例えばこんな感じです。

    http://takumayokoo.blogspot.com
    • 回答としてマーク でぃあい 2011年3月4日 23:06
    2011年3月3日 3:16
  • Columnsはコレクションだと思うので[0]のように配列みたいに何番目のカラムと指定できませんか?
    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    • 回答としてマーク でぃあい 2011年3月4日 23:05
    2011年3月3日 3:48

すべての返信

  • DataGridのColumnsプロパティがDataGridColumnなので、それのHeaderプロパティで設定できませんか?

    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    2011年3月3日 2:08
  • かずき_okazaki様

     

    ご回答ありがとうございます。

    例えば DataGrid 型の dtGrid とします。

     

    VS2010 のC#で記述しようとした場合、

    dtGrid.Columns  ここまではVS2010でも補完されるのですが、その次にHeader プロパティに見当たりません。

     

    http://msdn.microsoft.com/ja-jp/library/cc189751%28v=VS.95%29.aspx

     

    上記を見にいくと、XAML で DataGridTextColumn というタグの中で Header を設定しているのはわかるのですが・・・。

    これがどうすると C# になるのかがわからず。よろしくお願い致します。

     

    PS

    先日コントロールの配置方法をご教授頂きましたが、

    その後スタックパネルなどの配置などもスムースに出来ました。

    ありがとうございました。

     


    2011年3月3日 3:13
  • DataGridTemplateColumn column = new DataGridTemplateColumn();
    column.Header = "aiueo";
    dGrid.Columns.Add(column);
    
    列の型にもよりますが、例えばこんな感じです。

    http://takumayokoo.blogspot.com
    • 回答としてマーク でぃあい 2011年3月4日 23:06
    2011年3月3日 3:16
  • Columnsはコレクションだと思うので[0]のように配列みたいに何番目のカラムと指定できませんか?
    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    • 回答としてマーク でぃあい 2011年3月4日 23:05
    2011年3月3日 3:48
  • かずき_okazaki様

     

    ご回答ありがとうございます。

    Columnsに添え字を追加したところ、

    dtGrid.Columns[0]。Header  とできました。

     

    ただし、実行すると、ArgumentOutRangeException が発生してしまいました。

    列を手動で追加しておく必要があるのかなと思いました。わかってないのでただの予想ですが。。

    まだ、DataGrid を手動でいろいろやったことないので、もう少し試してみます。

    ありがとうございました。

     

    あと、「コレクションなので、添え字を指定できる」というのが参考になりました。

    まだ、理解できていないので勉強します。

     

     


    2011年3月3日 4:24
  • T-Yokoo様

     

    ご回答ありがとうございます。

    なんとなくC#での記述の仕方自体が少し見えてきました。

    ありがとうございます。

     

    とりあえずご指摘頂いた方法で

    dGrid.Columns.Add(column)

    を行ったところ、画面真っ白になってしまう現象になりました。

     

    C#のコード上で作成したDataGrid をプロパティとか特に設定してないのですが、

    今一応確認しましたが、、AutoGenerateColumns は 規定値 true なので、

    その辺関係あるでしょうか。

    もう少しいろいろ試してみます。

     

    あと、みなさん、この辺のことどうやって覚えられたのでしょう。。。

    まず、基本の学習の仕方がわからず。。GUIの基本が自分はわかってないのだと思います。

    わかるなら、本でもなんでも買うのですが。。


    2011年3月3日 4:24
  • とりあえず今現在の状況を記載させて頂きます。

     

    ObservableCollection<DataItem>[] items = new ObservableCollection<DataItem>[MAXDAY];

    DataGridTextColumn dtColumn = new DataGridTextColumn();

    List<DataGrid> dtGrid = new List<DataGrid>();

    StackPanel stkPnl = new StackPanel();

    items[0] = new ObservableCollection<DataItem>();

    DataItem item = new DataItem()
    {
        列名1 = "なんだかんだ",
        列名2 = "あーだこーだ",//本とは複数行セット
     };

     items[0].Add(item);

    dtGrid.Add(null);

    dtGrid[0] = new DataGrid()

    {
        AutoGenerateColumns = true,
    };

     

    dtGrid[0].ItemsSource = items[0];

    dtColumn.Header = "列名セット";
    //dtGrid[0].Columns.Add(dtColumn);  この1行を追加すると画面真っ白

    //dtGrid[0].Columns[0].Header = "列名セット"; これを有効にすると実行時にここで ArgumentOutRangeException 発生

    stkPnl.Children.Add(dtGrid[0]);//列名のセットをしようとしなければDataGridは普通に表示される。

     

    public class DataItem
    {
          public String 列名1 { get; set; }
          public String 列名2 { get; set; }
    }

     

    本物ソースから書き換えたのでコンパイルとか通してませんがこんな感じです。

    とりあえずもがき中。

    よろしくお願いします。

     

     

     

     

     


    2011年3月3日 12:40
  • ちょっと今コードを書いて試せる環境にいないので質問になってしまうのですが、何故XAMLからの設定ではダメなのか?なぜ、AutoGeneratedColumnsはtrueにしているのか。

    AutoGeneratedColumnsをfalseにして、全部手動でColumnをコードから組み立てればいいような気がします。


    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    2011年3月4日 3:55
  • かずき_okazaki様

     

    ありがとうございます。

    すいません、その後少し理解進んでいました。

     

    まず、

    dtGrid[0].Columns.Add(dtColumn);  と DataGridTextColumn型を使用する方法や、

    dtGrid.Columns[0]。Header  のような添え字を使用する方法は、

     

    dtGrid[0].ItemsSource = items[0];

    この1行を削除することで動作しました。

     

    >何故XAMLからの設定ではダメなのか?

    取得元のデータによって、0個から複数個のDataGrid  を StackPanel上に配置していく処理を行っているため、

    XAMLではDataGridの数が変動する場合、表現できないのではないかと思っています。(本当に出来ないかはまだスキルが足りず判断できません)

     

    >AutoGeneratedColumnsをfalseにして、全部手動でColumnをコードから組み立てればいいような気がします。

    はい、列数は固定で決まっている為、先に各列を作成し、各列毎に DataItem のプロパティをBindしてやれば良いのではないかと考え、

    それが出来たらご報告しようと思っていたのですが、また、そのようなBindの書き方がわからず、調べていたところ時間が経ってしまっていました。

     

    件名の列名のセットの仕方は解決していましたので、一旦質問を閉じさせて頂きます。

    今回も大変勉強になりました。ありがとうございました。

     

    初歩的な問題だと思うのですが、詰まってる本人としては先にすすめず困りはててるので、本当にありがたいです。

     

    一番最初より、少し理解できてきたように思います。

    やっぱりGUIプログラミングやりたいのでシコシコがんばります。。。

     

     


    2011年3月4日 23:05