我在SharePoint中有一个自定义列表(特别是MOSS 2007)。一个字段是是/否复选框,标题为“任何缺陷?”另一个字段是“关闭”并命名已关闭票证的人。
如果没有缺陷,那么我希望自动关闭故障单。如果有,那么“关闭”字段应该在以后填写。
我想我可以像这样设置“已关闭”的计算默认值:
=IF([Any defects?],"",[Me])
但SharePoint抱怨我引用了一个字段。我认为这是有道理的;首次打开新列表项以进行输入时,将触发默认值,并且任何字段中都没有值。
我知道可以根据列值创建计算字段,但在这种情况下,以后不能编辑该字段。
有没有人有任何建议如何实现我想做的事情?
是否可以使用“OnSubmit”类型事件,允许我在保存列表项时执行某些代码?
谢谢。
答案 0 :(得分:7)
在页面中包含内容编辑器Web部件(newform.aspx / editform.aspx)并使用jQuery(或简单的javascript)来处理默认值的设置。
编辑:一些示例代码:
在newform.aspx列表中,包含对jquery的引用。如果查看html代码,您可以看到每个输入标记都根据字段的GUID获取一个id,并且一个标题设置为字段显示名称。
现在,使用jquery,我们可以使用jQuery选择器来获取这些字段:
按标题:
$("input[title='DISPLAYNAMEOFFIELD']");
通过id(如果你知道该字段的内部guid,则破折号将被下划线替换:
// example field id, notice the guid and the underscores in the guid ctl00_m_g_054db6a0_0028_412d_bdc1_f2522ac3922e_ctl00_ctl04_ctl15_ctl00_ctl00_ctl04_ctl00_ctl00_TextField
$("input[id*='GUID']"); //this will get all input elements of which the id contains the specified GUID, i.e. 1 element
我们将它包装在jQuery的ready()
函数中,因此只有在文档完全加载时才会进行所有调用:
$(document).ready(function(){
// enter code here, will be executed immediately after page has been loaded
});
通过组合这两个,我们现在可以将您的下拉列表的onchange
事件设置为以下
$(document).ready(function(){
$("input[title='DISPLAYNAMEOFFIELD']").change(function()
{
//do something to other field here
});
});
答案 1 :(得分:1)
EndUserSharePoint.com上的Use jQuery to Set A Text Field’s Value on a SharePoint Form文章向您展示了如何使用JavaScript / jQuery为字段设置默认值。
他们还有一系列关于'taming calculated columns'的文章,它们将向您展示使用jQuery为计算字段提供的更强大的选项。
将JavaScript插入SharePoint页面并修改DOM时需要注意的一件事是支持。未来的Service Pack很可能会破坏您添加的功能,下一版本的SharePoint很可能会破坏它。不过要记住这一点,我相信这是一个很好的解决方案。
答案 2 :(得分:0)
我已经了解了可能有用的示例代码
在您创建新活动时,它会将结束时间/日期字段设置为开始时间+ 1.5小时。
通过需要执行时间/日期工作的步骤稍微复杂一点,但是您将看到如何在表单上找到元素的示例,以及在不使用SPD的情况下将脚本放到newform.aspx上的一种方法
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">
</script>
<script type="text/javascript">
// Set the hours to add - can be over 24
var hoursToAdd = 1;
// Mins must be 0 or div by 5, e.g. 0, 5, 10, 15 ...
var minutesToAdd = 30;
// JavaScript assumes dates in US format (MM/DD/YYYY)
// Set to true to use dates in format DD/MM/YYYY
var bUseDDMMYYYYformat = false;
$(function() {
// Find the start and end time/minutes dropdowns by first finding the
// labels then using the for attribute to find the id's
// NOTE - You will have to change this if your form uses non-standard
// labels and/or non-english language packs
var cboStartHours = $("#" + $("label:contains('Start Time Hours')").attr("for"));
var cboEndHours = $("#" + $("label:contains('End Time Hours')").attr("for"));
var cboEndMinutes = $("#" + $("label:contains('End Time Minutes')").attr("for"));
// Set Hour
var endHour = cboStartHours.attr("selectedIndex") + hoursToAdd;
cboEndHours.attr("selectedIndex",endHour % 24);
// If we have gone over the end of a day then change date
if ((endHour / 24)>=1)
{
var txtEndDate = $("input[title='End Time']");
var dtEndDate = dtParseDate(txtEndDate.val());
if (!isNaN(dtEndDate))
{
dtEndDate.setDate( dtEndDate.getDate() + (endHour / 24));
txtEndDate.val(formatDate(dtEndDate));
}
}
// Setting minutes is easy!
cboEndMinutes.val(minutesToAdd);
});
// Some utility functions for parsing and formatting - could use a library
// such as www.datejs.com instead of this
function dtParseDate(sDate)
{
if (bUseDDMMYYYYformat)
{
var A = sDate.split(/[\\\/]/);
A = [A[1],A[0],A[2]];
return new Date(A.join('/'));
}
else
return new Date(sDate);
}
function formatDate(dtDate)
{
if (bUseDDMMYYYYformat)
return dtDate.getDate() + "/" + dtDate.getMonth()+1 + "/" + dtDate.getFullYear();
else
return dtDate.getMonth()+1 + "/" + dtDate.getDate() + "/" + dtDate.getFullYear();
}
</script>