如何根据另一个字段中的值在SharePoint列表字段中设置默认值?

时间:2009-07-07 03:42:42

标签: sharepoint

我在SharePoint中有一个自定义列表(特别是MOSS 2007)。一个字段是是/否复选框,标题为“任何缺陷?”另一个字段是“关闭”并命名已关闭票证的人。

如果没有缺陷,那么我希望自动关闭故障单。如果有,那么“关闭”字段应该在以后填写。

我想我可以像这样设置“已关闭”的计算默认值:

=IF([Any defects?],"",[Me])

但SharePoint抱怨我引用了一个字段。我认为这是有道理的;首次打开新列表项以进行输入时,将触发默认值,并且任何字段中都没有值。

我知道可以根据列值创建计算字段,但在这种情况下,以后不能编辑该字段。

有没有人有任何建议如何实现我想做的事情?

是否可以使用“OnSubmit”类型事件,允许我在保存列表项时执行某些代码?

谢谢。

3 个答案:

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