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文件中添加如下代码
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 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页面中添加如下代码
然后,我们在.aspx.cs文件中添加如下代码
{
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;
}
再次运行页面,你将会得到如下界面:
更改一些内容,提交之后,查看列表内容,你会发现原列表项的内容被更新了。