Template file: Sample1.page
Class file: Sample1.php
Template file: Sample2.page
Class file: Sample2.php

/Controls/Samples/TDataList/Sample2.php

<?php

class Sample2 extends TPage
{
	private $_data=null;

	protected function getData()
	{
		if($this->_data===null)
			$this->loadData();
		return $this->_data;
	}

	protected function loadData()
	{
		// We use viewstate keep track of data.
		// In real applications, data should come from database using an SQL SELECT statement.
		// In the following tabular data, field 'id' is the primary key.
		// All update and delete operations should come with an 'id' value in order to go through.
		if(($this->_data=$this->getViewState('Data',null))===null)
		{
			$this->_data=array(
				array('id'=>'ITN001','name'=>'Motherboard','quantity'=>1,'price'=>100.00,'imported'=>true),
				array('id'=>'ITN002','name'=>'CPU','quantity'=>1,'price'=>150.00,'imported'=>true),
				array('id'=>'ITN003','name'=>'Harddrive','quantity'=>2,'price'=>80.00,'imported'=>false),
				array('id'=>'ITN004','name'=>'Sound card','quantity'=>1,'price'=>40.00,'imported'=>false),
				array('id'=>'ITN005','name'=>'Video card','quantity'=>1,'price'=>150.00,'imported'=>true),
				array('id'=>'ITN006','name'=>'Keyboard','quantity'=>1,'price'=>20.00,'imported'=>true),
				array('id'=>'ITN007','name'=>'Monitor','quantity'=>2,'price'=>300.00,'imported'=>false),
			);
			$this->saveData();
		}
	}

	protected function saveData()
	{
		$this->setViewState('Data',$this->_data);
	}

	protected function updateProduct($id,$name,$quantity,$price,$imported)
	{
		// In real applications, data should be saved to database using an SQL UPDATE statement
		if($this->_data===null)
			$this->loadData();
		$updateRow=null;
		foreach($this->_data as $index=>$row)
			if($row['id']===$id)
				$updateRow=&$this->_data[$index];
		if($updateRow!==null)
		{
			$updateRow['name']=$name;
			$updateRow['quantity']=TPropertyValue::ensureInteger($quantity);
			$updateRow['price']=TPropertyValue::ensureFloat($price);
			$updateRow['imported']=TPropertyValue::ensureBoolean($imported);
			$this->saveData();
		}
	}

	protected function deleteProduct($id)
	{
		// In real applications, data should be saved to database using an SQL DELETE statement
		if($this->_data===null)
			$this->loadData();
		$deleteIndex=-1;
		foreach($this->_data as $index=>$row)
			if($row['id']===$id)
				$deleteIndex=$index;
		if($deleteIndex>=0)
		{
			unset($this->_data[$deleteIndex]);
			$this->saveData();
		}
	}

	public function onLoad($param)
	{
		parent::onLoad($param);
		if(!$this->IsPostBack)
		{
			$this->DataList->DataSource=$this->Data;
			$this->DataList->dataBind();
		}
	}

	public function editItem($sender,$param)
	{
		$this->DataList->SelectedItemIndex=-1;
		$this->DataList->EditItemIndex=$param->Item->ItemIndex;
		$this->DataList->DataSource=$this->Data;
		$this->DataList->dataBind();
	}

	public function cancelItem($sender,$param)
	{
		$this->DataList->SelectedItemIndex=-1;
		$this->DataList->EditItemIndex=-1;
		$this->DataList->DataSource=$this->Data;
		$this->DataList->dataBind();
	}

	public function updateItem($sender,$param)
	{
		$item=$param->Item;
		$this->updateProduct(
			$this->DataList->DataKeys[$item->ItemIndex],
			$item->ProductName->Text,
			$item->ProductQuantity->Text,
			$item->ProductPrice->Text,
			$item->ProductImported->Checked);
		$this->DataList->EditItemIndex=-1;
		$this->DataList->DataSource=$this->Data;
		$this->DataList->dataBind();
	}

	public function deleteItem($sender,$param)
	{
		$this->deleteProduct($this->DataList->DataKeys[$param->Item->ItemIndex]);
		$this->DataList->SelectedItemIndex=-1;
		$this->DataList->EditItemIndex=-1;
		$this->DataList->DataSource=$this->Data;
		$this->DataList->dataBind();
	}

	public function selectItem($sender,$param)
	{
		$this->DataList->EditItemIndex=-1;
		$this->DataList->DataSource=$this->Data;
		$this->DataList->dataBind();
	}
}