0

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

public class MyCustomNewForm : Microsoft.SharePoint.WebPartPages.WebPartPage

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

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

控制字段的代码是在 .aspx 页面中编写的(嗯,它是由 Sharepoint Designer 在使用命令Insert > SharePoint Controls > Custom List Form...时生成的),如下所示:

<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 时,它非常长

替代文字 http://img33.imageshack.us/img33/7495/ss20090713143352.png

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

4

2 回答 2

1

在后面的代码中使用WebDataForm控制;调用它的方法FindControl(@ID)

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

于 2011-08-05T03:18:16.277 回答
0

#不要介意这个痛苦的解决方案,但向下滚动查看编辑。呃,我找到了解决方法。但是警告!如果您不需要使用任何 Sharepoint 对象来动态访问任何值,那么这篇文章不适合您,相反,您想阅读一些参考文章。

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

简而言之:

  1. 制作您的自定义列表项表单。一步一步做。

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

  3. 在您的自定义表单 aspx <%@ 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 为“PlaceHolderMain”的 ContentPlaceHolder 对象(在 this.Controls[0] 上调用该函数,而不是在此对象上)。

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

  6. 将隐藏字段添加到您之前获得的 ContentPlaceHolder。

  7. 使用 Javascript(阅读此处此处)将所需字段从隐藏字段值填充到用户看到的那些字段。

PS我是sharepoint的初学者,所以最好谨慎使用这些步骤。我很高兴找到一个答案,您可以在其中引用代码中的字段,因此我不必使用任何 javascript 的东西。

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

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

所以我尝试使用Control.FindControl,但它不会递归搜索,所以我找到了这篇文章:Recursive Page.FindControl。(您可能想阅读一些评论,因为泛型有更好的实现)。重要提示:在使用 FindControlRecursive 方法之前,请阅读评论“Sam on August 2, 2008 4:13 AM”。

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

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

然后在 ASPX 页面上使用一些 javascript,我能够将隐藏字段中的值加载到我的首选字段(好吧,我找到了一种使用 javascript 引用我想要的字段的方法。两篇有用的文章:较短的一篇较长的一篇

#Edit:不那么痛苦的解决方案哦,很高兴我找到了这个。使用jPoint(用于 SharePoint 的 jQuery),然后使用一些脚本,您可以使用查询字符串参数来预填充列表字段。

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

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

于 2009-07-15T15:49:53.487 回答