0

このページの上部にあるコードで提供されるカスタム DataGrid サブクラスを使用しています。

http://blogs.adobe.com/aharui/2008/02/checkbox_selection_in_datagrid.html

VB.NET Web サービスから引き出された 2 列の DataRows の ArrayCollection を効果的に提供しています。列の 1 つは「isSelected」と呼ばれ、「True」または「False」に設定され、チェックボックスで表される唯一の列です。少なくともisSelectedの値に応じて、コードを入力してチェックボックスをチェックおよびチェック解除できるようにしたいことを除いて、すべてが完璧に進んでいます。私のコードは、これらのチェックボックスからすべてをうまく読み取り、ユーザーはそれらをうまく設定できます。DataGrid コンポーネントが非常に隠され、操作がわかりにくいため、コード自体で特定のチェックボックスを選択または選択解除するように設定する方法をまだ見つけていません。

これどうやってやるの?ありがとう!

編集:現時点でのレンダラーのコードは次のとおりです。

package 
{
import flash.display.DisplayObject;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.text.TextField;

import mx.controls.Alert;
import mx.controls.CheckBox;
import mx.controls.dataGridClasses.DataGridListData;
import mx.controls.listClasses.ListBase;

/** 
*  The Renderer.
*/
public class CheckBoxRenderer extends CheckBox
{
private var _data:*;  
private var selectedSet:Boolean;

override public function set data(value:Object):void {  
    var newSelected:*;  

    //so we don't have to rewrite the label stuff  
    super.data=value;  
    _data = value;  

    if (listData && listData is DataGridListData && DataGridListData(listData).dataField != null)  
    {  
        newSelected = _data[DataGridListData(listData).dataField];  
    }  
    else if (listData)  
    {  
        if (selectedField)  
            newSelected = _data[selectedField];  
    }  
    else  
    {  
        newSelected = _data;  
    }  

    if (newSelected !== undefined)  
    {
        /*if (newSelected is XMLList) {  
            newSelected = newSelected[0];  
            selected = (newSelected == 'true' ? true : false);  
        } else {
            selected = newSelected as Boolean;  
        }*/
        selected = (newSelected == "True" ? true : false);
    }
}  

public function CheckBoxRenderer()
{
    focusEnabled = false;
}

/*  override public function set data(value:Object):void
{
    super.data = value;
    invalidateProperties();
}*/

override protected function commitProperties():void
{
    super.commitProperties();
    if (owner is ListBase)
        selected = ListBase(owner).isItemSelected(data);
}

/* eat keyboard events, the underlying list will handle them */
override protected function keyDownHandler(event:KeyboardEvent):void
{
}

/* eat keyboard events, the underlying list will handle them */
override protected function keyUpHandler(event:KeyboardEvent):void
{
}

/* eat mouse events, the underlying list will handle them */
override protected function clickHandler(event:MouseEvent):void
{
}

/* center the checkbox if we're in a datagrid */
override protected function updateDisplayList(w:Number, h:Number):void
{
    super.updateDisplayList(w, h);

    if (listData is DataGridListData)
    {
        var n:int = numChildren;
        for (var i:int = 0; i < n; i++)
        {
            var c:DisplayObject = getChildAt(i);
            if (!(c is TextField))
            {
                c.x = (w - c.width) / 2;
                c.y = 0;
            }
        }
    }
}

}

}

チェックボックスの選択されたフィールドは正しいものに設定されていますが、選択されたフィールドがtrueに設定されたときにチェックされているように視覚的に表示されません。他に何が欠けていますか?

4

2 に答える 2

1

問題は DataGrid ではなく、正しく実装されていない Checkbox にあります。dataField に true が含まれている場合、selected が機能するように設定データをオーバーライドする方法に関するコードについては、こちらのコメントを参照してください。「True」の値で機能するように調整する方法については、XMLList のパスウェイを参照する必要があります。または、その値をブール値 true に変換できます。

于 2012-08-09T00:29:20.420 に答える
0

まず、arraycollection に含まれるオブジェクトをバインド可能にします。プログラムでチェックボックスをオンまたはオフにしたい場合は、値をオブジェクトの属性に直接割り当てるだけです。

与えられた:

 <mx:DataGrid id="mygrid" dataProvider="{mycollection}"/>

...

 [Bindable]
 var mycollection:ArrayCollection = new ArrayCollection([....]);

....

最初の行をチェック済みに設定します。

   var firstItem:MyObject = mycollection.getItemAt(0);
   firstItem.isSelected = true; // or false

チェックボックス アイテム レンダラーは、列の状態を自動的に反映する必要があります。

于 2012-08-09T01:24:18.620 に答える