Проблемы с горизонтальной / вертикальной полосой прокрутки AdvancedDataGrid. (Flex)

Итак, у меня есть AdvancedDataGrid, который должен находиться внутри Canvas. Моя проблема в том, что когда вы делаете что-то подобное, вы получаете два набора полос прокрутки. Кроме того, горизонтальная полоса прокрутки AdvancedDataGrid меняет размер при прокрутке справа налево и не позволит вам прокручивать ВСЕ вправо, что кажется странным.

Я отключил горизонтальную прокрутку в AdvancedDataGrid и оставил ее обрабатывать только Canvas. Однако, когда я это делаю, размер столбцов нельзя изменять. Фу.

Мое текущее «лучшее» решение - использовать AdvancedDataGrid для вертикальной прокрутки, а для Canvas - для горизонтальной прокрутки, но это просто безумие, не говоря уже о том, что у меня возникла проблема, о которой я упоминал выше, когда я больше не могу изменять размер столбцов.

Любая помощь приветствуется! Спасибо!


person Craig    schedule 23.07.2010    source источник


Ответы (2)


Горизонтальная прокрутка AdvancedDataGrid несколько необычна тем, что размер ползунка горизонтальной прокрутки зависит от ширины видимых столбцов. На самом деле вы можете перетащить ползунок до конца, но это может занять несколько попыток. (Знаю, знаю ...)

Помните, что в AdvancedDataGrid ничего фактически не отображается за пределами области просмотра, поэтому любой размер - это просто обоснованная (ну, в некоторой степени обоснованная) догадка. Adobe делает это для того, чтобы огромные сетки не увязли в обход (представьте, что методы измерения выполняются на объектах itemRenderers из 15 000 ячеек каждый раз, когда вы изменяете размер окна).

Я советую отключить политики вертикальной и горизонтальной прокрутки на холсте и разрешить прокрутку обрабатывать в ADG. Это некрасиво, но это лучше, чем альтернатива. В любом случае ADG - громоздкая и сварливая штуковина, и, возможно, именно поэтому Adobe открыла ее исходный код. Я много раз клялся, что никогда не воспользуюсь им снова. Я смог сдержать эту клятву только до следующего раза, когда мне понадобятся ее возможности. Примерно каждую неделю.

person Robusto    schedule 23.07.2010
comment
Спасибо за ответ. Когда вы говорите, что я могу перетащить его до упора вправо, это своего рода случай. По какой-то причине происходит то, что Canvas немного больше сетки, даже несмотря на то, что Grid - единственное, что находится внутри Canvas! Причина, по которой я не могу прокрутить до конца, как упоминалось ранее, заключается в том, что холст прокручивается полностью влево, и единственный способ полностью переместиться вправо - это иметь две полосы прокрутки ... что ад?! Есть идеи, почему Canvas будет больше? И ширина, и высота установлены на 100%. - person Craig; 24.07.2010
comment
Вероятно, вокруг AdvancedDataGrid есть какая-то невидимая оболочка границы. В любом случае установите на холсте horizontalScrollPolicy = false и verticalScrollPolicy = false. И как бы я ни восхищался сайтом www.Flextras.com в другом месте, я бы не советовал последовать его предложению разрешить холсту обрабатывать прокрутку здесь. Это нарушит оптимизацию рендеринга ADG и снизит производительность, IMO. - person Robusto; 24.07.2010
comment
Хорошо, я исправил проблему, с которой я сталкивался ранее, установив ширину сетки данных на this.width вместо 100% (внутри Canvas), так что теперь я действительно могу получить конец сетки. Теперь последний столбец в сетке становится намного больше, чем остальные столбцы в сетке ... есть идеи по этому поводу? AdvancedDataGrid - ужасная жуткая вещь. - person Craig; 24.07.2010
comment
+1. Это очень хороший момент в отношении использования рендереров и повторного использования рендереров, и это то, что я не рассматривал. это заставляет меня видеть альтернативный изъян в моем ответе; что определение размера ADG с помощью measureHeight и measureWidth, скорее всего, будет сделано для количества модулей рендеринга по умолчанию, которые могут не удалять полосы прокрутки из ADG. @user Помните, что родительский элемент компонента всегда устанавливает свою высоту. Родитель холста установит его высоту и ширину без учета дочерних элементов холста (ADG) [в зависимости от метода измерения] - person JeffryHouser; 24.07.2010
comment
@ user379467: Да. Я всегда добавляю фиктивный последний столбец без данных, без headerText и шириной 5, minWidth = 0. Он занимает все лишнее пространство, поэтому ни один столбец не становится слишком большим. - person Robusto; 24.07.2010

