转:扩展GridView控件(下)

下面列出了将Context Menu绑定到GridView上的几个步骤:

1)在ASP.NET页面上放置ContextMenu控件

2) 在ContextMenu里添加菜单项目单击处理事件

3)加载带有ContextMenuItems的ContextMenu

配置带有ContextMenuID的菜单,可以从下面开始:

 

None.gif < ctMenu:ContextMenu  ID ="ContextMenu1"
None.gif
None.gif runat
="server"  BackColor ="#99CCCC"
None.gif
None.gif ForeColor
="Maroon"  OnItemCommand ="ContextMenu1_ItemCommand"
None.gif
None.gif RolloverColor
="#009999"   />
None.gif

 

上面的代码使用了ID为ContextMenu1的ContextMenu控件并增加了OnItemCommand事件,该实现在用户单击右键菜单选择菜单项目时触发。

 下面代码显示了单击事件。

Listing 6

 

 

None.gif protected   void  ContextMenu1_ItemCommand( object  sender, CommandEventArgs e)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif 
// Use the RightClickedRow property which is a GridViewRow to know
InBlock.gif
InBlock.gif 
// which row was right-clicked
InBlock.gif

InBlock.gif 
int rowIndex = this.XGrid1.RightClickedRow.RowIndex;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif 
switch (e.CommandName)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif
InBlock.gif    
case "Add":
InBlock.gif
InBlock.gif      
this.XGrid1.ChangeInsertMode(true);
InBlock.gif
InBlock.gif      
break;
InBlock.gif
InBlock.gif    
case "Edit":
InBlock.gif
InBlock.gif      
this.XGrid1.EditIndex = rowIndex;
InBlock.gif
InBlock.gif      
break;
InBlock.gif
InBlock.gif    
case "Delete":
InBlock.gif
InBlock.gif      DeleteGridViewRow(rowIndex);
InBlock.gif
InBlock.gif      
break;
InBlock.gif
InBlock.gif    
default:
InBlock.gif
InBlock.gif      
break;
InBlock.gif
ExpandedSubBlockEnd.gif }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif

 

当用户选择“Add a new Row”时,我们通过代码设置GridView进入插入模式,这是调用GridView内置的ChangeInsertMode方法实现的。该方法可以让GridView在插入模式和正常模式之间切换。

为了能够让用户插入数据,您可能需要在FooterTemplate放置一些控件,以便使用这些控件收集数据。

假如用户选择“Edit Row”,我们设置GridView的EditIndex属性,这样就可以使用当前行进入编辑模式

 

当用户选择“Delete Row”时,我们调用一个方法来删除当前行

正如前面介绍的,我们需要设置GridView的ContextMenuID属性,下面代码显示了他的使用

Listing 7

       

None.gif   < xGrid:xGrid  ID ="XGrid1"
None.gif
None.gif runat
="server"  AllowPaging ="True"
None.gif
None.gif AutoGenerateColumns
="False"  DataKeyNames ="CustomerID"
None.gif
None.gif ContextMenuID
="ContextMenu1" >
None.gif
None.gif            
< Columns >
None.gif
None.gif                
< asp:TemplateField  HeaderText ="Manage Row" >
None.gif
None.gif                    
< edititemtemplate >
None.gif
None.gif                        
< asp:LinkButton
None.gif
None.gif 
text ="Update"  runat ="server"  id ="lnkUpdate"
None.gif
None.gif CommandName
="Update"  CommandArgument ='<%
None.gif
None.gif 
Bind("CustomerID") % > ' /> &nbsp;&nbsp;
None.gif
None.gif                        
< asp:LinkButton
None.gif
None.gif 
text ="Cancel"  runat ="server"  id ="lnkCancel"
None.gif
None.gif CommandName
="Cancel"   />
None.gif
None.gif                    
None.gif
None.gif
</ edititemtemplate >
None.gif
None.gif                    
< footertemplate >
None.gif
None.gif                        
< confirmControl:ConfirmLinkButton  ID ="lnkAdd"  runat ="server"
None.gif
None.gif Text
="Add"  MessageText ="Are you sure you want to add this
None.gif
None.gif record?"
 OnClick ="btnAdd_Click"   />
