* @link http://www.pradosoft.com/ * @copyright Copyright © 2006 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Revision: $ $Date: $ * @package System.Web.UI.WebControls */ Prado::using('System.Web.UI.WebControls.TDataGridColumn'); Prado::using('System.Web.UI.WebControls.TDropDownList'); /** * TDropDownListColumn class * * TDropDownListColumn represents a column that is bound to a field in a data source. * The cells in the column will be displayed using the data indexed by * {@link setDataField DataField}. You can customize the display by * setting {@link setDataFormatString DataFormatString}. * * If {@link setReadOnly ReadOnly} is false, TDropDownListColumn will display cells in edit mode * with dropdown lists. Otherwise, a static text is displayed. * * There are two approaches to specify the list items available for selection. * The first approach uses template syntax as follows, * * * * * * * * The second approach specifies a data source to be bound to the dropdown lists * by setting {@link setListDataSource ListDataSource}. Like generic list controls, * you may also want to specify which data fields are used for item values and texts * by setting {@link setListValueField ListValueField} and * {@link setListTextField ListTextField}, respectively. * Furthermore, the item texts may be formatted by using {@link setListTextFormatString ListTextFormatString}. * Note, if you specify {@link setListDataSource ListDataSource}, do it before * calling the datagrid's dataBind(). * * The dropdown list control in the TDropDownListColumn can be accessed by one of * the following two methods: * * $datagridItem->DropDownListColumnID->DropDownList * $datagridItem->DropDownListColumnID->Controls[0] * * The second method is possible because the dropdown list control created within the * datagrid cell is the first child. * * @author Qiang Xue * @version $Revision: $ $Date: $ * @package System.Web.UI.WebControls * @since 3.0.4 */ class TDropDownListColumn extends TDataGridColumn { private $_stateLoaded=false; private $_dataBound=false; private $_listControl=null; public function __construct() { $this->_listControl=new TDropDownList; } /** * Loads items from viewstate. * This method overrides the parent implementation by loading list items * @param mixed state values */ public function loadState($state) { parent::loadState($state); $this->_stateLoaded=true; if(!$this->_dataBound) $this->_listControl->getItems()->loadState($this->getViewState('Items',null)); } /** * Saves items into viewstate. * This method overrides the parent implementation by saving list items */ public function saveState() { $this->setViewState('Items',$this->_listControl->getItems()->saveState(),null); return parent::saveState(); } /** * Adds object parsed from template to the control. * This method adds only {@link TListItem} objects into the {@link getItems Items} collection. * All other objects are ignored. * @param mixed object parsed from template */ public function addParsedObject($object) { // Do not add items from template if items are loaded from viewstate if(!$this->_stateLoaded && ($object instanceof TListItem)) { $object->setSelected(false); $index=$this->_listControl->getItems()->add($object); } } /** * @return string the field name from the data source to bind to the column */ public function getDataField() { return $this->getViewState('DataField',''); } /** * @param string the field name from the data source to bind to the column */ public function setDataField($value) { $this->setViewState('DataField',$value,''); } /** * @return string the formatting string used to control how the bound data will be displayed. */ public function getDataFormatString() { return $this->getViewState('DataFormatString',''); } /** * @param string the formatting string used to control how the bound data will be displayed. */ public function setDataFormatString($value) { $this->setViewState('DataFormatString',$value,''); } /** * @return boolean whether the items in the column can be edited. Defaults to false. */ public function getReadOnly() { return $this->getViewState('ReadOnly',false); } /** * @param boolean whether the items in the column can be edited */ public function setReadOnly($value) { $this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false); } /** * @return Traversable data source to be bound to the dropdown list boxes. */ public function getListDataSource() { return $this->_listControl->getDataSource(); } /** * @param Traversable|array|string data source to be bound to the dropdown list boxes. */ public function setListDataSource($value) { $this->_listControl->setDataSource($value); } /** * @return string the data field used to populate the values of the dropdown list items. Defaults to empty. */ public function getListValueField() { return $this->getViewState('ListValueField',''); } /** * @param string the data field used to populate the values of the dropdown list items */ public function setListValueField($value) { $this->setViewState('ListValueField',$value,''); } /** * @return string the data field used to populate the texts of the dropdown list items. Defaults to empty. */ public function getListTextField() { return $this->getViewState('ListTextField',''); } /** * @param string the data field used to populate the texts of the dropdown list items */ public function setListTextField($value) { $this->setViewState('ListTextField',$value,''); } /** * @return string the formatting string used to control how the list item texts will be displayed. */ public function getListTextFormatString() { return $this->getViewState('ListTextFormatString',''); } /** * @param string the formatting string used to control how the list item texts will be displayed. */ public function setListTextFormatString($value) { $this->setViewState('ListTextFormatString',$value,''); } /** * Initializes the specified cell to its initial values. * This method overrides the parent implementation. * It creates a textbox for item in edit mode and the column is not read-only. * Otherwise it displays a static text. * The caption of the button and the static text are retrieved * from the datasource. * @param TTableCell the cell to be initialized. * @param integer the index to the Columns property that the cell resides in. * @param string the type of cell (Header,Footer,Item,AlternatingItem,EditItem,SelectedItem) */ public function initializeCell($cell,$columnIndex,$itemType) { parent::initializeCell($cell,$columnIndex,$itemType); if(!$this->_dataBound && $this->_listControl->getDataSource()!==null) { $this->_listControl->setDataTextField($this->getListTextField()); $this->_listControl->setDataValueField($this->getListValueField()); $this->_listControl->setDataTextFormatString($this->getListTextFormatString()); $this->_listControl->dataBind(); $this->_dataBound=true; } switch($itemType) { case TDataGrid::IT_EDITITEM: if(!$this->getReadOnly()) { $listControl=clone $this->_listControl; $cell->getControls()->add($listControl); $cell->registerObject('DropDownList',$listControl); $control=$listControl; } else $control=$cell; $control->attachEventHandler('OnDataBinding',array($this,'dataBindColumn')); break; case TDataGrid::IT_ITEM: case TDataGrid::IT_ALTERNATINGITEM: case TDataGrid::IT_SELECTEDITEM: if($this->getDataField()!=='') $cell->attachEventHandler('OnDataBinding',array($this,'dataBindColumn')); break; } } /** * Databinds a cell in the column. * This method is invoked when datagrid performs databinding. * It populates the content of the cell with the relevant data from data source. */ public function dataBindColumn($sender,$param) { $item=$sender->getNamingContainer(); $data=$item->getDataItem(); if(($field=$this->getDataField())!=='') $data=$this->getDataFieldValue($data,$field); $formatString=$this->getDataFormatString(); $value=$this->formatDataValue($formatString,$data); if($sender instanceof TTableCell) $sender->setText($value); else if($sender instanceof TDropDownList) $sender->setSelectedValue($data); } } ?>