.NET TIPS

[ASP.NET]DataGridコントロールの各セルにアクセスするには?

デジタルアドバンテージ
2003/09/26

 DataGridコントロールは、表示したい列をaspxファイルで定義しておき、データ連結を行ってデータソースの要素を表形式で表示するというのが基本的な使用方法である。しかしデータ連結を行った後でも、グリッド内の各セルにアクセスし、セル内のテキストを変更したり、セルのプロパティを設定したりすることが可能だ。

DataGridコントロールを構成するオブジェクト

 グリッド内のセルにアクセスするには、データ連結後のDataGridコントロールを構成するオブジェクトについて把握しておく必要がある。

 まず、DataGridコントロールの各行はDataGridItemクラス(System.Web.UI.WebControls名前空間)のオブジェクトで表される。これはDataGridコントロール(DataGridクラス)のItemsプロパティからアクセス可能だ。Itemsプロパティは複数のDataGridItemオブジェクトを保持できるコレクション・クラスである。

 さらに、各行におけるセルは、DataGridItemオブジェクトのCellsプロパティからアクセスできる。Cellsプロパティは複数のセル(TableCellクラス(System.Web.UI.WebControls名前空間)のオブジェクト)を保持できるコレクション・クラスである。

 以上より、いまDataGridコントロールに付けたidを「MyGrid」とすると、グリッド上の各行(ヘッダー行は除く)には順に、

MyGrid.Items[0]
MyGrid.Items[1]
MyGrid.Items[2]
……

と記述して、また最初の行の各セルには、左から、

MyGrid.Items[0].Cells[0]、MyGrid.Items[0].Cells[1]、……

と記述してアクセスすることができる。これらをまとめて図示すると次のようになる。

DataGridコントロールを構成するオブジェクト
各行はDataGridItemオブジェクトにより表され、行内の各セルはTableCellオブジェクトにより表される。行数と列数はMyGrid.Items.CountとMyGrid.Columns.Countにより取得できる。

 図では、行数と列数を取得するためのMyGrid.Items.CountとMyGrid.Columns.Countも合わせて図示している。ColumnsプロパティはDataGridコントロールを構成する列のコレクションである。

 ちなみに、コレクション内の要素数を示すCountプロパティはICollectionインターフェイス(System.Collections名前空間)のメンバであり、コレクションとして機能するクラスの多くはこのインターフェイスを実装している。

 なお、DataGridクラスのItemsプロパティにはヘッダー行やフッター行が含まれない点に少し注意が必要だ。

各セルにアクセスするサンプル・プログラム

 DataGridコントロールの各セルにアクセスする例として、次のようなサンプル・プログラムを作成してみた。このプログラムは「TIPS:[ASP.NET]DataGridコントロールで特定のカラムのみを表示するには?」にある最初のサンプル・プログラム(bounddg1.aspx)をベースにしている。

グラデーションでグリッドを表示するサンプル・プログラム(graddg.aspx)の実行結果

 プログラムのソース・コードは次のようになっている。太字で示した部分は、ベースとなっているプログラムに追加したコードで、今回のポイントとなる部分だ。

<%@ Page Language="C#" EnableViewState="false" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Drawing" %>

<html>
<head>
  <script runat="server">
    void Page_Load(object sender, EventArgs e) {
      DataSet ds = new DataSet();
      ds.ReadXml("http://www.buildinsider.net/rss");

      MyGrid.DataSource = ds.Tables["item"];
      MyGrid.DataBind();

      int inc = 255 / (MyGrid.Items.Count - 1);

      for (int y = 0; y < MyGrid.Items.Count; y++) {
        Color argb = Color.FromArgb(255, inc * y, 0);
        MyGrid.Items[y].BackColor = argb;

        MyGrid.Items[y].Cells[0].Text = argb.ToString();
      }

    }

  </script>
</head>

<body>
  <form runat="server">
    <asp:DataGrid id="MyGrid"
        AutoGenerateColumns="false"
        runat="server" >

      <Columns>
        <asp:BoundColumn HeaderText="背景色" />
        <asp:BoundColumn
            DataField="title" HeaderText="タイトル" />
        <asp:BoundColumn
            DataField="encoded" HeaderText="概要" />
      </Columns>

    </asp:DataGrid>
  </form>
