-
ASP.NET Web ページを作成します。
-
ツールボックスからページに ScriptManager コンポーネントをドラッグします。
-
ツールボックスからページに WebDataGrid コントロールをドラッグします。
-
ツールボックスから SqlDataSource コントロールをページにドラッグします。
-
Northwind データベースから製品情報を取得するように SqlDataSource を設定します。
<asp:SqlDataSource id="ds" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [ProductID], [ProductName], [QuantityPerUnit], [UnitPrice], [UnitsInStock], [UnitsOnOrder], [ReorderLevel] FROM [Products]" >
</asp:SqlDataSource>
-
WebDataGrid の DataSourceID を SqlDataSource の ID に等しく設定します(この場合、ID は "ds")。この変更を行ったら、デザイナーが SqlDataSource から読み取るように WebDataGrid を構成します。
-
WebDataGrid の DataKeyFields プロパティに正しい値が入っていることを検証します。この例では、DataKeyFields は ProductID に等しくなければなりません。
-
次に、ページングと選択動作を有効にする必要があります。スマートタグ デザインを使用して、またはマークアップで直接これらの項目を構成できます。以下のリストは、ASP.NET マークアップでページング(デフォルト設定)および選択(いくつかのカスタマイズにより)を構成する方法を示します。
<ig:WebDataGrid ID="grid"
AutoGenerateColumns="True"
DataSourceID="ds"
DataKeyFields="ProductID"
Width="800px"
Height="300px"
runat="server">
<Behaviors>
<ig:RowSelectors />
<ig:Paging />
<ig:Selection
CellClickAction="Row"
EnableCrossPageSelection="True"
RowSelectType="Multiple" />
</Behaviors>
</ig:WebDataGrid>
AutoGenerateColumns プロパティは "True" に設定されます。関連フィールドのみが SqlDatasource で選択されるからです。以前述べたように、DataSourceID は "ds" に設定されるため、データ アクセスのために添付の SqlDataSource コントロールを使用します。DataKeyFields プロパティは、グリッドにデータを表示する時に使用されるプライマリ キー フィールドをリストします。この事例では、プライマリ キー フィールドは ProductID です。幅と高さプロパティとして、フルサイズ ページのグリッドに適正な値が提供されます。
グリッドで次に動作コレクションが定義されます。RowSelectors 動作と Paging 動作は有効でデフォルト値と使用されます。選択動作は有効でいくつかのカスタマイズを含んでいます。グリッドの単一セルをクリックしただけでも、グリッドが行全体を選択できるように、CellClickAction 属性が行に設定されます。属性 EnableCrossPageSelection は True に設定され、データの異なるページがスコープ内に入った後で、選択を永続させるために追跡動作を有効にすることを担当します。最後に、グリッド全体で複数行を選択する機能をユーザーに与えるために、RowSelectType 属性が Multiple に設定されます。
-
これで、異なるページで複数選択を受け入れて追跡するようにグリッドの動作が構成されます。次の手順はページでコードを更新し、さらなる処理のために選択されたレコード情報を抽出します。
グリッドが選択アクションを処理するためには、SelectedRows イベントにイベント ハンドラーを定義する必要があります。これを実行するにはデザイン ビューに切り替えて、[プロパティ] ペインでイベント リストを指定します。[プロパティ] ウィンドウで、[動作] リストの Selection.RowSelectionChanged を見つけ、このイベントをダブルクリックします。IDE は、イベント ハンドラーがスタブされてコード ビハインド ウィンドウを開きます。
-
次に以下のリストに一致するようにメソッド スタブを更新します。
using System;
using System.Collections.Generic;
using Infragistics.Web.UI.GridControls;
...
protected void grid_RowSelectionChanged(object sender, SelectedRowEventArgs e)
{
IList<int> ids = new List<int>();
int id = 0;
int index = 0;
foreach (GridRecord row in e.CurrentSelectedRows)
{
if (row == null)
{
IDPair pair = e.CurrentSelectedRows.GetIDPair(index);
id = Convert.ToInt32(pair.Key[0]);
}
else
{
id = Convert.ToInt32(row.DataKey[0]);
}
if (!ids.Contains(id))
{
ids.Add(id);
}
index++;
}
// TODO:選択された ID を使用してデータベースを更新し、
// サービスまたはその他の操作を呼び出します
System.Diagnostics.Debug.WriteLine(ids.Count);
}
このリスト作成で収集されたレコード情報の結果、ProductIDs のリストができあがります。このリストができたら、値をデータ レイヤー、サービス レイヤーに渡す、またはアプリケーションが必要とする任意の方法で処理することができます。
上から開始し、ids という名前の一般的なリストが作成されます。このリストはグリッドの選択行から各 ID を追跡します。コードで後で変数をサポートするために次の 2 つの変数、id と index が使用され、コンテキストで検討されます。
このコードの次のセクションは、グリッド内の選択行を循環するために使用される foreach ループです。上記で説明したように、選択行にはスコープ内行とスコープ外行の 2 タイプあります。選択された項目をループする間、イベント ハンドラーは、ループの行が null かどうかを確認するためにチェックします。行が null の場合、別のページで行が選択されたか、グリッドの仮想スクロールにあります。したがって、GridRecord に直接アクセスする代わりに、CurrentSelectedRows コレクションから GetIDPair を呼び出すためにイベント引数が質問されます。GetIDPair は行のインデックス値を必要とします。index という名前の変数は以前に 0 に初期化されており、メソッドの終わりに増分されます。これによって、インデックス値に、GetIDPair に渡すために使用可能な現在の行のインデックス値が常にあることを保証します。GetIDPairMethod は IDPair クラスのインスタンスを返します。
IDPair クラスは、スコープ外の選択行の主要情報の保持を担当します。IDPair のインスタンスを持ったら、次に主要な値を見つけ出すために Key プロパティにアクセスできます。IDPair クラスは複数列キーを処理できることに注意してください。これによりこのレコードのキーとして単一の ProductID 値を見つけるためにインデクサーが使用されます。結果は整数としてキャストされ(データベース テーブル内のフィールドのデータ タイプ)、id 変数値に設定されます。
あるいは、選択行がスコープ内にある場合、DataKey プロパティをクエリすることによって GridRecord のインスタンスに直接アクセスできます(繰り返しになりますが、DataKey は複数列キーをサポートします。このためインデクサーが必要とされます)。
キー値がどちらか一方の方法で指定されたら、リストにまだ存在しない場合には id がリストに追加されます。完全に移植されたリストにより、開発者はアプリケーションに適した方法で選択行の処理を続行することを選択できます。
上記の例は、永続的な選択を示すためにページングを使用しました。仮想スクロールに対してこの動作を有効にするために、全く同じコード ビハインドが機能し、ページングの代わりに仮想スクロールを使用するように ASP.NET マークアップを更新するだけです。
<ig:WebDataGrid ID="grid"
AutoGenerateColumns="True"
DataSourceID="ds"
DataKeyFields="ProductID"
Width="800px"
Height="300px"
runat="server">
<Behaviors>
<ig:RowSelectors />
<ig:VirtualScrolling />
<ig:Selection
CellClickAction="Row"
EnableCrossPageSelection="True"
RowSelectType="Multiple" />
</Behaviors>
</ig:WebDataGrid>