SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

ASP.NET 3.5の新しいListViewコントロールを使用する

最小限のコードでデータの表示/CRUDができるListViewコントロール

ダウンロード サンプルソース (4.8 KB)

ListViewコントロールでのデータの編集

 これまでの説明でお分かりのように、ListViewコントロールを使用してデータを表示することは比較的簡単です。さらに、ListView内のデータをユーザーに編集させることも可能です。サンプルWebサイトに「ListViewEditExample.aspx」という名前の新しいASP.NETページを追加し、そのコードをリスト2のように変更します。

リスト2 編集可能なListView
<%@ Page Language="C#" %>
<script runat="server">
void deptsView_ItemUpdated(object sender, 
 ListViewUpdatedEventArgs e)
{
 lblResult.Text = e.AffectedRows.ToString() + 
  " row(s) successfully updated";
}

void deptsView_PagePropertiesChanged(object sender, EventArgs e)
{
 //Set the text to empty when navigating to a different page
 lblResult.Text = "";
}    
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
 <link rel="Stylesheet" type="text/css" href="StyleSheet.css" />
 <title>Editing Data using ListView Control</title>
</head>
<body>
 <form id="form1" runat="server">
  <div>
   <asp:ListView ID="ContactsListView" DataSourceID="deptSource" 
    DataKeyNames="DepartmentID" runat="server" 
    OnItemUpdated="deptsView_ItemUpdated"
    OnPagePropertiesChanged="deptsView_PagePropertiesChanged">
    <LayoutTemplate>
     <table cellpadding="2" width="640px" border="1" 
      runat="server" id="tblProducts">
      <tr id="row1" runat="server" class="header">              
       <th id="header2" runat="server">Name</th>
       <th id="header3" runat="server">Group Name</th>
       <th id="header1" runat="server">Action</th>
      </tr>
      <tr runat="server" id="itemPlaceholder" />
     </table>
     <asp:DataPager runat="server" ID="deptsDataPager" 
      PageSize="3">
      <Fields>
       <asp:NextPreviousPagerField ShowFirstPageButton="True" 
        ShowLastPageButton="True" FirstPageText="|<< " 
        LastPageText=" >>|" NextPageText=" > " 
        PreviousPageText=" < " />
      </Fields>
     </asp:DataPager>
    </LayoutTemplate>
    <ItemTemplate>
     <tr id="row2" runat="server">            
      <td>
       <asp:Label ID="lblName" runat="Server" 
        Text='<%#Eval("Name") %>' />
      </td>
      <td valign="top">
       <asp:Label ID="lblGroupName" runat="Server" 
        Text='<%#Eval("GroupName") %>' />
      </td>
      <td>
       <asp:LinkButton ID="btnEdit" runat="Server" Text="Edit" 
        CommandName="Edit" />
      </td>
     </tr>
    </ItemTemplate>
    <EditItemTemplate>
     <tr style="background-color: #ADD8E6">            
      <td>
       <asp:TextBox ID="txtName" runat="server" 
        Text='<%# Bind("Name") %>' 
        MaxLength="50" /><br />
      </td>
      <td>
       <asp:TextBox ID="txtGroupName" runat="server" Text='<%# 
        Bind("GroupName") %>' MaxLength="50" /><br />
      </td>
      <td>
       <asp:LinkButton ID="btnUpdate" runat="server" 
        CommandName="Update" Text="Update" /> 
       <asp:LinkButton ID="btnCancel" runat="server" 
        CommandName="Cancel" Text="Cancel" />
      </td>
     </tr>
    </EditItemTemplate>
   </asp:ListView>
   <asp:SqlDataSource ID="deptSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:AdventureWorks %>"
    SelectCommand="SELECT [DepartmentID],[Name],[GroupName] FROM 
    HumanResources.Department" UpdateCommand="UPDATE 
    HumanResources.Department SET Name = @Name, 
    GroupName = @GroupName WHERE DepartmentID = @DepartmentID">
   </asp:SqlDataSource>
   <br /><br />
   <asp:Label runat="server" ID="lblResult" Text="" 
    Font-Bold="true" />
  </div>
 </form>