None.gif
None.gif                        
< asp:LinkButton
None.gif
None.gif 
id ="lnkCancelAdd"  runat ="server"  text ="Cancel"
None.gif
None.gif OnClick
="btnCancel_Click"   />
None.gif
None.gif                    
None.gif
None.gif
</ footertemplate >
None.gif
None.gif                    
< itemtemplate >
None.gif
None.gif                        
< asp:LinkButton
None.gif
None.gif 
id ="lnkEdit"  runat ="server"  CommandArgument ='<%
None.gif
None.gif 
Bind("CustomerID") % > ' CommandName="Edit"
None.gif
None.gif text="Edit" __designer:wfdid="w1">
</ asp:LinkButton > &nbsp;&nbsp;
None.gif
None.gif 
< confirmControl:ConfirmLinkButton  id ="lnkDelete"
None.gif
None.gif runat
="server"  CommandArgument ='<%  Bind("CustomerID")
None.gif
None.gif %
> ' CommandName="Delete" MessageText="Are you sure you want
None.gif
None.gif to delete this record?" Text="Delete">
</ confirmControl:ConfirmLinkButton >  
None.gif
None.gif                    
None.gif
None.gif
</ itemtemplate >
None.gif
None.gif                
</ asp:TemplateField ></ Columns >
None.gif
None.gif

 

下面的代码显示了如何为ContextMenu从外部的XML文件加载数据

Listing 8

 

None.gif private   void  PopulateContextMenu()
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif XmlReaderSettings settings 
= new XmlReaderSettings();
InBlock.gif
InBlock.gif 
string contextmenuxml = Path.Combine(Request.PhysicalApplicationPath,
InBlock.gif
InBlock.gif    
"contextmenu.xml");
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif NameTable nameTable 
= new NameTable();
InBlock.gif
InBlock.gif 
object contextMenuItem = nameTable.Add("contextmenuitem");
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif settings.NameTable 
= nameTable;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif 
using(XmlReader reader = XmlReader.Create(contextmenuxml, settings))
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif
InBlock.gif    
while (reader.Read())
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif      
// Read a single ContextMenuItem
InBlock.gif

InBlock.gif      
if ((reader.NodeType == XmlNodeType.Element) && (contextMenuItem.Equals
InBlock.gif
InBlock.gif        (reader.LocalName)))
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif
InBlock.gif        XmlReader subTree 
= reader.ReadSubtree();
InBlock.gif
InBlock.gif        ContextMenuItem menuItem 
= new ContextMenuItem();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
// Get contents of a single ContextMenuItem
InBlock.gif

InBlock.gif        
while (subTree.Read())
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif          
if ((subTree.NodeType == XmlNodeType.Element) &&
InBlock.gif
InBlock.gif            (subTree.LocalName.Equals(
"text")))
InBlock.gif
InBlock.gif            menuItem.Text 
= subTree.ReadString();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif          
if ((subTree.NodeType == XmlNodeType.Element) &&
InBlock.gif
InBlock.gif            (subTree.LocalName.Equals(
"commandname")))
InBlock.gif
InBlock.gif            menuItem.CommandName 
= subTree.ReadString();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif          
if ((subTree.NodeType == XmlNodeType.Element) &&
InBlock.gif
InBlock.gif            (subTree.LocalName.Equals(
"tooltip")))
InBlock.gif
InBlock.gif            menuItem.Tooltip 
= subTree.ReadString();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif          
if ((subTree.NodeType == XmlNodeType.Element) &&
InBlock.gif
InBlock.gif            (subTree.LocalName.Equals(
"onclientclick")))
InBlock.gif
InBlock.gif            menuItem.OnClientClick 
= subTree.ReadString();
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
// Add item to ContextMenu
InBlock.gif

InBlock.gif        
this.ContextMenu1.ContextMenuItems.Add(menuItem);
InBlock.gif
ExpandedSubBlockEnd.gif      }

InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockEnd.gif }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif

 

 

该外部的XML文档代码如下

Listing 9

 

