locked
Silverlight DataGrid 編集したセルの値により、その列のヘッダーの色を設定する RRS feed

  • 質問

  • お世話になります。

    vwd2010 EXPRESS C# で開発しています。

     

    データグリッドのセルの値編集時に、編集した列のヘッダーの色を変更したく、以下のようなコードを書きました。

     

     

    private void dtgd_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
    			var s = sender as DataGrid;
                           //セルの値を確認する処理などは省略
    			Style style = new Style();
    			style.Setters.Add(new Setter(DataGridColumnHeader.ForegroundProperty, new SolidColorBrush(Colors.Red)));
    
                            //2つ試しました
    			e.Column.HeaderStyle = style;
    			s.ColumnHeaderStyle = style;
    }
    

     


    これではヘッダーの色は変わりませんでした。

     

    DataGridの列ヘッダーの色を変更したいのですがどのようにすればよろしいでしょうか。

     

    よろしくお願い致します。



    2011年10月19日 3:10

回答

  • 試してみました。

    Style style = new Style();

    Style style = new Style(typeof(DataGridColumnHeader)); 
    
    

    とするとうまく表示されました。
    私の先の発言である、

    >そのコードでヘッダーの色が変わるはずですので、恐らくCellEditEndingイベントが発生していないのでしょう。

    は間違いだったようです。私の方で動作しているコードと比較した際に見落としたようです。ごめんなさい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク でぃあい 2011年10月25日 18:21
    2011年10月20日 4:19
    モデレータ
  • 以下にあるように、Styleを丸ごと入れ替える必要があるようです。

    How can I change the column header background color of a DataGrid control?
    http://forums.silverlight.net/t/58926.aspx/1?How+can+I+change+the+column+header+background+color+of+a+DataGrid+control+

    で、実際には以下のようにするとうまく行きます。

    Changing Datagrid Header at runtime
    http://forums.silverlight.net/t/209838.aspx/1

    上記の解決済みのマークが付けられているコードに、

    var setter = style.Setters.Where(d => ((Setter)d).Property == DataGridColumnHeader.BackgroundProperty).FirstOrDefault();

    とありますが、おそらく以下の誤りでしょう。

    var setter = style.BasedOn.Setters.Where(d => ((Setter)d).Property == DataGridColumnHeader.BackgroundProperty).FirstOrDefault();

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク でぃあい 2011年10月25日 18:21
    2011年10月21日 4:54
    モデレータ

すべての返信

  • そのコードでヘッダーの色が変わるはずですので、恐らくCellEditEndingイベントが発生していないのでしょう。ただし、e.Column.HeaderStyle = style;のみで良く、s.ColumnHeaderStyle = style;は必要ありません。s.ColumnHeaderStyle = style;を実行すると、DataGridの全ての列ヘッダの色が変わってしまうでしょう。
    さて、CellEditEndingイベントが発生しない原因ですが、

    1.イベントハンドラの設定を誤っている。
    2.DataGridTextColumnではなく、DataGridTemplateColumnを使っている。

    などが考えられます。DataGridTemplateColumnを使っている場合は、DataTemplate内のコントトール、例えばTextBoxでしたらTextChangedイベント辺りで処理することになるでしょうか。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年10月19日 13:58
    モデレータ
  • trapemiya さん

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

     

    CellEditEndingイベント は発生しています。

    もともと既存の別の処理が動作している箇所で、

    ブレークを貼って処理を通過するのも確認しています。

    使用しているのは DataGridTemplateColumn です。

     

    また別の DataGridTextColumn を使用しているもっとシンプルな DataGrid でも確認してみました。

    DataGridTextColumn をAPI内で生成して、header  やバインドを設定しているところでスタイルをセットしても変化が見られませんでした。

    DataGrid自体にstyleを設定してみたのですが色の変化を確認出来ませんでした。

     

    DataGridTextColumn dgtc = new DataGridTextColumn();
    
    Binding b = new Binding();
    b.Path = new PropertyPath("ABC");
    
    Style style = new Style();
    
    style.Setters.Add(new Setter(DataGridColumnHeader.ForegroundProperty, new SolidColorBrush(Colors.Red)));
    
    
    dgtc.Header = "ヘッダーに表示";
    dgtc.Binding = b;
    dgtc.HeaderStyle = style
    


    上記のような既存の処理にstyleの設定を追加しようとして確認しました。

    因みに

    DataGridColumnHeader.BackgroundProperty
    も試しています。

     

    もう少し調べてみます。

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


    2011年10月19日 23:37
  • 試してみました。

    Style style = new Style();

    Style style = new Style(typeof(DataGridColumnHeader)); 
    
    

    とするとうまく表示されました。
    私の先の発言である、

    >そのコードでヘッダーの色が変わるはずですので、恐らくCellEditEndingイベントが発生していないのでしょう。

    は間違いだったようです。私の方で動作しているコードと比較した際に見落としたようです。ごめんなさい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク でぃあい 2011年10月25日 18:21
    2011年10月20日 4:19
    モデレータ
  • trapemiyaさんご回答ありがとうございます。

    私の先の発言である、

    >そのコードでヘッダーの色が変わるはずですので、恐らくCellEditEndingイベントが発生していないのでしょう。

    は間違いだったようです。私の方で動作しているコードと比較した際に見落としたようです。ごめんなさい。

    とんでもありません。ありがとうございます。とても助かっています。

     

    もう一つ申し訳ないのですが

    上記のご指摘により、前景色(文字色)は無事変更出来ました。

    しかし、メインは背景色を変更したかったのですが、てっきり

    DataGridColumnHeader.BackgroundProperty

    で設定すれば良いものと思っていたのですが、それでは何も変わりませんでした。

    しばらくもがいていたのですが良くわからず。

     

    よろしくお願い致します。

     


    2011年10月20日 16:25
  • 以下にあるように、Styleを丸ごと入れ替える必要があるようです。

    How can I change the column header background color of a DataGrid control?
    http://forums.silverlight.net/t/58926.aspx/1?How+can+I+change+the+column+header+background+color+of+a+DataGrid+control+

    で、実際には以下のようにするとうまく行きます。

    Changing Datagrid Header at runtime
    http://forums.silverlight.net/t/209838.aspx/1

    上記の解決済みのマークが付けられているコードに、

    var setter = style.Setters.Where(d => ((Setter)d).Property == DataGridColumnHeader.BackgroundProperty).FirstOrDefault();

    とありますが、おそらく以下の誤りでしょう。

    var setter = style.BasedOn.Setters.Where(d => ((Setter)d).Property == DataGridColumnHeader.BackgroundProperty).FirstOrDefault();

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク でぃあい 2011年10月25日 18:21
    2011年10月21日 4:54
    モデレータ
  • trapemiyaさん

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

    返信遅くなり申し訳ありません。

     

    教えて頂いた方法で問題なく、へーダーの背景色の変更が出来ました。

    しかし、MouseOver や、 press 時にヘッダーの色が変更して欲しいという自分の要求に

    考えが及んでいなかったことがわかりました。

     

    http://www.codeproject.com/KB/silverlight/SilverlightGlassGridHdr.aspx

     

    上記のサイトのサンプルで望んだような動作をしてくれました。

    上の回答で教えて頂いた方法と合わせてヘッダーの変更が出来るようになりました。

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

     

    XAML側の方はコピペでやっているだけで、きちんと理解しきれていないのですが、

    そちらは少しずつやっていこうと思います。

     

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

     


    2011年10月25日 18:36