</body>
</html>

 リスト2のコードは、項目が編集モードの場合にEditItemTemplate要素を使用してコンテンツを生成する方法と、SqlDataSourceコントロールを通じてデータベースを更新する方法を示しています。

 最初に、SqlDataSourceコントロールのUpdateCommandプロパティに、実行するSQL文を指定します。このSQL文が実行されると、ユーザー指定の最新の値でデータベースが更新されます。

   <asp:SqlDataSource ID="deptSource" runat="server" 
       ConnectionString="<%$ ConnectionStrings:AdventureWorks %>"
       SelectCommand="SELECT [DepartmentID],[Name],[GroupName] FROM 
       HumanResources.Department" UpdateCommand="UPDATE 
       HumanResources.Department SET Name = @Name,
       GroupName = @GroupName WHERE DepartmentID = @DepartmentID">
      </asp:SqlDataSource>

 次に、ItemTemplate要素に、ユーザーが項目を編集するときにクリックするリンクを指定します。

   <ItemTemplate>
      ----
      ----
      <asp:LinkButton ID="btnEdit" runat="Server" Text="Edit" 
       CommandName="Edit" />
     </td>
    </tr>
   </ItemTemplate>

 続けて、EditItemTemplateを指定します。ここでは、更新後の部門のNameやGroupNameを入力するテキストボックスと、現在の操作をコミット("Update")またはキャンセル("Cancel")するためのリンクを定義します。

   <EditItemTemplate>
    <tr style="background-color: #ADD8E6">            
     <td>
      <asp:TextBox ID="txtName" runat="server" 
       Text='<%# Bind("Name") %>' 
       MaxLength="50" /><br />
     </td>
     <td>
      <asp:TextBox ID="txtGroupName" runat="server" Text='<%# 
       Bind("GroupName") %>' MaxLength="50" /><br />
     </td>
     <td>
      <asp:LinkButton ID="btnUpdate" runat="server" 
       CommandName="Update" Text="Update" />&nbsp;
      <asp:LinkButton ID="btnCancel" runat="server" 
       CommandName="Cancel" Text="Cancel" />
     </td>
    </tr>
   </EditItemTemplate>

 LinkButtonのアクションは、CommandNameプロパティを目的の値(表2を参照)に設定することにより定義します。

表2 LinkButtonのCommandNameプロパティに指定できる値
説明
Cancel 現在の操作をキャンセルします。
Delete 現在選択されている項目をデータソースから削除します。
Edit ListViewを編集モードに切り替え、EditItemTemplate要素で指定されるコンテンツを表示します。
Insert データソースコントロール内の値を新しいレコードとしてデータソースに保存します。
Update データソースコントロール内の値でデータソースを更新します。

 更新の終了時に、ListViewコントロールはOnItemUpdatedイベントを発生します。このイベントを使用して、ユーザーに対して更新の状態を確認することができます。リスト2のコードでは、ListViewコントロールは2つのイベントを処理しています。

  1. OnItemUpdated ― 名前が示すとおり、このイベントでは、更新処理の最後にカスタムルーチンを実行できます。上記のコードでは、このイベントを使用して、影響を受けたレコード数をユーザーに通知しています。
  2. OnPagePropertiesChanged ― ListViewは、ページプロパティが変更されるときにこのイベントを発生します。リスト内のコードでは、このイベントを使用して、Labelコントロールに格納されているテキストを消去しています。

 ListViewが設定された状態で、ブラウザを使ってこのページにアクセスすると、図2のような出力が得られます。

図2 編集可能なListView。編集可能として設定したListViewコントロールでは、各レコードに対してEditリンクが表示される。このリンクをクリックすると、ListViewコントロールのコンテンツが編集モードに切り替わる
図2 編集可能なListView。編集可能として設定したListViewコントロールでは、各レコードに対してEditリンクが表示される。このリンクをクリックすると、ListViewコントロールのコンテンツが編集モードに切り替わる

 「Edit」ハイパーリンクをクリックすると、ListViewはEditItemTemplateを使用して図3のようなテキストボックスを表示します。ユーザーはこのテキストボックスで、選択されている項目を編集できます。

図3 編集モード。編集モードでは、EditItemTemplate要素によってテキストボックスが生成される。ユーザーはこのテキストボックスに、NameフィールドとGroupNameフィールドの更新後の値を入力できる
図3 編集モード。編集モードでは、EditItemTemplate要素によってテキストボックスが生成される。ユーザーはこのテキストボックスに、NameフィールドとGroupNameフィールドの更新後の値を入力できる

 編集モードでは、右側の列に「Update」リンクと「Cancel」リンクが表示されます。「Update」リンクをクリックして変更をデータベースに保存すると、OnItemUpdatedイベントによって影響を受けたレコード数が表示されます(図4を参照)。

図4 影響を受けたレコード。更新プロセスの終了時に、更新操作の影響を受けたレコード数がLabelコントロールに表示される
図4 影響を受けたレコード。更新プロセスの終了時に、更新操作の影響を受けたレコード数がLabelコントロールに表示される

 ListViewコントロールの主要な機能に関する説明はこれで終わりです。

 本稿では、この機能を使用した例を2つ紹介しました。1つ目の例では、単純なデータドリブンのWebページを作成しました。2つ目の例では、適切な編集と確認のマークアップを指定して、コントロールの更新機能を宣言的に利用する複雑なページを作成しました。また、ListViewコントロールが生成するイベントの処理方法についても説明しました。

 おわかりのように、ListViewの拡張的な特性を利用すると、実行時の動作を各自のニーズに合わせて簡単にカスタマイズできます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Thiru Thangarathinam(Thiru Thangarathinam)

オブジェクト指向アプリケーション開発方法論を用いたアプリケーションのアーキテクチャ設計、設計、開発、および実装に関して約6年の経験を持つ。ソフトウェアライフサイクル(設計、開発およびテスト)にも精通。ASP.NET、.NET Framework、Visual C#.NET、Visual Basic.NET、ADO.NET、XML Webサービス、および.NET Remotingのエキスパートであり、MCAD...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2908 2008/09/03 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー