.NET TIPS

[ASP.NET]DataGridコントロールの列を実行時に表示/非表示するには?

デジタルアドバンテージ
2003/11/14

 DataGridコントロールの列は、その定義時にVisible属性により表示/非表示を切り替えることができる。この属性は、実行時にはDataGridオブジェクトのVisibleプロパティとして読み書きでき、これを利用することにより実行時に動的に列の表示/非表示を切り替えることができる。

 ここではこのVisibleプロパティを利用して、次の画面で示すようなプログラムを作成してみる。このプログラムでは、グリッドのヘッダーに表示されている列名をクリックすることにより、その列を隠すことができる。また、[すべての列を表示]ボタンをクリックすれば、グリッドのすべての列が表示される。この場合には起動時に非表示だった「日付」列も表示するようにしている。

サンプル・プログラム(hidecolumn.aspx)の起動時の画面

ヘッダーの[タイトル]をクリックしたときの画面
「タイトル」列が非表示になる。ページの移動を行っても列は非表示のままとなる。

[すべての列を表示]ボタンをクリックしたときの画面
「日付」列は起動時には表示されないが、[すべての列を表示]ボタンがクリックされたときにのみ表示される。

ヘッダーのクリックによる列の非表示

 ヘッダーに表示されている列名をリンクボタンとして機能させるために、ここでは「TIPS:[ASP.NET]DataGridコントロールにソート機能を追加するには?」で解説しているソート機能を流用している。ソート機能といっても、DataGridコントロールが提供する機能は、SortExpression属性が設定された列の列名部分をリンクボタンにして、SortCommandイベントを発生するだけである。本来SortCommandイベントのイベント・ハンドラではクリックされた列によりデータソースの並べ替えを行うが、ここではその代わりに列を非表示にしている。

 クリックされた列を非表示にするSortCommandイベントのイベント・ハンドラは次のように記述できる。

void MyGrid_Sort(object s, DataGridSortCommandEventArgs e) {
  foreach (DataGridColumn column in MyGrid.Columns) {
    if (column.SortExpression == e.SortExpression) {
      column.Visible = false;
    }
  }
}

 このメソッドでは、クリックされた列のSortExpression属性の値をe.SortExpressionとして取得できる。この値をグリッド内のすべての列のSortExpressionプロパティと順に比較することにより、クリックされた列を特定できる。

すべての列の表示

 [すべての列を表示]ボタンがクリックされたときの処理は、グリッドのすべての列のVisibleプロパティをtrueに設定するだけだ。このボタンのイベント・ハンドラは次のようになる。

void MyButton_Click(object s, CommandEventArgs e) {
  foreach (DataGridColumn column in MyGrid.Columns) {
    column.Visible = true;
  }
}

列を表示/非表示するサンプル・プログラム

 今回示したサンプル・プログラムのソース・コードは次のようになっている。これは「TIPS:[ASP.NET]DataGridコントロールでページ表示するには?」で示しているサンプル・プログラムにコードを追加して作成したものだ。追加した部分は太字で示している。

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

<html>
<head>
  <script runat="server">
    void BindMyGrid() {
      DataSet ds = new DataSet();
      ds.ReadXml("http://www.buildinsider.net/rss");

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

    void Page_Load(object s, EventArgs e) {
      if (!IsPostBack) {
        BindMyGrid();
      }
    }

    void MyGrid_Paging(object sender, DataGridPageChangedEventArgs e) {
      MyGrid.CurrentPageIndex = e.NewPageIndex;
      BindMyGrid();
    }

    void MyButton_Click(object s, CommandEventArgs e) {
      foreach (DataGridColumn column in MyGrid.Columns) {
        column.Visible = true;
      }
    }

    void MyGrid_Sort(object s, DataGridSortCommandEventArgs e) {
      foreach (DataGridColumn column in MyGrid.Columns) {
        if (column.SortExpression == e.SortExpression) {
          column.Visible = false;
        }
      }
    }

  </script>
</head>

<body>
  <form runat="server">
    <asp:Button text="すべての列を表示"
        OnCommand="MyButton_Click" runat="server" />


    <asp:DataGrid id="MyGrid"
        AllowPaging="true"
        AllowSorting="true"
        PageSize="5"
        OnSortCommand="MyGrid_Sort"
        OnPageIndexChanged="MyGrid_Paging"
        AutoGenerateColumns="false"
        runat="server">

      <HeaderStyle BackColor="#BB2255" ForeColor="white"/>
      <ItemStyle   BackColor="#FFEEEE" />
      <AlternatingItemStyle BackColor="#FFDDDD" />

      <Columns>
        <asp:TemplateColumn HeaderText="No">
          <ItemTemplate>
            <%# Container.DataSetIndex + 1 %>
          </ItemTemplate>
        </asp:TemplateColumn>
        <asp:BoundColumn
            SortExpression="title"
            DataField="title" HeaderText="タイトル" />
        <asp:BoundColumn
            SortExpression="encoded"
            DataField="encoded" HeaderText="概要" />
        <asp:BoundColumn
            Visible="false"
            SortExpression="pubDate"
            DataField="pubDate" HeaderText="日付" />

      </Columns>

    </asp:DataGrid>

  </form>
</body>
</html>
列を表示/非表示するC#のサンプル・プログラム(hidecolumn.aspx)

 「日付」列を定義している最後の<asp:BoundColumn>タグにはVisible="false"属性を記述しているため、プログラムの起動時には画面上に表示されない。End of Article

カテゴリ:Webフォーム 処理対象:DataGridコントロール
使用ライブラリ:DataGridコントロール
関連TIPS:[ASP.NET]DataGridコントロールにソート機能を追加するには?
関連TIPS:[ASP.NET]DataGridコントロールでページ表示するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]DataGridコントロールにソート機能を追加するには?
[ASP.NET]DataGridコントロールの列にボタンを表示するには?
[ASP.NET]DataGridコントロールの行にデータを埋め込むには?
[ASP.NET]DataGridコントロールの行に通し番号を付けるには?
[ASP.NET]DataGridコントロールのフッターに入力機能を追加するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

@IT Special

- PR -

TechTargetジャパン

Insider.NET フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH