none
DataGridView で RowState に合わせて行を色付けするには RRS feed

  • 質問

  • DataGridView で行の状態に合わせて行を色付けしようとしています。


    参考
    - Re: Show RowState in DataGridView as color - MSDN Forums

     

     

    データ保存の概要』 によると、行の状態には、「行が変更されているかどう
    かを示すフラグ (RowState)」を使って調べることができるそうです。


    で、あるセルの内容を書き換えたとして、編集が終了した際に、行を
    "Modified" 状態や "Added" 状態と認識して行の背景色を設定したいのですが、

    • RowState は DataRow の列挙体
    • 色付けする行は DataGridViewRow

    というふうに、別々なものを扱わないといけないと思います。


    そこで疑問なのは、

     

      今編集した行の状態を知るのに、DataGridViewRow に対応した DataRow を
      どうやって調べるのか、

     

    ということです。上記 "参考" では、RowPrePaint を使って描くように言って
    いますが、結局 RowState を見なきゃならないんじゃないのかな?と思ってます。

     

    DataTable の DataRowCollection を foreach() で1つずつ見ていき、
    DataGridView 全体で行の編集状態を色づけするという手もあるでしょうが、
    凄い行数あった場合は時間かかりそうだし、無駄が多いように感じます。

     

     

    今編集した行のみを状態 (Modified, Added) に合わせて色付けしたい場合、

    どういう書き方になるのでしょう?

    2008年2月7日 11:12

回答

すべての返信

  • 例えば以下のような感じで取得できます。

     

    ((DataRowView)BindingSource1.Current).Row.RowState

    2008年2月7日 14:32
    モデレータ
  •  trapemiya さんからの引用

    例えば以下のような感じで取得できます。

     

    ((DataRowView)BindingSource1.Current).Row.RowState

     

    あぁ、この方法で確かに見れますね。確認しました。
    trapemiya さん、ありがとうございます。


     

    それにしても、DataGridView と DataSet 周りが整理しきれていません。

    どんなオブジェクトが存在していて、何をやっているのかが整理できたらいいのですが。

     

    図解してくれている情報ページってご存じないですか?
    英語でも読みます。

    2008年2月8日 6:33
  • 以下なんかはどうでしょうか?

     

    ADO.NET Typed DataSet objects
    http://searchsqlserver.techtarget.com/generic/0,295582,sid87_gci1188427,00.html

    2008年2月8日 8:26
    モデレータ
  •  trapemiya さんからの引用

    以下なんかはどうでしょうか?

     

    ADO.NET Typed DataSet objects
    http://searchsqlserver.techtarget.com/generic/0,295582,sid87_gci1188427,00.html

     

    また有益な情報ありがとうございます。

    Figure 1-5 辺りを読んでみます。

     

    ついでに RELATED CONTENT も。

     

     

    trapemiya さん、こんなところも目を通してるんですね。

     

     

    2008年2月8日 8:44
  • trapemiya さんの一例の他では近場だと DataBoundItem でも取得できます。
    # e.RowIndex は、イベントによっては -1 になります。
    # DataBoundItem は、NewRowIndex では null になります。

     

    DataGridViewRow gridViewRow = dataGridView1.Rows[e.RowIndex];
    DataRow row = ((DataRowView)gridViewRow.DataBoundItem).Row;

    2008年2月8日 9:10
  •  custar さんからの引用

    trapemiya さん、こんなところも目を通してるんですね。

     

    いえ、さっき検索したばかりです。本文は読んでません。(^^;

    でも、図的にはよくできていると思います。

    種をあかせばイメージ検索でググっただけです。

    2008年2月8日 9:38
    モデレータ
  •  TH01 さんからの引用

    trapemiya さんの一例の他では近場だと DataBoundItem でも取得できます。


    TH01 さん、追加情報ありがとうございます。


     TH01 さんからの引用

    DataGridViewRow gridViewRow = dataGridView1.Rows[e.RowIndex];
    DataRow row = ((DataRowView)gridViewRow.DataBoundItem).Row;


    まだ私が理解できてない DataView 絡みですね。
    ここをどうにかしなきゃなぁ。


    でも、DataBoundItem で DataView が取れるんですね。へぇ。
    データ連結されていた場合のみだったかな。


    - DataGridViewRow.DataBoundItem プロパティ

    Code Snippet

    行に値を読み込むデータ バインド オブジェクトを取得します。
    # ...何を言ってるの? msdn 分かりづらい。


    解説


    行オブジェクトを使用したデータ バインド オブジェクトへの直接アクセスは、
    そのオブジェクトが含まれるデータソースに直接アクセスできない場合に便利
    です。


    この方法は、選択された行やイベントハンドラへの引数として渡された行にバ
    インドされたオブジェクトを操作する場合にも便利です。

     

    2008年2月8日 9:50
  •  trapemiya さんからの引用

    いえ、さっき検索したばかりです。本文は読んでません。(^^;
    でも、図的にはよくできていると思います。


    web の html って組版には未だに不向きな感じがするので、図解の説明ページ
    なんて良いものがそうそうありませんね。作るの手間ですから。


    あの図で言いたいことは分かります。

     

    msdn は図解が殆ど無いから、頭に叩き込むのに苦労します。

    ブラウザで文章読むのって適してないのに、あの文章量。

    しかも、読解の難しい表現。


     

     trapemiya さんからの引用

    種をあかせばイメージ検索でググっただけです。


    イメージ検索、そういう手があったか。

    私も他にないか探してみます。

     

     

    ...おぉ、"sql dataset" で検索してみましたが、色とりどり。

    果たしていい情報が見つかるか。

    大体こういうのは英語圏しかいいのが見つからないんですよね (経験的に)。

     

     

    今では特に重要じゃなくなったけど CellStyle について

    http://www.devolutions.net/articles/DataGridView%20FAQ_fichiers/image024.gif

    2008年2月8日 9:59
  • 下記スレッドにて、TH01 さんから参考になるコードを提供していただきました。


     - DataTable の変化を、それに接続されている末端のコントロールへ伝える方法はありませんか?
    2ページ目の上から2つ目の投稿。

     

    感謝。

    2008年4月8日 4:45