WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

GridView 内の全 CheckBox をオン(jQuery)

by WebSurfer 2010年10月8日 22:11

GirdView の各行に配置した複数の CheckBox に、一度に全部チェックを入れたり外したりする操作を、クライアントサイドのスクリプトで実行する方法の jQuery バージョンです。

普通の JavaScript を使ったバージョンは、先の記事 GridView 内の全 CheckBox をオン にありますので、見比べてみてください。

ネタは先の記事 jQuery の本を買いました で紹介した本の中のサンプルです。

コードは以下の通りです。説明はコードの中にコメントとして入れましたので、そちらを参照してください。

jQuery を使うと、普通の JavaScript を使った場合と比べて、かなりコード量を減らすことができるのは確かのようです。でも、考え方がかなり違うようで、コードの書き方も自分の常識を超えてました。jQuery のセレクタのパワーを垣間見ることができたような気もしますが、正直言って、まだよく分かってないです。(笑)

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
  DataTable CreateDataTable()
  {
    DataTable dt = new DataTable();
    DataRow dr;

    dt.Columns.Add(new DataColumn("Item", typeof(Int32)));
    dt.Columns.Add(new DataColumn("Name", typeof(string)));
    dt.Columns.Add(new DataColumn("Price", typeof(Int32)));

    for (int i = 0; i < 10; i++)
    {
      dr = dt.NewRow();
      dr["Item"] = i;
      dr["Name"] = "Item " + i.ToString();
      dr["Price"] = 123000 * (i + 1);
      dt.Rows.Add(dr);
    }
    return dt;
  }

  void Page_Load(Object sender, EventArgs e)
  {
    if (!IsPostBack)
    {
      GridView1.DataSource = CreateDataTable();
      GridView1.DataBind();
    }
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  <title>Check/Uncheck All CheckBoxes in a GridView</title>
  <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
  <script type="text/javascript">
    <!--
    $(function () {
      // ヘッダーの CheckBox にチェックを入れる/外すのと連
      // 動して、各行に配置した CheckBox すべてにチェックを
      // 入れる/外す。
      $('table tr th input:checkbox').click(function () {
        $('table tr td input:checkbox')
          .attr('checked', $(this).is(':checked'));
      });

      // 各行に配置した CheckBox のすべてにチェックが入った
      // 時、ヘッダーの CheckBox にもチェックを入れる。
      // 各行に配置した CheckBox の一つでもチェックを外すと、
      // ヘッダーの CheckBox のチェックが外れる。
      $('table tr td input:checkbox').click(function () {
        var chkAll =
          $('table tr td input:checkbox:not(:checked)')
            .length == 0 ? true : false;
        $('table tr th input:checkbox')
          .attr('checked', chkAll);
      });

      // [Check All]ボタンクリックで、すべての CheckBox
      // にチェックを入れる。
      $('#checkAll').click(function () {
        $('table input:checkbox').attr('checked', true);
      });

      // [Uncheck All]ボタンクリックで、すべての CheckBox 
      // のチェックを外す。
      $('#uncheckAll').click(function () {
        $('table input:checkbox').attr('checked', false);
      });
    });            
  //-->
  </script>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <h2>Check/Uncheck All CheckBoxes</h2>
    <input type="button" 
      id="checkAll"
      value="Check All" /> 
    <input type="button" 
      id="uncheckAll"
      value="Uncheck All" />        
    <asp:GridView ID="GridView1" 
      runat="server" 
      AutoGenerateColumns="False">
      <Columns>
        <asp:TemplateField>
          <HeaderTemplate>
            <input id="Checkbox1" type="checkbox" />
          </HeaderTemplate>
          <ItemTemplate>
            <input id="Checkbox2" type="checkbox" />
          </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField HeaderText="Item" DataField="Item" />
        <asp:BoundField HeaderText="Name" DataField="Name" />
        <asp:BoundField HeaderText="Price" DataField="Price" />
      </Columns>
    </asp:GridView>    
  </div>
  </form>
</body>
</html>

------------ 2010/4/24 追記 ------------

この記事で紹介したコードを実際に動かして試せるよう 実験室 にアップしました。興味のある方は試してみてください。

Tags: , ,

JavaScript

GridView 内の全 CheckBox をオン

by WebSurfer 2010年10月7日 23:55

先の 記事で CheckBox にチェックを入れる/外すことによって、当該 CheckBox のテキストのスタイル(文字の色、下線の有無)を変化させる方法を書きました。

今回はその続編(?)として、GirdView の各行に配置した複数の CheckBox に、一度に全部チェックを入れたり外したりする操作を、クライアントサイドのスクリプトで実行する方法を書きます。

GridView 内の全 CheckBox をオン

書きますといっても、コードは 4 Guys From Rolla.com の ページ "Checking All CheckBoxes in a GridView Using Client-Side Script and a Check All" からほぼ丸写しさせてもらったものですが。

[Check All]ボタンをクリックすると、ヘッダーを含むすべての行の CheckBox にチェックが入るようになっています。[Uncheck All]ボタンをクリックすると、すべての行の CheckBox のチェックが外れるようになっています。

ヘッダーの CheckBox にチェックを入れると、各行に配置した CheckBox 全部にチェックが入ります。その状態から、ヘッダーの CheckBox のチェックを外すと、各行の CheckBox のチェックも外れるようになっています。

また、各行に配置した CheckBox に手動で一つ一つチェックを入れていって、すべての CheckBox にチェックが入った時、ヘッダーの CheckBox にもチェックが入るようになっています。その状態から、各行に配置した CheckBox の一つでもチェックを外すと、ヘッダーの CheckBox のチェックも外れるようになっています。

まずは普通の JavaScript を使って書きました。コードは以下の通りです。jQuery を使ってみましたが、かなりコード量を減らすことができるのは確かのようです。別途、jQuery バージョンもアップしますので、乞うご期待。(笑)

コードビハインド

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class _051_CheckUncheckAllCheckBoxesInGridView_1_ : System.Web.UI.Page
{
  DataTable CreateDataTable()
  {
    DataTable dt = new DataTable();
    DataRow dr;

    dt.Columns.Add(new DataColumn("Item", typeof(Int32)));
    dt.Columns.Add(new DataColumn("Name", typeof(string)));
    dt.Columns.Add(new DataColumn("Price", typeof(Int32)));

    for (int i = 0; i < 10; i++)
    {
      dr = dt.NewRow();
      dr["Item"] = i;
      dr["Name"] = "Item " + i.ToString();
      dr["Price"] = 123000 * (i + 1);
      dt.Rows.Add(dr);
    }
    return dt;
  }

  void Page_Load(Object sender, EventArgs e)
  {
    if (!IsPostBack)
    {
      GridView1.DataSource = CreateDataTable();
      GridView1.DataBind();
    }
  }

  protected void GridView1_DataBound(object sender, EventArgs e)
  {
    CheckBox cbHeader =
      (CheckBox)GridView1.HeaderRow.FindControl("CheckBox1");
   cbHeader.Attributes["onclick"] =
      "ChangeAllCheckBoxStates(this.checked);";

    List<string> ArrayValues = new List<string>();
    ArrayValues.Add(String.Concat("'", cbHeader.ClientID, "'"));

    foreach (GridViewRow row in GridView1.Rows)
    {
      CheckBox cb = (CheckBox)row.FindControl("CheckBox2");
      cb.Attributes["onclick"] = "ChangeHeaderAsNeeded();";
      ArrayValues.Add(String.Concat("'", cb.ClientID, "'"));
    }

    CheckBoxIDsArray.Text =
      "<script type=\"text/javascript\">\n" +
      "//<![CDATA[\n" +
      String.Concat("var CheckBoxIDs =  new Array(",
                     String.Join(",", ArrayValues.ToArray()),
                     ");\n"
                   ) +
      "//]]>\n" +
      "</script>";
  }
}

aspx ファイル

<%@ Page Language="C#" AutoEventWireup="true" 
  CodeFile="051_CheckUncheckAllCheckBoxesInGridView(1).aspx.cs" 
  Inherits="_051_CheckUncheckAllCheckBoxesInGridView_1_" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Check/Uncheck All CheckBoxes in a GridView</title>
  <script type="text/javascript">
    <!--
    function ChangeCheckBoxState(id, checkState) {
      var cb = document.getElementById(id);
      if (cb != null) {
        cb.checked = checkState;
      }
    }

    function ChangeAllCheckBoxStates(checkState) {
      if (CheckBoxIDs != null) {
        for (var i = 0; i < CheckBoxIDs.length; i++) {
          ChangeCheckBoxState(CheckBoxIDs[i], checkState);
        }
      }
    }

    function ChangeHeaderAsNeeded() {
      if (CheckBoxIDs != null) {
        for (var i = 1; i < CheckBoxIDs.length; i++) {
          var cb = document.getElementById(CheckBoxIDs[i]);
          if (!cb.checked) {
            ChangeCheckBoxState(CheckBoxIDs[0], false);
            return;
          }
        }
        ChangeCheckBoxState(CheckBoxIDs[0], true);
      }
    }
    //-->>
  </script>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <h2>Check/Uncheck All CheckBoxes</h2>
    <input type="button" 
      value="Check All" 
      onclick="ChangeAllCheckBoxStates(true);" /> 
    <input type="button" 
      value="Uncheck All" 
      onclick="ChangeAllCheckBoxStates(false);" />
        
    <asp:GridView ID="GridView1" 
      runat="server" 
      AutoGenerateColumns="False" 
      OnDataBound="GridView1_DataBound">
      <Columns>
        <asp:TemplateField>
          <HeaderTemplate>
            <asp:CheckBox runat="server" ID="CheckBox1" />
          </HeaderTemplate>
          <ItemTemplate>
            <asp:CheckBox runat="server" ID="CheckBox2" />
          </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField HeaderText="Item" DataField="Item" />
        <asp:BoundField HeaderText="Name" DataField="Name" />
        <asp:BoundField HeaderText="Price" DataField="Price" />
      </Columns>
    </asp:GridView>
    <asp:Literal ID="CheckBoxIDsArray" runat="server"></asp:Literal>    
  </div>
  </form>
</body>
</html>

--------------- 2010/10/8 追記 ---------------

上記は、普通の JavaScript を使ったものですが、jQuery を使って書き換えたものを別の記事 GridView 内の全 CheckBox をオン(jQuery) にアップしました。jQuery のセレクタのパワーを垣間見たような気がします。ぜひ違いを見てください。

Tags: ,

JavaScript

クライアント側の現地時刻取得

by WebSurfer 2010年10月6日 22:16

クライアントの現地時刻をサーバーで取得する方法です。

クライアントの現地時刻をサーバーで取得

例えば、クライアントが何かの帳票を要求した際、クライアントの現地時刻を帳票のフッターに書き込むような場合を考えます。

クライアントが日本国外(時差がある場所)にもいるような場合が問題です。サーバー側で持っている日時をクライアント側の現地時間に変換するのはかなり難しそうですので。

その代わりに、帳票の出力要求のタイミングで JavaScript を使ってクライアントの PC から日時を取得してサーバーに POST し、それをサーバーで処理することなら簡単にできそうです。

コードは下記のような感じです。あまり面白くないですね。(苦笑)

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
  protected void Page_Load(object sender, EventArgs e)
  {
    if (Page.IsPostBack)
    {
      Label1.Text = HiddenField1.Value;
    }
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
  <script type="text/javascript">
  <!--
    function SetLocalDateTimeNow() {
      var now = new Date();
      document.getElementById("HiddenField1").value = 
        now.getFullYear() + "年" +
        (now.getMonth() + 1) + "月" + now.getDate() + "日" +
        now.getHours() + "時" + now.getMinutes() + "分" + 
        now.getSeconds() + "秒";
    }
  //-->
  </script>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:Button ID="Button1" 
      runat="server" 
      Text="帳票に出力" 
      OnClientClick="SetLocalDateTimeNow();" />
    <br />
    <asp:Label ID="Label1" runat="server"></asp:Label>
    <input type="hidden" 
      name="HiddenField1" 
      id="HiddenField1" 
      value="" 
      runat="server" />
  </div>
  </form>
</body>
</html>

------------ 2010/4/24 追記 ------------

この記事で紹介したコードを実際に動かして試せるよう 実験室 にアップしました。興味のある方は試してみてください。

Tags:

JavaScript

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar