2009-11-10 26 views
1

我想實現以下功能添加新行。當用戶點擊第二行時,需要創建一個新行並進行編輯。Flex的DataGrid中通過一次點擊事件

這裏是已經工作的 - 用戶在列上標籤,當用戶在最後一列中標籤時,用默認值創建一個新行。

這裏也是已經工作 - 用戶單擊網格外的按鈕,它添加了一個新行。

(itemEditBegin和發生itemEditEnd已實施)

這裏是不工作:當我「一次點擊」在第二行(沒有數據 - 排爲空),我怎麼檢測到當前點擊行是第二行,並使其可編輯?我能從MouseEvent中找出rowIndex並使用它來添加一個新行嗎?

查找下面的代碼:

<mx:DataGrid id="myGrid" editable="true" click="clickEvent(event)" 
    itemEditEnd="endEdit(event)" itemEditBegin="beginEdit(event)" variableRowHeight="true" > 

private function clickEvent(ev:Event):void 
{ 
    var i:Object = MouseEvent(ev).currentTarget; 
     // is this the right event? 
} 
+0

如果通過在每行之前添加一些空格來對代碼進行格式化,它會使讀起來更容易。 – 2009-11-10 03:33:42

回答

3

如果沒有數據,將不會有任何行或itemRenderer,因此技術上沒有行索引。 e.target將包含ListBaseContentHoldere.currentTarget將包含DataGrid本身。但是,您可以使用鼠標位置來計算在點擊位置出現的行。這是一個骯髒的小竅門 - 它沒有經過徹底的測試,因此可能會因邊緣情況而失敗。

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" 
    xmlns:local="*" creationComplete="create();"> 
    <mx:DataGrid id="myGrid" editable="true" click="clickEvent(event)" 
    variableRowHeight="true" > 
    <mx:columns> 
     <mx:DataGridColumn dataField="d"/> 
     <mx:DataGridColumn/> 
    </mx:columns> 
    </mx:DataGrid> 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.listClasses.ListRowInfo; 
      import mx.controls.listClasses.ListBaseContentHolder; 
      private function clickEvent(e:MouseEvent):void 
      { 
       if(!(e.target is ListBaseContentHolder)) 
        return; 
       var holder:ListBaseContentHolder = 
        ListBaseContentHolder(e.target); 
       var rowIndex:Number = -1; 
       var length:Number = holder.rowInfo.length; 
       var rowInfo:ListRowInfo; 
       for(var i:Number = 0; i < length; i++) 
       { 
        rowInfo = holder.rowInfo[i]; 
        if(e.localY > rowInfo.y && 
         e.localY < rowInfo.y + rowInfo.height) 
        { 
         rowIndex = i; 
         break; 
        } 
       } 
       trace("Clicked on " + rowIndex); 
      } 
      private function create():void 
      { 
       myGrid.dataProvider = [{d:"A"},{d:"B"}]; 
      } 
     ]]> 
    </mx:Script> 
</mx:Application> 
+0

效果很好。 Thanx buddy – 2009-11-10 18:36:46

+0

我剛剛發現,當網格中的一列包含自定義組合框,並且您單擊組合框區域上的「非空」網格行時,e.target仍然是ListBaseContentHolder類型(而不是類型的itemRenderer)。因此,僅僅檢查目標類型是不夠的: if(!(e.target is ListBaseContentHolder)) return; 我的工作方式是跟蹤如果網格有數據或不使用布爾值。 如果有更好的方法,讓我們都知道! – 2010-01-26 00:01:41

0

大問題,DataGrid的支持在DataGrid的dataProvider對象的選擇。但它不允許容易選擇/ mouseOver的行中沒有項目(空行)。

1)我要麼將一個虛擬行放在DataGrid的末尾,這樣DataGrid就可以很容易地選擇它。 2)否則,我會檢查mouseX/mouseY是否在剛剛單擊的空行參數內(使用空行的全局X,Y,寬度,高度屬性)。

讓我知道什麼可行。