DataGrid コントロールおよび DataGridEvent クラスでは、ユーザーの操作に応答する数種類のイベントタイプを定義します。例えば Flex では、ユーザーが DataGrid コントロールのアイテムをクリックすると、typ プロパティの値が mx.events.ListEvent.ITEM_CLICK(「itemClick」)に設定された mx.events.ListEvent クラスのイベントがブロードキャストされます。このイベントは次の例のように処理できます。
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.events.ListEvent;
private function itemClickEvent(event:ListEvent):void {
clickColumn.text=String(event.columnIndex);
clickRow.text=String(event.rowIndex);
eventType.text=event.type;
}
]]>
</mx:Script>
<mx:DataGrid id="myGrid" width="350" height="150"
itemClick="itemClickEvent(event);" x="112" y="10">
<mx:ArrayCollection>
<mx:Object Artist="Pavement" Price="11.99"
Album="Slanted and Enchanted" />
<mx:Object Artist="Pavement" Album="Brighten the Corners"
Price="11.99" />
</mx:ArrayCollection>
</mx:DataGrid>
<mx:Label x="100" y="200" text="Column index"/>
<mx:Label x="100" y="254" text="Row index"/>
<mx:Label x="100" y="306" text="Type"/>
<mx:TextArea id="clickColumn" x="191" y="199"/>
<mx:TextArea id="clickRow" x="191" y="253"/>
<mx:TextArea id="eventType" x="191" y="305"/>
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
この例では、イベントハンドラを使用して、列のインデックス、行のインデックスおよびイベントタイプを 3 つの TextArea コントロールに表示しています。
DataGrid コントロールの列のインデックスはゼロベースです。つまり、0、1、2、...、, n-1 の値で、n は列の総数です。 - 行のアイテムにも、0 から始まるインデックスが付けられます。したがって、2 行目の最初のアイテムを選択すると、この例では列のインデックスの TextArea には 0 が、行のインデックスの TextArea には 1 が表示されます。
イベントハンドラで選択したアイテムにアクセスするには、次の例のコードのように、イベントオブジェクトの currentTarget プロパティ、および DataGrid コントロールの selectedItem プロパティを使用します。
var selectedArtist:String=event.currentTarget.selectedItem.Artist;
イベントハンドラに渡されるオブジェクトの currentTarget プロパティには、DataGrid コントロールへの参照が設定されています。currentTarget にピリオドとプロパティ名を続けて使用すれば、コントロールのあらゆるプロパティを参照できます。currentTarget.selectedItem フィールドには選択されたアイテムが設定されます。
DataGrid コントロールは、ソートされたデータの表示について 2 種類の方法をサポートしています。
Sort クラスおよび SortField クラスの使用方法について詳しくは、表示するデータのソートとフィルタを参照してください。
DataGrid の最初のソート順序を指定するには、データプロバイダをソートします。様々な方法が可能ですが、Flex のコレクションのビルトイン機能を最大限活用できるのは次の方法です。
DataGrid および DataGridColumn の次に示すプロパティは、ユーザーがデータをソートできる方法を制御します。
デフォルトでは、DataGrid クラスは独自のソートコードを使用して、ユーザーが列をクリックした際のデータのソート方法を制御します。この動作をオーバーライドするには、headerRelease イベントハンドラを作成して、ユーザーが列ヘッダーをクリックした際に生成される DataGridEvent のイベントを制御します。このイベントハンドラは以下の内容を実行する必要があります。
次の例は、ユーザーが DataGrid の列ヘッダーをクリックした際に、headerRelease イベントハンドラを使用して複数列のソートを実行する方法を示しています。
次の例は、コレクションを Sort オブジェクトとともに使用して最初の複数行ソートを決定し、ヘッダーをクリックした際の列のソート方法を制御する方法を示しています。データグリッドは最初、1 番目に在庫状況、2 番目にアーティスト、3 番目にアルバム名の順でソートされます。いずれかのヘッダーをクリックすると、その列が第 1 ソート基準となり、それまでの第 1 基準が第 2 基準に、第 2 基準が第 3 基準になります。
<?xml version="1.0"?>
<!-- dpcontrols/DataGridSort.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
initialize="initDP();" width="550" height="400">
<mx:Script>
<![CDATA[
import mx.events.DataGridEvent;
import mx.collections.*;
// Declare storage variables and initialize the simple variables.
// The data provider collection.
private var myDPColl:ArrayCollection;
// The Sort object used to sort the collection.
[Bindable]
private var sortA:Sort;
// The sort fields used to determine the sort.
private var sortByInStock:SortField;
private var sortByArtist:SortField;
private var sortByAlbum:SortField;
private var sortByPrice:SortField;
// The data source that populates the collection.
private var myDP:Array = [
{Artist:'Pavement', Album:'Slanted and Enchanted',
Price:11.99, InStock: true},
{Artist:'Pavement', Album:'Crooked Rain, Crooked Rain',
Price:10.99, InStock: false},
{Artist:'Pavement', Album:'Wowee Zowee',
Price:12.99, InStock: true},
{Artist:'Asphalt', Album:'Brighten the Corners',
Price:11.99, InStock: false},
{Artist:'Asphalt', Album:'Terror Twilight',
Price:11.99, InStock: true},
{Artist:'Asphalt', Album:'Buildings Meet the Sky',
Price:14.99, InStock: true},
{Artist:'Other', Album:'Other', Price:5.99, InStock: true}
];
//Initialize the DataGrid control with sorted data.
private function initDP():void {
//Create an ArrayCollection backed by the myDP array of data.
myDPColl = new ArrayCollection(myDP);
//Create a Sort object to sort the ArrrayCollection.
sortA = new Sort();
//Initialize SortField objects for all valid sort fields:
// A true second parameter specifies a case-insensitive sort.
// A true third parameter specifies descending sort order.
// A true fourth parameter specifies a numeric sort.
sortByInStock = new SortField("InStock", true, true);
sortByArtist = new SortField("Artist", true);
sortByAlbum = new SortField("Album", true);
sortByPrice = new SortField("Price", true, false, true);
// Sort the grid using the InStock, Artist, and Album fields.
sortA.fields=[sortByInStock, sortByArtist, sortByAlbum];
myDPColl.sort=sortA;
// Refresh the collection view to show the sort.
myDPColl.refresh();
// Initial display of sort fields
tSort0.text = "First Sort Field: InStock";
tSort1.text = "Second Sort Field: Artist";
tSort2.text = "Third Sort Field: Album";
// Set the ArrayCollection as the DataGrid data provider.
myGrid.dataProvider=myDPColl;
// Set the DataGrid row count to the array length,
// plus one for the header.
myGrid.rowCount=myDPColl.length +1;
}
// Re-sort the DataGrid control when the user clicks a header.
private function headRelEvt(event:DataGridEvent):void {
// The new third priority was the old second priority.
sortA.fields[2] = sortA.fields[1];
tSort2.text = "Third Sort Field: " + sortA.fields[2].name;
// The new second priority was the old first priority.
sortA.fields[1] = sortA.fields[0];
tSort1.text = "Second Sort Field: " + sortA.fields[1].name;
// The clicked column determines the new first priority.
if (event.columnIndex==0) {
sortA.fields[0] = sortByArtist;
} else if (event.columnIndex==1) {
sortA.fields[0] = sortByAlbum;
} else if (event.columnIndex==2) {
sortA.fields[0] = sortByPrice;
} else {
sortA.fields[0] = sortByInStock;}
tSort0.text = "First Sort Field: " + sortA.fields[0].name;
// Apply the updated sort fields and re-sort.
myDPColl.sort=sortA;
// Refresh the collection to show the sort in the grid.
myDPColl.refresh();
// Prevent the DataGrid from doing a default column sort.
event.preventDefault();
}
]]>
</mx:Script>
<!-- The Data Grid control.
By default the grid and its columns can be sorted by clicking.
The headerRelease event handler overrides the default sort
behavior. -->
<mx:DataGrid id="myGrid" width="100%" headerRelease="headRelEvt(event);">
<mx:columns>
<mx:DataGridColumn minWidth="120" dataField="Artist" />
<mx:DataGridColumn minWidth="200" dataField="Album" />
<mx:DataGridColumn width="75" dataField="Price" />
<mx:DataGridColumn width="75" dataField="InStock"
headerText="In Stock"/>
</mx:columns>
</mx:DataGrid>
<mx:VBox>
<mx:Label id="tSort0" text="First Sort Field: "/>
<mx:Label id="tSort1" text="Second Sort Field: "/>
<mx:Label id="tSort2" text="Third Sort Field: "/>
</mx:VBox>
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
DataGrid コントロールは、マウスおよびキーボードの操作に応答します。マウスクリックやキーの押し下げに対する応答は、セルが編集可能かどうかによって異なります。セルが含まれている DataGrid コントロールおよび DataGridColumn の editable プロパティが共に true に設定されている場合、そのセルは編集可能です。編集可能なセル内をクリックすると、そのセルにフォーカスが移動します。編集不可能なセルをクリックしても、フォーカスは変化しません。
ユーザーは次の方法で、DataGrid コントロールの外観を変更できます。
DataGrid コントロールでは次のキーボード操作ができます。
|
キー |
アクション |
|---|---|
|
Enter Return Shift + Enter |
セルが編集可能な場合に、変更を確定して、同じ列の上下いずれかのセルに編集対象を変更します。上下どちらのセルに移動するかは、Shift キーが押されているかどうかによって決まります。 |
|
Tab |
フォーカスを次の編集可能セルに移動します。編集可能かどうかは行方向に向かって調べていきます。最後の行の最後のセルからは、親コンテナ内でフォーカスを取得できる次のエレメントに移動します。 |
|
Shift + Tab |
フォーカスを前の編集可能セルに移動します。行の先頭でこのキーを押した場合、前の行の末尾に移動します。最初の行の先頭からは、親コンテナ内でフォーカスを取得できる前のエレメントに移動します。 |
|
↑(上向き矢印)Home Page Up |
セルを編集中の場合には、カーソルがセルのテキストの先頭に移動します。セルが編集不可能な場合は、1 つ上のアイテムが選択されます。 |
|
↓(下向き矢印) End Page Down |
セルを編集中の場合には、カーソルがセルのテキストの末尾に移動します。セルが編集不可能な場合は、1 つ下のアイテムが選択されます。 |
|
Ctrl |
トグルキーです。DataGrid コントロールの allowMultipleSelection プロパティが true に設定されている場合に、隣接しない複数のアイテムを選択または選択解除できます。キーの押し下げ、クリックによる選択、およびドラックによる選択の際に、同時に押すことで機能します。 |
|
Shift |
連続選択キーです。DataGrid コントロールの allowMultipleSelection プロパティが true に設定されている場合に、隣接する複数のアイテムを選択できます。キーの押し下げ、クリックによる選択、およびドラックによる選択の際に、同時に押すことで機能します。 |
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート