チェックボックスの GridView 列を追加する (VB)
このチュートリアルでは、チェック ボックスの列を GridView コントロールに追加して、ユーザーが GridView の複数の行を直感的に選択できるようにする方法について説明します。
はじめに
前のチュートリアルでは、特定のレコードを選択するために GridView にラジオ ボタンの列を追加する方法を調べました。 ラジオ ボタンの列は、ユーザーがグリッドから最大 1 つの項目を選択するように制限されている場合に適したユーザー インターフェイスです。 ただし、ユーザーがグリッドから任意の数の項目を選択できるようにする場合があります。 たとえば、Web ベースの電子メール クライアントでは、通常、チェック ボックスの列を含むメッセージの一覧が表示されます。 ユーザーは任意の数のメッセージを選択し、メールを別のフォルダーに移動したり、削除したりするなどのアクションを実行できます。
このチュートリアルでは、チェックボックスの列を追加する方法と、ポストバックでチェックされたチェックボックスを決定する方法について説明します。 特に、Web ベースの電子メール クライアントのユーザー インターフェイスを厳密に模倣する例を構築します。 この例では、各行にチェック ボックスが付いたデータベース テーブル内の製品を Products
一覧表示するページ付きの GridView を含めます (図 1 を参照)。 [選択した製品の削除] ボタンをクリックすると、選択した製品が削除されます。
図 1: 各製品行にはチェックボックスが含まれています (フルサイズの画像を表示する場合はクリックします)
手順 1: 製品情報をListsする Paged GridView の追加
チェック ボックスの列の追加について心配する前に、まず、ページングをサポートする GridView に製品を一覧表示することに焦点を当ててみましょう。 まず、フォルダー内のページをEnhancedGridView
CheckBoxField.aspx
開き、GridView をツールボックスからDesignerにドラッグし、 を ID
に設定しますProducts
。 次に、 という名前 ProductsDataSource
の新しい ObjectDataSource に GridView をバインドすることを選択します。 クラスを使用するように ObjectDataSource を ProductsBLL
構成し、 メソッドを GetProducts()
呼び出してデータを返します。 この GridView は読み取り専用であるため、UPDATE、INSERT、DELETE タブのドロップダウン リストを (None) に設定します。
図 2: 名前付きの ProductsDataSource
新しい ObjectDataSource を作成する (フルサイズの画像を表示する場合はクリックします)
図 3: メソッドを使用して GetProducts()
データを取得するように ObjectDataSource を構成する (フルサイズの画像を表示するにはクリックします)
図 4: UPDATE、INSERT、および DELETE タブの Drop-Down Lists を に設定します ([なし] をクリックするとフルサイズの画像が表示されます)
データ ソースの構成ウィザードが完了すると、Visual Studio によって、製品関連のデータ フィールドに対して BoundColumns と CheckBoxColumn が自動的に作成されます。 前のチュートリアルで行ったように、、CategoryName
、および BoundFields を除くProductName
すべてを削除しUnitPrice
、プロパティを HeaderText
Product、Category、Price に変更します。 BoundField を UnitPrice
構成して、その値が通貨として書式設定されるようにします。 また、スマート タグの [ページングを有効にする] チェック ボックスをオンにして、ページングをサポートするように GridView を構成します。
選択した製品を削除するためのユーザー インターフェイスも追加してみましょう。 GridView の下にボタン Web コントロールを追加し、その コントロールを ID
に DeleteSelectedProducts
設定し、その Text
プロパティを [選択した製品の削除] に設定します。 実際にデータベースから製品を削除するのではなく、この例では、削除された製品を示すメッセージだけを表示します。 これに対応するには、[ボタン] の下にラベル Web コントロールを追加します。 その ID を に DeleteResults
設定し、そのプロパティを Text
クリアし、その Visible
プロパティと EnableViewState
プロパティを に False
設定します。
これらの変更を行った後、GridView、ObjectDataSource、Button、および Label の宣言型マークアップは次のようになります。
<p>
<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
AllowPaging="True" EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True" SortExpression="CategoryName" />
<asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
HeaderText="Price" HtmlEncode="False"
SortExpression="UnitPrice" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>
</p>
<p>
<asp:Button ID="DeleteSelectedProducts" runat="server"
Text="Delete Selected Products" />
</p>
<p>
<asp:Label ID="DeleteResults" runat="server" EnableViewState="False"
Visible="False"></asp:Label>
</p>
ブラウザーでページを表示します (図 5 を参照)。 この時点で、最初の 10 個の製品の名前、カテゴリ、価格が表示されます。
図 5: 最初の 10 個の製品の名前、カテゴリ、および価格が一覧表示されています (フルサイズの画像を表示する をクリックします)
手順 2: チェックボックスの列を追加する
ASP.NET 2.0 には CheckBoxField が含まれるため、GridView にチェックボックスの列を追加するために使用できると考えられる場合があります。 残念ながら、CheckBoxField はブール型のデータ フィールドを操作するように設計されているため、そうではありません。 つまり、CheckBoxField を使用するには、値が参照される基になるデータ フィールドを指定して、レンダリングされたチェック ボックスがオンになっているかどうかを判断する必要があります。 CheckBoxField を使用して、チェック ボックスをオフにした列だけを含めることはできません。
代わりに、TemplateField を追加し、CheckBox Web コントロールを その ItemTemplate
に追加する必要があります。 先に進み、GridView に TemplateField を Products
追加し、最初の (左端) フィールドにします。 GridView のスマート タグから [テンプレートの編集] リンクをクリックし、ツールボックスから CheckBox Web コントロールを に ItemTemplate
ドラッグします。 この CheckBox s プロパティを ID
に ProductSelector
設定します。
図 6: TemplateFields に名前付きの ProductSelector
CheckBox Web コントロールを追加する (フルサイズのItemTemplate
画像を表示する 場合はクリックします)
TemplateField と CheckBox Web コントロールが追加された状態で、各行にチェックボックスが含まれるようになりました。 図 7 は、TemplateField と CheckBox が追加された後に、ブラウザーで表示された場合のこのページを示しています。
図 7: 各製品行にチェックボックスが含まれるようになりました (フルサイズの画像を表示する場合はクリックします)
手順 3: ポストバック時にチェックされたチェック ボックスを決定する
この時点で、チェック ボックスの列がありますが、ポストバックでチェックされたチェック ボックスを決定する方法はありません。 ただし、[選択した製品の削除] ボタンをクリックすると、それらの製品を削除するためにチェック されたチェック ボックスを知る必要があります。
GridView の Rows
プロパティ を使用すると、GridView 内のデータ行にアクセスできます。 これらの行を反復処理し、プログラムによって CheckBox コントロールにアクセスし、そのプロパティを Checked
参照して CheckBox が選択されているかどうかを確認できます。
Button Web コントロールの Click
イベントのイベント ハンドラーをDeleteSelectedProducts
作成し、次のコードを追加します。
Protected Sub DeleteSelectedProducts_Click(sender As Object, e As EventArgs) _
Handles DeleteSelectedProducts.Click
Dim atLeastOneRowDeleted As Boolean = False
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = row.FindControl("ProductSelector")
If cb IsNot Nothing AndAlso cb.Checked Then
' Delete row! (Well, not really...)
atLeastOneRowDeleted = True
' First, get the ProductID for the selected row
Dim productID As Integer = _
Convert.ToInt32(Products.DataKeys(row.RowIndex).Value)
' "Delete" the row
DeleteResults.Text &= String.Format( _
"This would have deleted ProductID {0}<br />", productID)
'... To actually delete the product, use ...
' Dim productAPI As New ProductsBLL
' productAPI.DeleteProduct(productID)
'............................................
End If
Next
' Show the Label if at least one row was deleted...
DeleteResults.Visible = atLeastOneRowDeleted
End Sub
プロパティは Rows
、GridView の GridViewRow
データ行を構成するインスタンスのコレクションを返します。 ここでのループは For Each
、このコレクションを列挙します。 オブジェクトごとに GridViewRow
、行の CheckBox には を使用して row.FindControl("controlID")
プログラムでアクセスします。 CheckBox がオンの場合、対応する ProductID
行の値がコレクションから DataKeys
取得されます。 この演習では、単に Label に有益なメッセージをDeleteResults
表示しますが、実際のアプリケーションでは、代わりに クラスの DeleteProduct(productID)
メソッドを呼び出しますProductsBLL
。
このイベント ハンドラーを追加すると、[選択した製品の削除] ボタンをクリックすると、選択した製品の が表示 ProductID
されるようになります。
図 8: [選択した製品の削除] ボタンがクリックされると、選択した製品 ProductID
が一覧表示されます (クリックするとフルサイズの画像が表示されます)
手順 4: [すべてチェック] ボタンと [すべてのチェック ボックスをオフにする] ボタンを追加する
ユーザーが現在のページ上のすべての製品を削除する場合は、各 10 個のチェック ボックスをチェックする必要があります。 このプロセスを迅速化するには、[すべて確認] ボタンを追加します。このボタンをクリックすると、グリッド内のすべてのチェック ボックスが選択されます。 [すべてオフ] ボタンも同様に役立ちます。
ページに 2 つのボタン Web コントロールを追加し、GridView の上に配置します。 最初の s ID
を に CheckAll
設定し、その Text
プロパティを Check All に設定し、2 番目の s ID
を に UncheckAll
設定し、その Text
プロパティを [すべてオフ] に設定します。
<asp:Button ID="CheckAll" runat="server" Text="Check All" />
<asp:Button ID="UncheckAll" runat="server" Text="Uncheck All" />
次に、呼び出されたときに GridView のコレクションを列挙Products
し、各 CheckBox Checked
のRows
プロパティを、渡された checkState パラメーターの値に設定するという名前ToggleCheckState(checkState)
の分離コード クラスに メソッドを作成します。
Private Sub ToggleCheckState(ByVal checkState As Boolean)
' Iterate through the Products.Rows property
For Each row As GridViewRow In Products.Rows
' Access the CheckBox
Dim cb As CheckBox = row.FindControl("ProductSelector")
If cb IsNot Nothing Then
cb.Checked = checkState
End If
Next
End Sub
次に、 ボタンと UncheckAll
ボタンのイベント ハンドラーをCheckAll
作成Click
します。 イベント ハンドラーではCheckAll
、 で をUncheckAll
ToggleCheckState(False)
呼び出ToggleCheckState(True)
すだけです。
Protected Sub CheckAll_Click(sender As Object, e As EventArgs) _
Handles CheckAll.Click
ToggleCheckState(True)
End Sub
Protected Sub UncheckAll_Click(sender As Object, e As EventArgs) _
Handles UncheckAll.Click
ToggleCheckState(False)
End Sub
このコードでは、[すべて確認] ボタンをクリックするとポストバックが発生し、GridView 内のすべてのチェック ボックスがオンになります。 同様に、[すべてオフ] をクリックすると、すべてのチェック ボックスがオフになります。 図 9 は、[すべて確認] ボタンをオンにした後の画面を示しています。
図 9: [すべてチェック] ボタンをクリックすると、すべてのチェックボックスが選択されます (クリックするとフルサイズの画像が表示されます)
注意
チェックボックスの列を表示する場合、すべてのチェックボックスを選択または選択解除する方法の1つは、ヘッダー行のチェックボックスを使用することです。 さらに、現在の Check All/Uncheck All 実装にはポストバックが必要です。 ただし、チェック ボックスは、クライアント側のスクリプトを使用して完全にオンまたはオフにできるため、よりわかりやすいユーザー エクスペリエンスが提供されます。 クライアント側の手法の使用に関する説明と共に、[すべてチェック] と [すべてオフ] のヘッダー行のチェック ボックスを使用して詳しく調べるには、「Client-Side スクリプトを使用して GridView のすべての CheckBox をチェックする」と「Check All CheckBox」をチェックします。
まとめ
続行する前に、ユーザーが GridView から任意の数の行を選択できるようにする必要がある場合は、チェックボックスの列を追加することが 1 つのオプションです。 このチュートリアルで説明したように、GridView にチェック ボックスの列を含めると、CheckBox Web コントロールを使用して TemplateField を追加する必要があります。 Web コントロールを使用して (前のチュートリアルで行ったように、テンプレートにマークアップを直接挿入する代わりに) ASP.NET は、CheckBoxes の内容を自動的に記憶し、ポストバック全体でチェックされませんでした。 また、プログラムによってコード内の CheckBox にアクセスして、特定の CheckBox がチェックされているかどうかを判断したり、チェック状態を変更したりすることもできます。
このチュートリアルと最後のチュートリアルでは、GridView に行セレクター列を追加する方法について説明しました。 次のチュートリアルでは、少しの作業で、GridView に挿入機能を追加する方法について説明します。
幸せなプログラミング!
著者について
7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 にアクセスmitchell@4GuysFromRolla.comすることも、ブログを介して アクセスすることもできます。これは でhttp://ScottOnWriting.NET確認できます。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示