从后面的代码引用自定义列表表单字段,并自动用值填充它们

时间:2009-07-13 11:37:26

标签: sharepoint forms code-behind

我为我的列表制作了自定义的NewForm.aspx,我想为它添加一些自定义代码。所以我从我自己的班级继承了那个形式:

public class MyCustomNewForm : Microsoft.SharePoint.WebPartPages.WebPartPage

现在我想引用一些可用字段来自动为用户填充它们。 (Javascript在这里没有帮助,因为我必须从其他列表中获取一些数据)。

但我不知道如何从代码隐藏文件中引用这些字段。

在.aspx页面中编写控制字段的代码(好吧,它是由Sharepoint Designer在使用命令插入> SharePoint控件>自定义列表表单... 时生成的),如下所示:

<SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="New" FieldName="Title" __designer:bind="{ddwrt:DataBind('i',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}"/>

在运行时查看id时,它太长了

alt text http://img33.imageshack.us/img33/7495/ss20090713143352.png

那么我如何引用字段,所以我可以在我的代码隐藏文件中为它们设置 Text 属性?

2 个答案:

答案 0 :(得分:1)

在您的代码中使用WebDataForm控件;调用它的方法FindControl(@ID)

您可以从生成的页面html中找出ID;使用IE开发人员工具,它应该是$ff21_,例如ID = ff21

答案 1 :(得分:0)

不要介意这个痛苦的解决方案,但请向下滚动以查看编辑。

呃,我发现了一个解决方法。但警告!如果您不需要使用任何Sharepoint对象动态访问任何值,那么这篇文章不适合您,相反,您想阅读一些引用的文章。

因此,要使用其他列表中的值预填充NewForm.aspx中的某些字段,请执行以下操作。

简而言之:

  1. 制作自定义列表项表单。这样做step-by-step

  2. 创建一个继承自的类 Microsoft.SharePoint.WebPartPages.WebPartPage

  3. 在自定义表单aspx&lt;%@ Page上继承该类。我的看起来像这样:Inherits="xx.MeetingWorkspace.Tasks_NewFormxx, xx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5"

  4. protected override void OnInit(EventArgs e)功能使用中 FindControlRecursively找到 带ID的ContentPlaceHolder对象 “PlaceHolderMain”(称之为 函数on this.Controls [0],而不是on 这个对象)。

  5. 使用方法HtmlHiddenField制作HtmlHiddenField.Attributes.Add()个对象,指定值并添加属性“标题”。第7步你将需要它。

  6. 将隐藏字段添加到     你得到了ContentPlaceHolder     先前

  7. 使用Javascript(阅读herehere)     填写你想要的字段     隐藏字段值到这些字段     用户看到的。

  8. P.S。我是sharepoint的初学者,所以最好谨慎使用这些步骤。我很乐意找到一个答案,你可以在代码中引用你的字段,所以我不必使用任何javascript的东西。

    我的漫长旅程: 正如我所提到的,我为这个表单继承了我自己的公共类。使用这种技术,应该可以通过使用与表单ID相同的变量名称声明这些类控件来引用现有的表单字段。在屏幕截图中,我有一个TextBox类对象,其ID为 ctl00_PlaceHolderMain_g_77625 ....等。

    现在,在我的课程中,我尝试创建一个与ID同名的变量,但它没有初始化,值为null。我想也许ID正在改变,我检查了,但不,它保持原样。

    所以我尝试使用Control.FindControl,但它不会递归搜索,所以我发现了这篇文章:Recursive Page.FindControl。 (您可能希望阅读一些注释,因为有更好的泛型实现)。 重要提示:在使用FindControlRecursive方法之前阅读评论“Sam于2008年8月2日上午4:13”。

    所以,有了函数,我将ID作为参数传递 - 仍然没有运气,它只为我返回null。幸运的是,我可以将PlaceHolderMain作为ID传递,它会返回主占位符对象。

    因此,解决方法将是覆盖方法OnInit(EventArgs)生成HtmlHiddenField对象,将其值设置为您想要的任何值,并将这些隐藏字段添加到PlaceHolderMain。 (ContentPlaceHolder.Controls.Add()

    然后在ASPX页面上使用一些javascript我能够将隐藏字段中的值加载到我的优先字段中(我找到了一种方法来引用我想要的字段javascript。两篇有用的文章:shorter onelonger one

    编辑:减少痛苦的解决方案

    哦,很高兴我找到了这个。 使用jPoint(jQuery for SharePoint),然后使用某些脚本,您可以使用查询字符串参数来预填充列表字段。

    <script type="text/javascript" src="//sharejpoint.googlecode.com/files/jPointLoader-0.6-expanded.js" ></script>
    <script>  
      $(document).ready(function() {
        jP.Form.readForm();
        $.each(jP.Form.Items, function (idx, item) {
        if(querySt(item.Name) != null && querySt(item.Name) != "undefined")
          jP.Form[item.Name].val(unescape(querySt(item.Name)));
        });
       });
    
    //Gets value of querystring key
    function querySt(ji)
    {
          hu = window.location.search.substring(1);
          gy = hu.split("&");
          for (i=0;i<gy.length;i++)
          {
                  ft = gy[i].split("=");
                  if (ft[0].toUpperCase() == ji.toUpperCase()) //Fixed query so it is case insensitive
                  {
                          return ft[1];
                  }
          }
    }
    </script>
    

    此脚本可在this文章的评论中找到。