</body>
</html>
グラデーションでグリッドを表示するC#のサンプル・プログラム(graddg.aspx)

 各セルにアクセスするコーディングとしては、各行に対してデータ連結直後に発生するItemDataBoundイベントを使用する方法もあるが、データソースの各要素データに直接アクセスする必要がなければ、DataBindメソッド呼び出し後で十分だろう。

 このプログラムでは、DataBindメソッド呼び出し後に、各行の背景色を赤から黄色へのグラデーションで描画し、さらにはその背景色の色情報を第1列に書き込んでいる。この2点について次に解説する。

行の背景色を設定するには

 DataGridコントロールの各行を表すDataGridItemオブジェクトには、その背景色をBackColorプロパティにより設定できる。

 このBackColorプロパティはColor構造体(System.Drawing名前空間)のオブジェクトであるため、Color構造体のstaticなメソッドであるFromArgbメソッドを使用して、赤、緑、青の3つの値(0〜255)により背景色を指定可能である。これによりグラデーションのための個々の色を作り出すのは容易だ。上記のサンプル・プログラムでは、赤(255、0、0)から黄色(255、255、0)までの範囲で、緑色を示す2番目の値を少しずつ変化させながら背景色を設定している。

セルのテキストを設定するには

 DataGridコントロールの各セルに表示されるテキストは、TableCellオブジェクトのTextプロパティで読み書き可能だ。例えばグリッド内の左上隅のセルのテキストは次のような記述でアクセスできる。

MyGrid.Items[0].Cells[0].Text

 データ連結後はデータソースの各要素がテキスト化され、このTextプロパティにセットされている。各セルに直接アクセスすることにより、このテキストを取得したり、書き換えたりすることも可能だ。

 さて上記のサンプル・プログラムでは、背景色の色情報を表示するための列が必要なため、あらかじめ次のようにしてヘッダー行に表示される文字列だけを指定した連結列を準備している。上書きしてしまうのでどのような列でもよいのだが、<asp:BoundColumn>要素を使用するのが一番シンプルな記述だろう。

  <Columns>
    <asp:BoundColumn HeaderText="背景色" />
    ……
  </Columns>

 この要素にはDataField属性によりデータソースのフィールドを指定していないため、データ連結を行っても列には何も表示されない。

 セルの背景色を設定した後、サンプル・プログラムでは次のようにして、空の列に背景色の色情報をテキストとして書き込んでいる。

MyGrid.Items[y].Cells[0].Text = argb.ToString();

 Color構造体のToStringメソッドは、オブジェクトに設定されている色を、

Color [A=XXX, R=XXX, G=XXX, B=XXX]

の形式でテキスト化することができる。End of Article

カテゴリ:Webフォーム 処理対象:DataGridコントロール
使用ライブラリ:DataGridコントロール(System.Web.UI.WebControls名前空間)
使用ライブラリ:DataGridItemクラス(System.Web.UI.WebControls名前空間)
使用ライブラリ:TableCellクラス(System.Web.UI.WebControls名前空間)
使用ライブラリ:ICollectionインターフェイス(System.Collections名前空間)
使用ライブラリ:Color構造体(System.Drawing名前空間)
使用ライブラリ:BoundColumn(System.Web.UI.WebControls名前空間)
関連TIPS:[ASP.NET]DataGridコントロールでデータセットを表示するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]DataGridコントロールですべての行にアクセスするには?
[ASP.NET]DataGridコントロールのヘッダーを複数行にするには?
DataGridコントロールで入力中のセルをハイライト表示するには?
[ASP.NET]DataGridコントロールのヘッダーを結合するには?
[ASP.NET]DataGridコントロールでマウスのある行を強調表示するには?
[ASP.NET]DataGridコントロールの同一列内のセルを結合するには?
[ASP.NET]DataGridコントロールで特定の行や文字を強調するには?
[ASP.NET]DataGridコントロールでテンプレート列のセルの値を取得するには?
[ASP.NET]DataGridコントロールのヘッダーにソートされた方向を表示するには?
[ASP.NET]DataGridコントロールの行に通し番号を付けるには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間