`
schy_hqh
  • 浏览: 558116 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(十一)为DataGrid指定项目呈现器(单元格内显示图片和按钮)

 
阅读更多
1.使用DataGrid组件展现数据(表格),以交互方式操作其中的行和列
2.自定义项目呈现器,在DataGrid的某列重载默认行为(默认显示文本,修改为显示图片)
3.在列中以自定义方式进行排序
4.AdvancedDataGrid的功能:排序、修改样式、分组和摘要数据

Flex4中,组合使用Spark和MX空间能够实现任何想要的功能
例如Form、DataGrid和AdvancedDataGrid在Spark中没有提供,那么就使用MX版
MX与Spark能够很好的集成,共同为开发提供组件支持

DataGrid 数据网格,按行和列呈现一个表格
DataGridColumn  定义某一列
dataField  将数据集中的列定位到DataGrid中的特定列

为DataGridColumn添加内联的编辑控件
    当焦点位于单元格时,只要将editable属性设为true即可
    默认的编辑控件是文本域
    通过itemEditor和editorDataField属性,可以指定编辑数据时所使用的编辑器
下面是可以指定的内置控件:
Button、CheckBox、ComboBox、DateField、Image、Label、NumericStepper、Text(默认)、TextArea、TextInput

创建MXML的项目呈现器以显示商品的图片和名称
通过<s:MXItemRenderer>为DataGrid创建项目呈现器

创建内联的MXML项目呈现器用于显示Remove按钮
创建项目呈现器的另一方式是使用<mx:itemRenderer>标签
该标签允许在DataGridColumn中以内联的方式声明并创建项目呈现器
在<mx:cellRenderer>标签中,放置一个<fx:Component>标签,这样标签内部将拥有自己的区域
可以在其中进行导入,函数定义等。
注意:内联项目呈现器仅特定用一个DataGrid,无法在其它DataGrid中重用!
--------------------------------------------------------------------
1.使用DataGrid列出购物车中所有的商品
ShoppingView.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Group 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="0" height="0" xmlns:components="components.*">
	<s:layout>
		<s:HorizontalLayout/>
	</s:layout>
	<s:states>
		<s:State name="State1"/>
		<s:State name="cartView"/>
	</s:states>
	

	<fx:Script>
		<![CDATA[
			import cart.ShoppingCart;
			import cart.ShoppingCartItem;
			
			import components.ProductItem;
			
			import events.ProductEvent;
			
			import mx.collections.ArrayCollection;
			
			import valueObjects.Product;
			[Bindable]
			public var shoppingCart:ShoppingCart = new ShoppingCart();//创建一个购物车,每种商品都使用同一个购物车!
			[Bindable]
			public var groceryInventory:ArrayCollection;//用于存放HTTPService返回的各种商品信息
			
			//查看当前购物车中的商品
			private function handleViewCartClick( event:MouseEvent ):void {
				this.currentState="cartView";
			}
			
			//该方法返回一个字符串,用来作为数据集的呈现方式,由labelFunction函数指定
			//当List中使用labelFunction时,会自动以正确的方式从dataProvider中获取数据并传递到该方法中
			//返回的字符串将作为被呈现的内容
			private function renderProductName(item:ShoppingCartItem):String {
				var product:Product = item.product;
				return "("+item.quantity+")" + product.prodName + " $" + item.subtotal;
			}
			
			
			//对ProductItem派发的addProduct事件进行监听并处理
			public function addProductHandler(event:ProductEvent):void {
				var sci:ShoppingCartItem = new ShoppingCartItem(event.product);//从自定义事件中获取属性
				shoppingCart.addItem(sci);
			}
			
			//对ProductItem派发的removeProduct事件进行监听并处理
			public function removeProductHandler(event:ProductEvent):void {
				var sci:ShoppingCartItem = new ShoppingCartItem(event.product);//从自定义事件中获取属性
				shoppingCart.removeItem(sci);
			}
		]]>
	</fx:Script>
	
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	
	<!-- 该DataGroup被下面的ProductList取代  
	            通过事件冒泡实现商品的添加与删除
	            因为原来在ProductItem中直接对购物车添加或删除商品的操作无法进行
	  	  原因是无法对每个ProductItem都传入同一个购物车
		 [虽然this.parent.parent.shoppingCart可以访问到购物车,但是依赖性太强,不推荐]
		<s:DataGroup width="100%" height="100%" 
					 width.cartView="0" height.cartView="0" visible.cartView="false"
					 dataProvider="{groceryInventory}"
					 itemRenderer="components.ProductItem">
			<s:layout>
				<s:VerticalLayout/>
			</s:layout>
		</s:DataGroup>
	-->
	
	<!-- 使用具有事件监听出派发功能的组件替代原来的DataGroup-->
	<!-- 实现添加/删除商品的步骤:
	     ProductList作为一个组件,通过dataProvider获取到数据
		  在ProductList中又指名了itemRenderer为ProductItem
		  这样,ProductItem中的product属性就可以被赋予值
		  当添加商品的时候,会触发addProduct事件,而且事件可以冒泡
		  在ProductList中对该事件进行了声明,则可以对该事件继续向上冒泡
		  这样,在ShoppingView中就可以对这个事件进行捕获并处理!!!
	           然后,在ProductList组件中就可以指定事件发生后的处理函数了!!!
	-->
	<components:ProductList width="100%" height="100%"
							width.cartView="0" height.cartView="0" visible.cartView="false"
							dataProvider="{groceryInventory}"
							addProduct="addProductHandler(event)"
							removeProduct="removeProductHandler(event)"/>
	
	<!-- 购物车组件 -->
	<s:VGroup id="cartGroup" height="100%"  width.cartView="100%">
		<s:List id="cartList"
				dataProvider="{shoppingCart.items}" includeIn="State1"
				labelFunction="renderProductName"/>			
		<s:Label text="Your Cart Total: ${shoppingCart.total}"/>
		<s:Button label="View Cart" click="handleViewCartClick( event )" includeIn="State1"/>
		
		<!-- 使用自定义的DataGrid呈现购物车的详细信息-->
		<components:CartGrid id="dgCart" includeIn="cartView" width="100%" height="100%"
							 dataProvider="{shoppingCart.items}"
							 removeProduct="removeProductHandler(event)"/>
		
		<s:Button includeIn="cartView" label="Continue Shopping" click="this.currentState=''"/>
	</s:VGroup>
</s:Group>

2.DataGrid中的列单元格使用项目呈现器,单元格内显示图片和商品名称
自定义项目呈现器ProductName.mxml
<?xml version="1.0" encoding="utf-8"?>
<!--定义DataGrid中特定单元格的布局
    这里将在单元格中显示商品的图片和名称,而不只是字符串-->
<s:MXItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
				  xmlns:s="library://ns.adobe.com/flex/spark" 
				  xmlns:mx="library://ns.adobe.com/flex/mx"
				  clipAndEnableScrolling="true"> <!-- 防止项目呈现器中的内容不超过其边界-->
	<s:layout>
		<s:HorizontalLayout/>
	</s:layout>
	<fx:Script>
		<![CDATA[
			import valueObjects.Product;
		]]>
	</fx:Script>
	
	<!-- data代表该行本身的数据, 所以可以通过data获取到product-->
	<s:Image source="assets/{(data.product as Product).imageName}" width="100%"/>
	
	<s:Label text="{(data.product as Product).prodName}" width="100%" height="100%"/>
</s:MXItemRenderer>

3.单元格中加入remove的button
DataGrid中通过内联引入项目呈现器,将一个button放到单元格中
实现购物车中商品的移除
移除商品的时候使用到了自定义的ProductEvent事件
在ShoppingView中对事件进行监听并处理
CartGrid.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:DataGrid xmlns:fx="http://ns.adobe.com/mxml/2009" 
			xmlns:s="library://ns.adobe.com/flex/spark" 
			xmlns:mx="library://ns.adobe.com/flex/mx"
			editable="true"
			variableRowHeight="true"> <!-- 全局设置为可编辑,flex会根据缩略图自动调整DataGrid的行高-->
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	
	<fx:Metadata>
		[Event(name="removeProduct", type="events.ProductEvent")]
	</fx:Metadata>
	
	<fx:Script>
		<![CDATA[
			import cart.ShoppingCartItem;
			private function renderPriceLabel(item:ShoppingCartItem,column:DataGridColumn):String {
				var subtotal:Number = item[column.dataField];//通过列名从item中获取数据
				return "$"+String(subtotal);
			}
		]]>
	</fx:Script>
	
	
	<mx:columns>
		<mx:DataGridColumn headerText="Product" dataField="product" editable="false"
						   itemRenderer="components.ProductName"/> <!-- 不可编辑,并且使用自定义项目呈现器来进行数据呈现-->
		
		<!--itemEditor指定编辑数据时使用的编辑器  editorDataField指定了对应的属性--> 
		<mx:DataGridColumn headerText="Quantity" dataField="quantity"
						   itemEditor="mx.controls.NumericStepper"
						   editorDataField="value"/>
		
		<mx:DataGridColumn headerText="Amount" dataField="subtotal" editable="false"
						   labelFunction="renderPriceLabel"/> <!-- 不可编辑,通过labelFunction指定了一个函数来对呈现的数据进行操作-->
		
		<mx:DataGridColumn editable="false">
			
			<!-- 创建内联项目呈现器-->
			<mx:itemRenderer>
				<fx:Component>
					<s:MXItemRenderer>
						<s:layout>
							<s:VerticalLayout horizontalAlign="center"/>
						</s:layout>
						<fx:Script>
							<![CDATA[
								import cart.ShoppingCartItem;
								
								import events.ProductEvent;
								private function removeItem(item:ShoppingCartItem):void {
									var prodEvent:ProductEvent = new ProductEvent("removeProduct",item.product);
									dispatchEvent(prodEvent);
								}
							]]>
						</fx:Script>
						<s:Button label="Remove" click="removeItem(data as ShoppingCartItem)"/>
					</s:MXItemRenderer>
				</fx:Component>
			</mx:itemRenderer>
			
		</mx:DataGridColumn> <!-- 不可编辑-->
	</mx:columns>
</mx:DataGrid>


分享到:
评论

相关推荐

    在DataGrid控件中设置单元格的数据显示格式.

    本节我们将深入探讨如何在DataGrid控件中设置单元格的数据显示格式,以便更好地呈现和管理数据。 首先,我们要理解DataGrid控件的基本结构。DataGrid控件由一系列行和列组成,每个单元格是这些行和列的交叉点,显示...

    WPF DataGrid合并单元格(模板列嵌套DataGrid)

    在描述中提到的"非真正合并",实际上是指我们在DataGrid中创建的每个单元格都是独立的,只是通过样式和布局设置使得相邻的单元格在视觉上表现为一个大的单元格。这种方式的优势在于,它仍然保留了每个单元格的独立性...

    wpf datagrid 单元格颜色 根据datatable动态显示datagrid内容

    本主题将深入探讨如何根据DataTable中的数据动态显示DataGrid的内容,并且根据特定条件改变单元格的颜色。 首先,我们需要了解DataGrid的基本用法。DataGrid控件允许我们将数据绑定到各种数据源,如...

    WPF Datagrid 合并单元格

    在某些情况下,为了更好地组织和呈现数据,我们需要对Datagrid的单元格进行合并,特别是在创建复杂表头时。本文将深入探讨如何在WPF Datagrid中实现单元格合并,并涉及相关类和文件的功能。 首先,我们要理解WPF ...

    DataGrid简单实现合并单元格

    标题提到的“DataGrid简单实现合并单元格”,实际上是指在不真正合并单元格的情况下,通过自定义头模板和单元格模板来模拟单元格合并的效果。下面,我们将深入探讨如何实现这一功能。 首先,理解DataGrid的基本结构...

    WPF DataGrid 中显示图片的小例子

    在Windows Presentation Foundation (WPF) 中,DataGrid控件是一个非常强大的数据展示工具,它可以用于显示和编辑结构化的数据。然而,除了基本的文本和数字数据外,有时我们还需要在DataGrid中显示图像。本教程将...

    wpf中datagrid动态设置单元格背景

    当我们需要根据数据的某些条件动态改变`DataGrid`中单元格的背景颜色时,就需要对控件进行一些定制化操作。以下将详细讲解如何实现这个功能。 首先,我们需要理解`DataGrid`的基本结构。`DataGrid`的每一行由多个`...

    DataGrid的单元格背景和文字颜色

    在.NET框架中,WPF(Windows Presentation Foundation)提供了一个强大的数据呈现控件——DataGrid,它用于显示和编辑网格中的数据。本篇文章将深入探讨如何自定义DataGrid的单元格背景和文字颜色,以实现更丰富的...

    wpf datagrid 单元格颜色 根据条件改变颜色 例子

    在WPF(Windows Presentation Foundation)开发中,DataGrid控件是一种常用的数据展示工具,它可以用于显示和编辑结构化的数据。在某些场景下,我们可能希望根据数据的不同状态或条件来改变DataGrid单元格的颜色,以...

    C#实现改变DataGrid某一行和单元格颜色的方法

    在C#中,改变DataGrid的行和单元格颜色通常涉及到对WPF的DataGrid控件的操作,包括数据源的绑定、行和单元格的获取以及样式设置。以下是一个详细的步骤来实现这一功能: 1. **添加DataGrid控件**: 在XAML文件中,...

    wpf DataGrid 实现单击单元格进入编辑状态

    DataGrid是WPF中的一个核心控件,用于显示和编辑结构化数据。它提供了丰富的功能,如排序、分页、选择和编辑等。默认情况下,DataGrid在用户双击单元格时进入编辑模式,但有时我们希望用户只需单击就能开始编辑,这...

    DataGrid表头合并和单元格内容合并-升级版

    总的来说,掌握DataGrid的表头和单元格合并技巧对于开发复杂的业务应用至关重要,这不仅提升了用户体验,也使得数据的呈现更为直观和清晰。开发者需要熟悉.NET框架下的DataGrid控件,理解其API和事件机制,才能灵活...

    DataGrid(WinForm)行或单元格变色控件

    使DataGrid的指定行或指定列或指定值为不同条件时以指定的颜色显示突出。 文件名称:DateGridColorSet.dll 制作日期:2005/11/05 开发人员:王波 参考资料:Syncfusion & CSDN 所属项目:JDS ERP 功能介绍:使...

    wpf 动态合并datagrid表头单元格

    Datagrid由行和列组成,每个单元格对应一个数据项。表头(Header)是每一列的标题,用于标识该列的数据类型或含义。在默认情况下,Datagrid的表头是独立的,无法直接进行合并。为了实现动态合并,我们需要自定义逻辑...

    datagrid合并单元格,MecGrid实现

    在实际项目中,`MecGrid`还提供了其他高级特性,如自定义渲染器、性能优化和可扩展性。通过充分利用这些特性,开发者可以创建出满足各种业务需求的灵活且强大的数据展示界面。 总的来说,`MecGrid`为Flex的`...

    datagrid单元格上点击弹出窗口(官网例子)

    1. **DataGridPopUpEditor.as** - 这个文件可能定义了一个自定义的单元格编辑器类,它扩展了默认的datagrid编辑器,当用户点击单元格时,这个编辑器会弹出一个窗口。它可能包含触发弹窗显示的事件监听器,以及与弹窗...

    WPF.DataGrid.MergeRow

    行的合并意味着相邻的行在视觉上合并为一行,单元格的合并则意味着同一列中的多个单元格显示为一个大的单元格。 2. **合并行**: 合并行通常是基于数据源中的某个条件,例如当两行具有相同的值时。这需要在后台...

    miniui datagrid 合并单元格

    2. **单元格合并的概念与应用场景**:单元格合并是指在同一列中将相邻的具有相同值的多个单元格合并为一个单元格的过程。 3. **McMergeCells函数的实现逻辑**:该函数是作者原创的一种高效合并单元格的方法,通过对...

    easyui datagrid editor回车切换单元格示例,可参考

    easyui datagrid editor回车切换单元格示例,适合熟悉easyui但又不懂如何做的人员,可能参考一下源码JS。

    datagrid合并单元格

    - 单元格合并:指在`datagrid`中将多个相邻的单元格合并为一个大单元格,可以是横向或纵向合并。 2. **合并原因** - 提高可读性:通过合并单元格,可以减少重复信息,使数据更加清晰。 - 规范布局:对于有层次的...

Global site tag (gtag.js) - Google Analytics