Flex (DataGrid), Как изменить видимое состояние определенной ячейки при наведении курсора мыши на строку

У меня три столбца, и по умолчанию последний столбец отображается как false. Моя проблема в том, как изменить видимое состояние определенной ячейки при наведении указателя мыши на любую часть строки.

Английский не является моим родным языком, поэтому, если я недостаточно четко сформулировал свой вопрос, продолжайте читать.

------------------------------------------------
|  column1  | column2   | column3 (invisible)  | row1
|  column1  | column2   | column3 (invisible)  | row2
------------------------------------------------

как я могу показать ячейку (row1, column3) при наведении указателя мыши на любой столбец row1.


person user76047    schedule 05.06.2009    source источник


Ответы (1)


Вы можете легко переключить видимость всего столбца при наведении курсора на элементы в столбце 1 таким образом:

<mx:DataGrid dataProvider="{[{c1:'a1', c2:'b1', c3:'c1'}]}">
    <mx:columns>
        <mx:DataGridColumn headerText="Column 1" dataField="c1">
            <mx:itemRenderer>
                <mx:Component>
                    <mx:Label text="{listData.label}"
                        rollOver="DataGrid(owner).columns[2].visible = true"
                        rollOut="DataGrid(owner).columns[2].visible = false"
                    >
                        <mx:Script>
                            <![CDATA[
                                import mx.controls.DataGrid;
                            ]]>
                        </mx:Script>
                    </mx:Label>
                </mx:Component>
            </mx:itemRenderer>
        </mx:DataGridColumn>
        <mx:DataGridColumn headerText="Column 2" dataField="c2" />
        <mx:DataGridColumn headerText="Column 3" dataField="c3" visible="false" />
</mx:DataGrid>

Конечно, вам лучше создать новый класс вместо встроенного средства визуализации элементов.

Отображение единственного средства визуализации в 3-м столбце очень сложно, потому что, если весь столбец невидим, то для этого столбца не создаются средства визуализации.

Я думаю, что лучше использовать решение, подобное всплывающей подсказке, например:

<mx:Script>
<![CDATA[
     import test.CellRenderer;
]]>
</mx:Script>
<mx:UIComponent id="textFlowContainer" width="100%" height="100%" />
<mx:DataGrid dataProvider="{[{c1:'a1', c2:'b1', c3:'c1'}]}">
    <mx:columns>
        <mx:DataGridColumn headerText="Column 1" dataField="c1" itemRenderer="{new ClassFactory(CellRenderer)}" />
        <mx:DataGridColumn headerText="Column 2" dataField="c2" itemRenderer="{new ClassFactory(CellRenderer)}" />
    </mx:columns>
</mx:DataGrid>

Где test.CellRenderer:

<?xml version="1.0" encoding="utf-8"?>
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml" text="{listData.label}"
         rollOver="rollOverHandler()" rollOut="rollOutHandler(event)">
<mx:Script>
    <![CDATA[
        import mx.managers.PopUpManagerChildList;
        import mx.managers.PopUpManager;
        import mx.controls.Label;
        import mx.controls.DataGrid;

        private var popupLabel:Label;

        private function rollOverHandler ():void
        {
            popupLabel = new Label();
            popupLabel.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
            popupLabel.text = data.c3;
            PopUpManager.addPopUp(popupLabel, this, false, PopUpManagerChildList.PARENT);
            var p1:Point = new Point(0, this.y);
            p1 = localToGlobal(p1);
            var p2:Point = new Point(listData.owner.x+listData.owner.width, 0);
            p2 = listData.owner.parent.localToGlobal(p2);
            popupLabel.move(p2.x, p1.y);
        }

        private function rollOutHandler (event:MouseEvent):void
        {
            if (popupLabel && !popupLabel.hitTestPoint(event.stageX, event.stageY))
            {
                PopUpManager.removePopUp(popupLabel);
                popupLabel = null;
            }
        }
    ]]>
</mx:Script>
</mx:Label>
person Hrundik    schedule 05.06.2009
comment
Спасибо, Никита! Я не уверен насчет второго подхода, но первый мне не совсем нужен, мне нужно просто показать одну ячейку, а не весь столбец. Я попробую второй способ, посмотрю, сработает ли он. - person user76047; 05.06.2009
comment
У второго подхода все еще есть проблема. На самом деле, я хочу, чтобы некоторые кнопки отображались в конце определенной строки, чтобы люди могли их нажимать. Но при наведении указателя мыши на кнопку, rollOutHandler заставляет ее немедленно исчезать。 - person user76047; 05.06.2009