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;
        }

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

 

 

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

 

原文地址:https://www.cnblogs.com/Jayan/p/1912994.html