None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< contextmenu >
None.gif
None.gif 
< contextmenuitem >
None.gif
None.gif    
< text > Add a new Row </ text >
None.gif
None.gif    
< commandname > Add </ commandname >
None.gif
None.gif    
< tooltip > Add a new Row </ tooltip >
None.gif
None.gif    
< onclientclick  />
None.gif
None.gif 
</ contextmenuitem >
None.gif
None.gif 
< contextmenuitem >
None.gif
None.gif    
< text > Delete Row </ text >
None.gif
None.gif    
< commandname > Delete </ commandname >
None.gif
None.gif    
< tooltip > Delete Row </ tooltip >
None.gif
None.gif    
< onclientclick > return
None.gif
None.gif __ConfirmMessage('Are you sure you want to delete this
None.gif
None.gif row?');
</ onclientclick >
None.gif
None.gif 
</ contextmenuitem >
None.gif
None.gif 
< contextmenuitem >
None.gif
None.gif    
< text > Edit Row </ text >
None.gif
None.gif    
< commandname > Edit </ commandname >
None.gif
None.gif    
< tooltip > Edit Row </ tooltip >
None.gif
None.gif    
< onclientclick  />
None.gif
None.gif 
</ contextmenuitem >
None.gif
None.gif
</ contextmenu >
None.gif
None.gif

 

每一个ContextMenuItem 元素都包含下面的自动:

Text:在ContextMenu显示的上下文

CommandName:处理命令的名称,例如Edit,Delete,Add或者其他的名称

ToolTip:ContextMenuItem上的提示信息

OnClientClick:客户端处理事件

 

 

GridView列标头添加图片

另外,还可以绑定到XML上为头元素的升序/降序添加图片

当配置GridView支持排序时,这个功能会在GridView的头标题添加一个生效、降序图片。当GridView初始化加载时,并没有图片显示,只有您单击列标头素时,才会显示一个图片,您可以通过该图片查看当前排序方式,下图显示了在一列排序的结果

 

相关的属性为:AscImage和DescImage:这两个属性设置升序/降序的图片

 

 

 

当行数目小于页面大小时修正GridView的高度

您是否注意到当GridView的行数目小于页面PageSize大小时,GridView的高度降会收缩?加入在第一页显示10条记录,当您进入到第2页面时,如果该页面只有5条记录,您会发现GridView会收缩到适应5条记录的高度,这很恼人,因为您更希望GridView总是保持同一高度。

在图6您会发现GridView显示了几条记录,您可能已经注意到几条空的记录,因为这个页面的记录数目小于GridView页面的大小,这个添加是自动添加的

注意:空的记录仅仅是为了维护GridView的高度。

本文介绍扩展的XGrid已经内置了这个功能

 

 

内置的文本过滤

   这是继ContextMenu后的第二个最有趣的特性。您可以在自定义GridView头标题里TextBox里输入任何文本。

当您在文本框里输入一些文本并单击回车时,将会触发FilterCommand事件,您可以使用该事件实现数据的过滤

 

相关的属性如下:

IsFilterd:该属性设置是否启用过滤功能,取值为true或者时false。

FilterStyle:这个属性允许您具体指定新加入到头标题的样式。

CSSFilterbox和SkinIDFilterbox

下图显示了一个自定义头标题,可以使用这个功能进行数据过滤

 

 

 

None.gif protected   void  XGrid1_FilterCommand( object  sender, FilterCommandEventArgs e)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif 
if (!e.FilterExpression.Equals(""))
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif
InBlock.gif    FilterBind(e.FilterExpression.ToString());
InBlock.gif
InBlock.gif    
//return;
InBlock.gif

ExpandedSubBlockEnd.gif }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif   
// Serves both with/out filter
InBlock.gif

InBlock.gif 
this.XGrid1.DataBind();
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif

 

 

内置的每行的复选和全部的复选

 这个功能是在GridView的每一行添加一个CheckBox,这个功能同样参考Dino Esposito的文章

这里有两个属性

AutoGenerateCheckBoxColumn和

CheckBoxColumnIndex

 

下图显示了运行结果

 

 

 

 

值得一提的是,当EnableRowClick 或者EnableRowDoubleClick 任何一个被设置为true时,由于MouseOverColor会覆盖SelectRowStyle样式,所以选择一行并不会显示SelectRowStyle的样式

 

 

 

 

 

确认按钮

我们已经包含了三种不同的按钮: Confirm 按钮,Image按钮和Confirm Link按钮,这些按钮除了具有常规功能外,还额外添加了下面两个属性:

EnableConfirmMsg:该该属性的取值为true或者是false。当设置为false,该按钮和常规的按钮功能一样。当该属性设置为true时,当客户端向服务器提交信息之前,会出现确认对话框

当EnableConfirmMsg属性被设置为true时,MessageText属性设置弹出消息的具体内容

posted on 2007-02-07 09:23 猫咬狗 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/ttcre2/archive/2007/02/07/642878.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值