用smartform其实已经很方便了,无奈总得学几招吧

     1建立一个工程***.EIP.Form,映射CONTROLTEMPLATES文件夹,在这个文件夹下添加新建项:一个sharepoint2010的用户控件:如: GrapeCityDefaultTemplates.ascx 然后把GrapeCityDefaultTemplates.ascx.cs文件删除掉。在ascx页面里的代码也全部删除,直接去看DefaultTemplates.ascx,把上面的引用和ListForm复制过来,改ListForm为***ListForm。

<%@ Control Language="C#" AutoEventWireup="false" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
    Namespace="Microsoft.SharePoint.WebControls" %>
<%@ Register TagPrefix="ApplicationPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
    Namespace="Microsoft.SharePoint.ApplicationPages.WebControls" %>
<%@ Register TagPrefix="SPHttpUtility" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
    Namespace="Microsoft.SharePoint.Utilities" %>
<%@ Register TagPrefix="wssuc" TagName="ToolBar" Src="~/_controltemplates/ToolBar.ascx" %>
<%@ Register TagPrefix="wssuc" TagName="ToolBarButton" Src="~/_controltemplates/ToolBarButton.ascx" %>

<SharePoint:RenderingTemplate id="***ListForm(这个地方改名字)" runat="server">
 <Template>
  <span id='part1'>
   <SharePoint:InformationBar runat="server"/>
   <div id="listFormToolBarTop">
   <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator="&amp;#160;" runat="server">
     <Template_RightButtons>
      <SharePoint:NextPageButton runat="server"/>
      <SharePoint:SaveButton runat="server"/>
      <SharePoint:GoBackButton runat="server"/>
     </Template_RightButtons>
   </wssuc:ToolBar>
   </div>
   <SharePoint:FormToolBar runat="server"/>
   <SharePoint:ItemValidationFailedMessage runat="server"/>
   <table class="ms-formtable" style="margin-top: 8px;" border="0" cellpadding="0" cellspacing="0" width="100%">
   <SharePoint:ChangeContentType runat="server"/>
   <SharePoint:FolderFormFields runat="server"/>

   下面的地方ListFieldIterator为列表项的展示
   <SharePoint:ListFieldIterator runat="server"/>
   <SharePoint:ApprovalStatus runat="server"/>
   <SharePoint:FormComponent TemplateName="AttachmentRows" runat="server"/>
   </table>
   <table cellpadding="0" cellspacing="0" width="100%"><tr><td class="ms-formline"><img src="/_layouts/images/blank.gif" width='1' height='1' alt="" /></td></tr></table>
   <table cellpadding="0" cellspacing="0" width="100%" style="padding-top: 7px"><tr><td width="100%">
   <SharePoint:ItemHiddenVersion runat="server"/>
   <SharePoint:ParentInformationField runat="server"/>
   <SharePoint:InitContentType runat="server"/>
   <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator="&amp;#160;" runat="server">
     <Template_Buttons>
      <SharePoint:CreatedModifiedInfo runat="server"/>
     </Template_Buttons>
     <Template_RightButtons>
      <SharePoint:SaveButton runat="server"/>
      <SharePoint:GoBackButton runat="server"/>
     </Template_RightButtons>
   </wssuc:ToolBar>
   </td></tr></table>
  </span>
  <SharePoint:AttachmentUpload runat="server"/>
 </Template>
</SharePoint:RenderingTemplate>

用SharePoint Manager 2010 修改表单关联的ListForm改为***ListForm:

(SharePoint_Config->ContentService->Web Applications->SharePoint - ****端口号->Site Collection->http://*******机器名:****端口号->网站集的名字->Webs->子网站的名字->Lists->列表的名字->ContentTypes->项目->看右边的列表properties->修改NewFormTemplateName,EditFormTemplateName,DisplayFormTemplateName后面的属性名字为***ListForm->通过菜单的File选择保存->iisrest(敲命令行,重启IIS))

     2在 GrapeCityDefaultTemplates.ascx里引用其他用户控件:比如Log,附件,按钮等等。

     在CONTROLTEMPLATES文件夹下建立一个文件夹:GrapeCityUserContrl,在这个文件夹下新建UserContrl(HeadPlacePart.ascx),比如对一些字段(单据编号,申请人)设置为只读,隐藏,换个样子等操作。则可以直接用下面的代码。

<tr runat="server" id="trCode">
    <td class="ms-formlabel">
        <SharePoint:FieldLabel ID="FieldLabel8" runat="server" FieldName="单据编号">
        </SharePoint:FieldLabel>
    </td>
    <td class="ms-formbody">
        <SharePoint:FormField ID="ffCode" runat="server" FieldName="单据编号" ControlMode="Display">
        </SharePoint:FormField>
    </td>
</tr>

<tr>
    <td class="ms-formlabel">
        <SharePoint:FieldLabel ID="FieldLabel6" runat="server" FieldName="申请人">
        </SharePoint:FieldLabel>
    </td>
    <td class="ms-formbody">
        <asp:Label runat="server" ID="lbUser"></asp:Label>
        <SharePoint:FormField ID="ffUser" runat="server" FieldName="申请人" ControlMode="Display">
        </SharePoint:FormField>
    </td>
</tr>    

 protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

     if (Microsoft.SharePoint.SPContext.Current.FormContext.FormMode == SPControlMode.New)
            {

      trCode.Visible = false;

                lbUser.Text = SPContext.Current.Web.CurrentUser.Name;
                ffUser.Visible = false;

            }

            if (SPContext.Current.FormContext.FormMode == SPControlMode.Edit)
            {
                lbUser.Visible = false;

            }
          }

   编译通过后引用到GrapeCityDefaultTemplates.ascx的<SharePoint:ListFieldIterator runat="server"/>的上面。

//引用:

<%@ Register Src="~/_controltemplates/FormUserControl/HeadPlacePart.ascx" TagName="HeadPlacePart"  TagPrefix="uc1" %>

//嵌套在GrapeCityDefaultTemplates.ascx里

<SharePoint:FolderFormFields ID="FolderFormFields1" runat="server" />
//下面的地方放置了usercontrl

<uc1:HeadPlacePart ID="HeadPlacePart1" runat="server" />
<SharePoint:ListFieldIterator ID="ListFieldIterator1" runat="server" />

    3既然设置了某些字段只读,那么就得让这字段隐藏,我写了个webpart。其实想想在上面的用户控件里也可以做到。

 

  protected override void OnLoad(EventArgs e)
  {
            base.OnLoad(e);           
            SPField sptest = null;
            if (SPContext.Current.List.Fields.ContainsField("Title"))
            {
                sptest = SPContext.Current.Fields.GetFieldByInternalName("Title") as SPField;
                sptest.Hidden = true;
            }

}

     这样一个自定义的表单就可以了。

     在我的项目里这个表单做了几个事情:

1在新建的时候是没有单据编号的,所以这个字段隐藏,

2申请人用了sharepoint自己的创建人改了名字,用一个lable显示了当前登录的用户的域名。隐藏了编辑和查看时候再显示的FormField。

3新建了申请时间:ApplyTime,当前时间,设置为了只读。

4新建了单据状态,下拉菜单:草稿;已提交;....直属领导审批通过,等待财务审批;....已完成。只读。

5这些“只读”的字段可以和新建的字段“无缝拼接”上。

6重写了上传附件的部分,增加了工作流日志的表格放在最下面:处理人,处理时间,处理结果,处理意见。 

7重写了保存按钮,增加了提交按钮,发起工作流按钮。

 这样,算是像个样子了。

 后来想想,写UserControl的时候,再丰富些不就是那位写smartform仁兄的思路了吗。所以在中国这个每个页面都要改来改去的国情下,觉得用smartform就挺好的。