SharePoint:扩展DVWP - 第1部分:布局增强 – 在默认值模板和编辑模板中重新排列栏

当我们在数据视图中启用编辑,删除模式的链接时,SPD总是将链接添加到左边。 而我本来希望添加到右侧。所以需要对其进行移动。 对于一般的数据栏调整顺序,我们可以借助数据视图本身的“编辑列”功能。但是其中并不包含编辑/删除链接的栏。

注:本文中,我们只是关注于默认值模板和编辑模板。插入模板将在接下来的文章中单独讨论。

我们做不到什么?

首先,让我们来讨论一下哪些操作是行不通的。一些移动栏的常规操作(或者说从设计角度看起来应该可行的操作),在这里却会出现问题。

行不通的步骤

在SPD的设计视图中:

  • 用鼠标右击包含链接的列,并点击“选择”>“列”。
  • 再次右键单击并选择“剪切” 。
  • 用鼠标右击最右侧的列,选择“插入”>“列(在右侧)”。
  • 右键单击新插入的列,并选择“粘贴”。
  • 用鼠标点击最右侧的列(仍然是空的)并选择“删除”>“删除列”

这些步骤看似本应没问题,可是很快你就会发现处于编辑模式时页面上的链接乱了:本应在编辑模式里由保存和取消链接取代默认模式里的 编辑和删除链接,可是没有出现,而且编辑/删除链接也并没有如我们计划的那样出现在右侧。

正确的做法是,我们需要编辑该页面的XSL(eXtensible Stylesheet Language,可扩展样式表语言 )。

重新排列包含编辑/删除操作的栏

我们需要移动三个部分,因为整个页面分为三个功能区,所有这些部分共同构成了包含编辑和删除链接的列:

  • 表格的标题行
  • 默认模板中的列
  • 编辑模板中的数据列

1. 首先将光标移到标题栏的单元格内。

在拆分视图的设计窗格中,点击编辑/删除链接所处单元格顶部的单元格

点击编辑/删除链接上面的单元格

此时代码窗格将显示当前光标位置在代码中的哪个位置。

灰色的框显示的就是编辑/删除链接上面的单元格

由于我们准备移动链接栏到最右侧,所以也应该把相应的标题单元格移动对应位置。

很简单地修改原来的代码...

<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<th class="ms-vh" width="1%" nowrap=""></th>
</xsl:if>
<th class="ms-vh" nowrap="">Title</th>
<th class="ms-vh" nowrap="">修改者</th>
<th class="ms-vh" nowrap="">修改时间</th>

...为...

<th class="ms-vh" nowrap="">Title</th>
<th class="ms-vh" nowrap="">修改者</th>
<th class="ms-vh" nowrap="">修改时间</th>
<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<th class="ms-vh" width="1%" nowrap=""></th>
</xsl:if>

2. 然后移动默认模板的数据单元格

同样,在拆分视图的设计窗格中,点击 编辑 / 删除链接旁边的第一个单元格(不是该链接本身所处的单元格 )。

在设计窗格中,单击第一个字段,并从代码视图中找到相应的代码。

请注意,我们要移动的部分其实是在一个检查块中,好像是什么模式检查(if test="$dvt_1_automode = '1′")。不要担心所有的这些细节,只知道这是该模板的一部分,用来控制编辑和删除链接的显示就够了。 将整个<xsl:if>块移动到列表的末尾,这样就可以使其显示在最后(该行的最右侧 )。

<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<td class="ms-vb" width="1%" nowrap="">
<xsl:call-template name="dvt_1.automode">
<xsl:with-param name="KeyField">ID</xsl:with-param>
<xsl:with-param name="KeyValue" select="ddwrt:EscapeDelims(string(@ID))" />
<xsl:with-param name="Mode">view</xsl:with-param>
</xsl:call-template>
</td>
</xsl:if>
<td class="ms-vb">
<xsl:value-of select="@Title"/>
</td>
<td class="ms-vb">
<xsl:value-of select="@Editor" disable-output-escaping="yes"/>
</td>
<td class="ms-vb">
<xsl:value-of select="ddwrt:FormatDate(string(@Modified), 2052, 5)"/>
</td>

...到...

<td class="ms-vb">
<xsl:value-of select="@Title"/>
</td>
<td class="ms-vb">
<xsl:value-of select="@Editor" disable-output-escaping="yes"/>
</td>
<td class="ms-vb">
<xsl:value-of select="ddwrt:FormatDate(string(@Modified), 2052, 5)"/>
</td>
<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<td class="ms-vb" width="1%" nowrap="">
<xsl:call-template name="dvt_1.automode">
<xsl:with-param name="KeyField">ID</xsl:with-param>
<xsl:with-param name="KeyValue" select="ddwrt:EscapeDelims(string(@ID))" />
<xsl:with-param name="Mode">view</xsl:with-param>
</xsl:call-template>
</td>
</xsl:if>

保存该页面并在浏览器中查看,现在它现在看起来类似下面这样:

编辑/删除链接和标题中的空白都转移到最右边了

但是等等...点编辑后呢

由于我们的DVWP打开了编辑和删除模式,所以我们还有另一个视图需要修改,以使我们的链接在这两个视图中都位于最右侧。

如果你保存该页,并在浏览器打开,点击编辑链接时就发现,并不会打开EditForm.aspx,而是刷新当前页,所有可供编辑的字段以编辑控件的形式进行渲染。

编辑模板,正如浏览器中看到的。 请注意顶部标题行中的字段并没有正确的排列

看看SPD中是什么样子:

1. 当鼠标悬停在该Web部件上时右上角会显示一个右尖括号图标,点击该图标

2. 在弹出的菜单中的数据视图预览下拉列表框中选择编辑模板。

数据视图预览=编辑模板

注意到,现在我们的页面中有一个问题:标题行没有正确排列...

标题列总是往前错一个( 标题对链接;修改者对标题,依次类推)

这是因为每个模板都共用相同的标题行,但显示各自的数据行。但是,我们可以很容易地解决该问题,通过重复前面的步骤将保存 / 取消单元格移到最右边。

1. 在设计窗格中点击除链接字段以外的任意一个单元格,在代码窗格我们会发现,现在处于一个完全不同的模板 dvt_1.rowedit里。同样的方式,我们移动整个<xsl:if>块,将原来的:

<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<td class="ms-vb" width="1%" nowrap="nowrap">
<xsl:call-template name="dvt_1.automode">
<xsl:with-param name="KeyField">ID</xsl:with-param>
<xsl:with-param name="KeyValue" select="ddwrt:EscapeDelims(string(@ID))" />
<xsl:with-param name="Mode">edit</xsl:with-param>
</xsl:call-template> </td>
</xsl:if>
<td class="ms-vb">
<SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="Edit" FieldName="Title" ItemId="{@ID}" __designer:bind="{ddwrt:DataBind('u',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}" />
<SharePoint:FieldDescription runat="server" id="ff1description{$Pos}" FieldName="Title" ControlMode="Edit" />
</td> <td class="ms-vb">
<xsl:value-of select="@Editor" disable-output-escaping="yes" />
</td>
<td class="ms-vb">
<xsl:value-of select="ddwrt:FormatDate(string(@Modified),2052, 5)" />
</td>

...改为...

<td class="ms-vb">
<SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="Edit" FieldName="Title" ItemId="{@ID}" __designer:bind="{ddwrt:DataBind('u',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}" />
<SharePoint:FieldDescription runat="server" id="ff1description{$Pos}" FieldName="Title" ControlMode="Edit" />
</td> <td class="ms-vb">
<xsl:value-of select="@Editor" disable-output-escaping="yes" />
</td>
<td class="ms-vb">
<xsl:value-of select="ddwrt:FormatDate(string(@Modified),2052, 5)" />
</td>
<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<td class="ms-vb" width="1%" nowrap="nowrap">
<xsl:call-template name="dvt_1.automode">
<xsl:with-param name="KeyField">ID</xsl:with-param>
<xsl:with-param name="KeyValue" select="ddwrt:EscapeDelims(string(@ID))" />
<xsl:with-param name="Mode">edit</xsl:with-param>
</xsl:call-template> </td>
</xsl:if>

也是将xsl:if从顶部移到底部,这里的每个栏也都是在同一<tr>里的 <td>块。

现在所有的修改我们都是在代码窗格里做的,当单击设计窗格时 ,数据视图又会恢复到默认值模板,因此我们必须切换回编辑模板 (正如我们在上面操作的一样),这样才能看到修改后的外观。

