1

我是 infopath 表单的新手。我创建了一个如下所示的信息路径表单

我在表格中的列如下

开始日期 :

发生时间: *文本框*下拉周(周一,周四,---太阳)

截止日期 :

现在,当用户选择开始日期为 2013 年 7 月 2 日时,在文本框中,如果他给出 3 并从下拉列表中选择星期四。

现在在截止日期它应该显示下周星期四日期,即(7/9/2013)。

几个月也是如此。你能帮我一个 infopath 形式的 fromule

我的表单网址( http://i.stack.imgur.com/PJAze.png

谢谢,桑迪


戴夫,我的 Web 方法看起来像这样我陷入了为它分配参数。不确定如何以信息路径形式分配参数(EnteredDate、Number、DayofWeek)。如果您能提供帮助,那就太好了。

 [WebMethod]

    public String GetNthWeekdayOfMonth(DateTime EnteredDate, int Number, DayOfWeek weekday)
    {
        String error = "";

        var days = Enumerable.Range(1, DateTime.DaysInMonth(EnteredDate.Year, EnteredDate.Month)).Select(day => new DateTime(EnteredDate.Year, EnteredDate.Month, day));

        var weekdays = from day in days
                       where day.DayOfWeek == weekday
                       orderby day.Day ascending
                       select day;

        int index = Number - 1;

        if (index >= 0 && index < weekdays.Count())
            return Convert.ToString(weekdays.ElementAt(index));

        else

            error = "The specified day does not exist in this ";

        return error;
    }
4

1 回答 1

0

我相信即使对于高级 InfoPath 用户而言,您想要实现的目标实际上也非常困难,即使使用代码也不是微不足道的。

你有几个选择:

  1. 有人花了很长时间为您编写极其复​​杂的 XPath。您并不真正了解它是如何工作的,如果您需要更改任何内容,您将陷入困境。

  2. 有人花更少的时间编写您仍然不理解的更具可读性的代码,但以后学习和更改会更容易。

  3. 您学习了一些代码或 XPath,稍后当您有更多的理解时再回到问题上来。

  4. 您重新评估对这个功能的需求,并决定它是否真的值得,或者是否有替代或更好的方法来完成它。

现在回答:

如果您熟悉代码,您就知道可以在后面添加代码来影响表单上的字段。如果我是你,我会在这个场景中学习尽可能多的内容,并在以后继续改进。

您可以执行以下操作:

  1. 在后面添加代码Tools > Form Options > Programming > Choose "C#" from drop down

  2. 将您的代码挂钩到所有三个输入(startDate、dayOfWeek 和 nth 值)的更改事件。Right Click > Programming > Changed Event

这些块中的每一个都可以调用相同的代码。例如

public void StartDate_Changed(object sender, XmlEventArgs e)
{
    ChangeDueDate();
}

ChangeDueDate 代码如下:

private void ChangeDueDate()
{
    DateTime StartDate = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:StartDate", NamespaceManager).ValueAsDateTime;
    int DayOfWeek = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:DayOfWeek", NamespaceManager).ValueAsInt;
    int n = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:n", NamespaceManager).ValueAsInt;

    // If StarDate.DayOfWeek is not the same as DayOfWeek 
    // then add the amount of days necessary.
    StartDate = StartDate.AddDays((7 - (int)StartDate.DayOfWeek + DayOfWeek) % 7);
    // Add weeks until you reach the nth value.
    while (((StartDate.Day - 1) / 7) != n - 1)
        StartDate = StartDate.AddDays(7);
    // Finally set the DueDate field to the calculated date.
    MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:DueDate", NamespaceManager).InnerXml = StartDate.ToString("dddd dd MMMM yyyy");
}

我已经对此进行了测试,它似乎运行良好。但是仍然会有一个问题,您目前无法知道每个月实际上每天有 4 天还是 5 天?

无论如何,如果您仍然需要帮助,请尝试上述方法并从那里开始询问更多问题。

于 2013-07-08T14:58:45.310 回答