SharePoint2010列表表单:用后台代码生成表单

基于SharePoint做过二次开发的都知道,SharePoint提供了各种表单空间来呈现每列的类型。这些空间出现在标准的展示、新建、编辑的表单上,他们全部继承于类: BaseFieldControl

在一个SharePoint列表(类:SPList)中有很多字段,每一个SPField元素基于BaseFieldControl创建一个控件,每一个控件都是由一个或者多个ASP.NET控件组成的复合的控件。如:单行文本控件,它是一个经过包装后的TextBox控件;而对以一个富文本控件,就需要更复杂的控件,当然,还需要有JavaScript代码的支持。

BaseFieldControl能够直接连到SharePoint的列表项(SPListItem)BaseFieldControl.Value将会按照每列要求的格式来匹配填充列表项。

为了更好地阐述标题变大的意思,我用一个例子来说明:

1、 创建一个列表,随便添加两个字段进去,然后我们直接创建一个.aspx页面,在这个页面上,我们使用后台代码来展示这个列表的列表项。列表如下图:

 

 

 

1、 我们直接在layouts目录下创建一个.aspx页面(命名为:ItemDisplay),同时也创建一个.aspx.cs文件来访我们的代码。在.aspx文件中添加如下代码

代码
<% @ Page Language = " C# "  AutoEventWireup = " true "
DynamicMasterPageFile
= " ~masterurl/default.master "
CodeFile
= " DisplayListItem.aspx.cs "
Inherits
= " DisplayListItem "
MasterPageFile
= " v4.master "
CodeFileBaseClass
=   " Microsoft.SharePoint.WebControls.LayoutsPageBase "   %>
< asp:Content ContentPlaceHolderId = " PlaceHolderMain "  runat = " server " >
< asp:PlaceHolder runat = " server "  ID = " content "   />
</ asp:Content >

 

.aspx.cs文件中添加如下代码

代码
using  System;
using  Microsoft.SharePoint;
using  Microsoft.SharePoint.WebControls;
using  System.Web.UI.WebControls;
using  System.Web.UI;
using  System.Collections.Generic;
public   partial   class  DisplayListItem : LayoutsPageBase
    {
        
protected   void  Page_Load( object  sender, EventArgs e)
        {
            ShowListItem();
        }

        
protected   void  ShowListItem()
        {
            
using  (SPWeb web  =  SPContext.Current.Web)
            {
                
//  Define List and ItemID
                SPList list  =  web.Lists[ " MyNewList " ];
                
int  listItemId  =   1 ;
                Table table 
=   new  Table();
                table.BorderStyle 
=  BorderStyle.Dotted;
                
foreach  (SPField f  in  list.Fields)
                {
                    
if  ( ! f.Hidden  &&  f.CanBeDisplayedInEditForm)
                    {
                        
//  Render every visible field with a rendering control
                        BaseFieldControl bfc  =  f.FieldRenderingControl;
                        
if  (bfc  !=   null )
                        {
                            SPContext renderContext 
=  SPContext.GetContext( this .Context, listItemId, list.ID, web);
                            bfc.ListId 
=  list.ID;
                            bfc.FieldName 
=  f.InternalName;
                            bfc.ID 
=  f.InternalName;
                            bfc.ControlMode 
=  SPControlMode.Display; // .Edit; // .Display;
                            bfc.RenderContext  =  renderContext;
                            bfc.ItemContext 
=  renderContext;
                            bfc.EnableViewState 
=   true ;
                            bfc.Visible 
=   true ;
                            table.Rows.Add(CreateTR(f, bfc));
                        }
                    }
                }
                
                content.Controls.Add(table);
            }
        }

        
private  TableRow CreateTR(SPField field, Control ctl)
        {
            TableRow tr 
=   new  TableRow();
            TableCell td1 
=   new  TableCell();
            td1.Text 
=  field.InternalName  +   "  ( "   +  field.Title  +   " ) " ;
            TableCell td2 
=   new  TableCell();
            td2.Controls.Add(ctl);
            TableCell td3 
=   new  TableCell();
            td3.Text 
=  field.Description;
            TableCell td4 
=   new  TableCell();
            td4.Text 
=  field.FieldRenderingControl.ToString();
            tr.Cells.AddRange(
new  TableCell[] { td1, td2, td3, td4 });
            
return  tr;
        }

   
}

 

 

1、 运行这个页面,你就会得到如下的结果:

 

1、 我们可以通过更改ControlMode的属性来决定当前表单时处于编辑状态还是新建状态。比如我们要设当前的表单状态是可编辑的,我们需要做如下操作:

首先,在.aspx页面中添加如下代码

 

< asp:Button ID = " btn_SaveAndUpdate "  OnClick = " btn_SaveAndUpdate_Click "  Text = " Save "  runat = " server "   />

 

然后,我们在.aspx.cs文件中添加如下代码

 

代码
protected   void  btn_SaveAndUpdate_Click( object  sender, EventArgs e)
        {
            SPListItem li 
=   null ;
            List
< BaseFieldControl >  ctls  =  FindControls < BaseFieldControl > (content);
            
foreach  (BaseFieldControl bfc  in  ctls)
            {
                bfc.UpdateFieldValueInItem();
                li 
=  bfc.ListItem;
            }
            li.Update();
        }
        
private  List < T >  FindControls < T > (Control rootControl)  where  T : Control
        {
            List
< T >  retVal  =   new  List < T > ();
            
if  (rootControl.HasControls())
            {
                
foreach  (Control c  in  rootControl.Controls)
                {
                    
if  (c.GetType().IsSubclassOf( typeof (T))) retVal.Add((T)c);
                    retVal.AddRange(FindControls
< T > (c));
                }
            }
            
return  retVal;
        }

 

 

 

再次运行页面,你将会得到如下界面:

 

 

更改一些内容,提交之后,查看列表内容,你会发现原列表项的内容被更新了。

 

 

你可能感兴趣的:(SharePoint)