Значение перехвата передается редактору элементов? - PullRequest
0 голосов
/ 28 декабря 2011

Я пытаюсь перехватить значение, которое берется из itemRenderer элемента GridColumn объекта DataGrid и применяется к itemEditor, и наоборот. Мне нужно иметь возможность форматировать это значение. Однако мой проект сложен, поэтому я могу сосредоточиться на неверной идее в том, чего я пытаюсь достичь. Пожалуйста, взгляните и дайте мне знать, могу ли я попробовать что-то еще.

У меня есть компонент Spark DataGrid (с идентификатором dg ), который я динамически заполняю из XML. Я создаю ArrayCollection из некоторых узлов и обычный Array из подузлов, который добавляется как свойство ArrayCollection. Затем эта ArrayCollection используется в качестве dataProvider для DataGrid.

Вот примерный сегмент типичного узла XML и его подузлов:

<item name="physOrderTable" text="" type="notes">
    <cols>
        <col id="0" text="Day/Time" />
        <col id="1" text="Order Type" />
        <col id="2" text="Physician's Orders" />
        <col id="3" text="Physician's Signature" />
    </cols>
    <rows>
        <row id="r0" name="" text="">
            <col id="0"><![CDATA[Tues 15:24]]></col>
            <col id="1"><![CDATA[General]]></col>
            <col id="2"><![CDATA[BMP, CBC, Cardiac Enzymes, ABG, EKG STAT, NS@ 125 mL/hr, Blood Sugar AC & HS, 02 via NC to keep oxygen saturation above 97%]]></col>
            <col id="3"><![CDATA[J. Nelms]]></col>
        </row>
    </rows>
</item>

Вот код, который читает XML и использует его:

protected function sparkDG_creationCompleteHandler(event:FlexEvent):void
{
    trace("grid created");
    var colsList:XMLList = xml.cols.col;
    var rowsList:XMLList = xml.rows.row;
    colAL = new ArrayList();

    for(var i:Number = 0; i < colsList.length(); i++)
    {
        var gc:GridColumn = new GridColumn();
        gc.maxWidth = 500;
        gc.resizable = false;
        gc.headerText = String(colsList[i].@text);
        gc.dataField = "col";
        gc.labelFunction = labelFunc;
        colAL.addItem(gc);
    }

    for each(var row:XML in XML(value).rows.children())
    {
        var rowArr:Array = new Array();

        for each(var col:XML in row.children())
        {
            if(col == "")
            {
                rowArr[Number(col.@id)] = "_";
            }else{
                rowArr[Number(col.@id)] = col;
            }
        }

        colAC.addItem({
            rowID: row.@id,
            rowName: row.@name,
            rowText: row.@text,
            col: rowArr
        });
    }

    dg.columns = colAL;
    dg.dataProvider = colAC;
}//

Поэтому я сначала строю заголовок для DataGrid, предлагая ему использовать dataField «col», что соответствует свойству .col colAC ArrayCollection. Это свойство .col является массивом значений для каждой ячейки этой строки.

Теперь эта часть кода важна, так как она отображает соответствующий индекс массива .col с помощью .columnIndex :

private function labelFunc(item:Object, column:GridColumn):String
{
    var displayText:String;
    var valArr:Array = new Array();

    if(column.dataField == "col")
    {
        valArr = item[column.dataField];
        displayText = String(valArr[column.columnIndex]);
    }

    return displayText;
}//

Это единственный метод, который я смог использовать для достижения желаемого результата. Это все работает нормально, если все, что я хочу сделать, это просто отобразить информацию. Но мне нужно иметь возможность редактировать значения в каждой ячейке и применять это обратно к dataProvider, так как позже мне потребуется перестроить XML с обновленными значениями.

Я перепробовал все, что только мог придумать, чтобы сделать это. Я построил свой собственный ItemRenderer, затем свой собственный ItemEditor, а затем удалил их, потому что мне казалось, что я заново изобретаю колесо. Но был ли я? Я попытался прочитать код для DataGrid, GridColumn и связанных классов, но не смог найти никакой ссылки на itemEditor, кроме того, что он является IFactory. Я понятия не имею, где или как это говорит, что IFactory должен быть текстовым вводом или чем-то еще.

Вот моя проблема:

Когда я включаю редактирование DataGrid и дважды щелкаю ячейку, он берет весь массив col dataField для ячейки этого столбца, преобразует этот массив в строку и отображает всю строку в текстовом поле редактирования. Если я отменяю редактирование или сохраняю редактирование, он устанавливает string в свойство .col . Затем labelFunction пытается прочитать эту строку как массив, и она вылетает. Мне удалось получить typeof col dataField и преобразовать его в массив, если это строка, но мне не нужно было.

Мне нужно, чтобы он отображал просто значение ячейки для этой конкретной строки и столбца при создании экземпляра itemEditor. Когда это значение изменяется, мне нужно применить его к индексу этого столбца в массиве .col dataProvider. Итак, аналогично тому, как она отображает информацию в labelFunction , мне нужно отредактировать информацию и отправить ее обратно.

Я видел множество пользовательских ItemEditors и itemRenderers для GridColumns, но они жестко запрограммированы в MXML. Моя сетка почти полностью создается динамически, поэтому, к сожалению, это не вариант для меня, поскольку я даже не знаю, сколько будет столбцов или строк при создании DataGrid. Я попытался использовать rendererIsEditor , но это, похоже, относится только к экземпляру GridColumn в MXML, так как в ActionScript есть только rendererIsEditable , и он не работает (или я не знаю, как использовать его по назначению).

Если кто-нибудь знает способ достижения этого, даже просто что-то еще, на что я должен взглянуть, я был бы очень признателен!

1 Ответ

0 голосов
/ 20 февраля 2012
...