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

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

     

     

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

     

  • 相关阅读:
    chromedriver安装与配置(ubuntu linux下)
    Ajax 通信技术--hidden Frame GET 请求 和 POST 请求
    photoshop去除图片上的水印
    redis和memcache的对比
    关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用
    MYSQL中'TYPE=MyISAM'错误的解决方案
    http协议
    jQuery常用方法
    SQL Server中行列转换 Pivot UnPivot
    jQuery插件开发
  • 原文地址:https://www.cnblogs.com/Jayan/p/1912994.html
Copyright © 2020-2023  润新知