设计视图中的保存/取消块移到了右侧

至此,我们实现了将DVWP中的操作链接编辑/删除移动到右侧 。 最终的页面布局看起来如下图所示:  
默认值模板 

编辑模板

在下一次的扩展DVWP系列中,我们会在插入模板中完成同样的目标。

转载:SharePoint:扩展DVWP - 第1部分:布局增强 – 在默认值模板和编辑模板中重新排列栏的更多相关文章

  1. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  2. [转载]Js小技巧||给input type=“password”的输入框赋默认值

    http://www.cnblogs.com/Raywang80s/archive/2012/12/06/2804459.html [转载]Js小技巧||给input type="passw ...

  3. 【FBA】SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用

    //http://www.cnblogs.com/OceanEyes/p/custom-provider-in-sharepoint-2013-fba-authentication.html 由于项目 ...

  4. [FBA]SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用

    //http://tech.ddvip.com/2014-05/1401197453210723.html 由于项目的需要,登录SharePoint Application的用户将从一个统一平台中获取 ...

  5. es6中参数【默认值,扩展运算符】

    参数默认值 1.普通参数 function info(age,name="grace"){ console.log(name); } info(); //输入:grace 2.对象 ...

  6. 『转载』hadoop2.x常用端口、定义方法及默认端口

    『转载』hadoop2.x常用端口.定义方法及默认端口 1.问题导读 DataNode的http服务的端口.ipc服务的端口分别是哪个? NameNode的http服务的端口.ipc服务的端口分别是哪 ...

  7. SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用

    由于项目的需要,登录SharePoint Application的用户将从一个统一平台中获取,而不是从Domain中获取,所以需要对SharePoint Application的身份验证(Claims ...

  8. CSS3 网格布局(grid-layout)基础知识 - 网格模板属性(grid-template)使用说明

    CSS3引入了新的网格布局(grid layout),以适应显示和设计技术的发展(尤其是移动设备优先的响应式设计). 主要目标是建立一个稳定可预料且语义正确的网页布局模式,用来替代过往表现不稳定且繁琐 ...

  9. 【转载】C#通过IndexOf方法判断某个字符串是否包含在另一个字符串中

    C#开发过程中针对字符串String类型的操作是常见操作,有时候需要判断某个字符串是否包含在另一个字符串,此时可以使用IndexOf方法以及Contain方法来实现此功能,Contain方法返回Tru ...

随机推荐

  1. java zip 工具类

    原文:http://www.open-open.com/code/view/1430906539866 package com.topsoft.websites.utils; import java. ...

  2. argument to nsmutablearray method addobject cannot be nil 警告

    You cannot add nil to an NSMutableArray, and you will raise an exception if you try to. There's NSNu ...

  3. 【深度探索c++对象模型】关于对象

    Linux进程的五个段 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属 ...

  4. C语言语句

    /*Console.Write("你能跑得过豹子吗,请输入 能/不能:"); string a = Console.ReadLine();//接收所输入的字符串内容, if (a= ...

  5. oracle SQL语句(转)

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

  6. iOS多线程编程(四)------ GCD(Grand Central Dispatch)

    一.简单介绍 是基于C语言开发的一套多线程开发机制.也是眼下苹果官方推荐的多线程开发方法.用起来也最简单.仅仅是它基于C语言开发,并不像NSOperation是面向对象的开发.而是全然面向过程的.假设 ...

  7. 李洪强iOS开发之 - 指定刷新tableview的某一组

    李洪强iOS开发之 - 指定刷新tableview的某一组

  8. arm-linux交叉编译环境搭建

    1.解压交叉编译工具链包 tar jxvf EABI-4.3.3_EmbedSky_20100610.tar.bz2 (笔者将交叉编译工具链包放在”/home ”目录下) 解压后会生成两个目录: [r ...

  9. Linux MySQL主从复制(Replication)配置

    MySQL是开源的关系型数据库系统.复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程. 配置主服务器(mast ...

  10. Arcgis Engine(ae)接口详解(3):featureClass的feature编辑和删除

    //由于测试数据不完善,featureClass在此要只设null值,真实功能要设实际的值 IFeatureClass featureClass = null; //获取某个字段的索引,后面取字段值用 ...