AdvancedDataGrid - единственное, что есть на вашем холсте?

Я бы установил размер AdvancedDataGrid на полную высоту и ширину и позволил бы Canvas обрабатывать прокрутку.

На холсте переопределите метод updateDisplayList и сделайте что-то вроде этого:

protected function updateDisplayList(unscaledWidth: Number, unscaledHeight: Number):void{
 super.updateDisplayList, unscaledHeight);
 this.myAdvancedDataGrid.setActualSize(this.myAdvancedDataGrid.measuredHeight, this.myAdvancedDataGrid.measuredWidth );
}

Таким образом, AdvancedDataGrid не должно иметь полос прокрутки. Однако, если он растягивается слишком далеко вниз или слишком далеко вправо, на холсте появятся полосы прокрутки.

Возможно, вам будет полезно ознакомиться с системой координат Flex. AdvancedDataGrid - это ваш «Контент», в то время как Canvas будет вашим локальным.


Я добавляю полный пример работающего кода, чтобы продемонстрировать свое предложение.

Это компонент холста с AdvancedDataGrid внутри: com.flextras.stackOverflow.CanvasWithGrid

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
                super.updateDisplayList(unscaledWidth, unscaledHeight);
                this.myADG.setActualSize(this.myADG.measuredWidth, this.myADG.measuredWidth );
            }

            [Bindable]
            private var dpFlat:ArrayCollection = new ArrayCollection([
                {Region:"Southwest", Territory:"Arizona", 
                    Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000}, 
                {Region:"Southwest", Territory:"Arizona", 
                    Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000},  
                {Region:"Southwest", Territory:"Central California", 
                    Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000},  
                {Region:"Southwest", Territory:"Nevada", 
                    Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000},  
                {Region:"Southwest", Territory:"Northern California", 
                    Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000}, 
                {Region:"Southwest", Territory:"Northern California", 
                    Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000},  
                {Region:"Southwest", Territory:"Southern California", 
                    Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000}, 
                {Region:"Southwest", Territory:"Southern California", 
                    Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}
            ]);

        ]]>
    </fx:Script>

    <mx:AdvancedDataGrid id="myADG" 

                         initialize="gc.refresh();"> <!--  width="100%" height="100%"  -->       
        <mx:dataProvider>
            <mx:GroupingCollection id="gc" source="{dpFlat}">
                <mx:grouping>
                    <mx:Grouping>
                        <mx:GroupingField name="Region"/>
                        <mx:GroupingField name="Territory"/>
                    </mx:Grouping>
                </mx:grouping>
            </mx:GroupingCollection>
        </mx:dataProvider>        

        <mx:columns>
            <mx:AdvancedDataGridColumn dataField="Region"/>
            <mx:AdvancedDataGridColumn dataField="Territory"/>
            <mx:AdvancedDataGridColumn dataField="Territory_Rep"
                                       headerText="Territory Rep"/>
            <mx:AdvancedDataGridColumn dataField="Actual"/>
            <mx:AdvancedDataGridColumn dataField="Estimate"/>
        </mx:columns>
    </mx:AdvancedDataGrid>

</mx:Canvas>

Это основной файл приложения:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:stackOverflow="com.flextras.stackOverflow.*">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <stackOverflow:CanvasWithGrid width="200" height="200" />


</s:Application>
person JeffryHouser    schedule 23.07.2010
comment
Привет, спасибо за ответ. Мне определенно нравится, как холст обрабатывает прокрутку AdvancedDataGrid, и в моем случае производительность не будет проблемой, потому что сетка никогда не будет невероятно большой. Однако мне не удалось заставить ваш код работать должным образом. Все это сделало сетку невероятно маленькой. Я не уверен, делал ли я что-то безумное, но по большей части я просто скопировал код в Canvas .. - person Craig; 24.07.2010
comment
Вы можете показать нам еще код? Я не совсем уверен, как AdvancedDataGrid вычисляет его размер. - person JeffryHouser; 24.07.2010
comment
Я добавил полный рабочий образец, чтобы продемонстрировать свое предложение. - person JeffryHouser; 24.07.2010