Автоматически изменять ширину DataGridCoulmn / AdvancedDataGridColumn в соответствии с содержимым

Я хочу, чтобы DataGridColumn или AdvancedDataGridColumn автоматически изменяли размер своей ширины, чтобы соответствовать содержимому внутри ..

Я новичок в гибкости. Я хочу реализовать что-то вроде таблиц HTML.

Данные представлены в виде простого текста. Некоторые строки имеют немного более длинный текст, в этом случае я хотел бы автоматически увеличить ширину DataGridColumn.

Любая помощь в решении этой проблемы.

заранее спасибо


person Ravish    schedule 21.05.2010    source источник


Ответы (4)


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

По какой-то причине это особенно актуально для первого и последнего столбцов.

Единственное решение, которое я нашел, - установить свойство minWidth для столбцов, и мне нужно сначала просмотреть данные, чтобы найти самые широкие выбросы в этих столбцах и убедиться, что они удобно помещаются. Другое решение, которое помогает, - иметь фиктивные столбцы слева и справа, которым заданы width, minWidths и maxWidths очень маленького размера, скажем 5, что, кажется, позволяет реальным столбцам в середине «дышать» немного лучше.

<mx:columns>
  <mx:DataGridColumn id="leftDummy" width="5" minWidth="5" maxWidth="5"/>
  <!-- Your "real" columns here, with minWidth assignments -->
  <mx:DataGridColumn id="rightDummy" width="5" minWidth="5" maxWidth="5"/>
</mxcolumns>

Но будьте осторожны. Если вы устанавливаете ширину столбца, она интерпретируется не как буквальное значение или фактический процент, а как некая половинчатая пропорция. Я могу только предположить, что процедуры определения размера столбца устают вычислять и останавливаются на какой-то «разумной» интерпретации ширины столбца, что, конечно, в большинстве случаев оказывается совершенно неразумным.

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

person Robusto    schedule 21.05.2010

Вот как я это делаю, и это неплохо работает ...

Создайте связываемую переменную и дайте ей начальный номер (скажем, 100), например:

[Bindable] private var colWidth:int = 100;

Используйте привязку данных для определения размера столбцов, например:

mx:DataGridColumn width="{colWidth}"

Добавьте обработчик события изменения размера в свою сетку данных, например:

myDataGrid.addEventListener(ResizeEvent.RESIZE , onDataGridResize);

В обработчике прослушайте новую ширину сетки данных, возьмите это число и разделите его на количество столбцов (если все столбцы должны быть равны) или выполните некоторые математические вычисления, чтобы создать `` процент '' для ширины столбцов , бывший:

private function onDataGridResize(event:ResizeEvent):void {
  colWidth = myDataGrid.width / numberOfColumns;
}
person boogiebot    schedule 19.07.2012
comment
Проблема в том, что мне хотелось бы, чтобы тексты в колонке отображались комфортно. Следовательно, изменение размера столбца до длины самого длинного текста. - person Ravish; 19.07.2012

Вы можете установить ширину на некоторый фиксированный процент, если можете угадать возможную ширину. Но я бы предложил другой вариант:

  1. установите для свойства variableRowHeight таблицы данных значение true
  2. установите для свойства wordWrap столбца, который будет иметь более длинный текст, значение true.

Таким образом, ваш длинный текст будет размещен в несколько строк, и только высота этой строки будет увеличена. просто попробуйте. Если вы этого не хотите, я думаю, вам может потребоваться написать новый класс, расширяющий datagridColumn.

<mx:DataGrid dataProvider="{testAC}" width="80%" height="100%" variableRowHeight="true">
         <mx:columns>
              <mx:DataGridColumn dataField="company" wordWrap="true"/>                    <mx:DataGridColumn dataField="share"/>
              <mx:DataGridColumn dataField="expense"/>
        </mx:columns>
 </mx:DataGrid>

Ура, ПК

person Anoop    schedule 21.05.2010
comment
Это решение не помогает, если текст представляет собой отдельное слово или числовое значение, которое не переносится, или, в случае форматированного числа (скажем, 2300152), оно неуместно переносится через запятые. - person Robusto; 21.05.2010

У меня была та же проблема, вы должны заранее знать размер вашей более длинной строки, затем присваивать MinWidth этот размер и иметь столбец resizeable = 'false'.

Это сработало для меня

person Omar Alejandro    schedule 05.07.2011