1

私は infopath フォームが初めてです。以下のようなinfopathフォームを作成しました

フォームの私の列は以下のとおりです

開始日 :

発生する間隔: *テキストボックス*ドロップダウン週 (月、木、---日)

期日 :

ユーザーが開始日を 2013 年 7 月 2 日として選択すると、テキスト ボックスで 3 を指定し、ドロップダウンから火曜日を選択します。

現在、[期限] には、来週の木曜日の日付 (2013 年 7 月 9 日) が表示されます。

月についても同様です。InfoPath フォームのフォームで私を助けてくれませんか

私のフォームのURL( 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. 3 つの入力すべて (startDate、dayOfWeek、および n 番目の値) の変更されたイベントにコード ビハインドをフックします。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 日かどうかを知る方法がないという問題が 1 つあります。

とにかく上記を試してみて、まだ助けが必要な場合はそこから行って、さらに質問してください。

于 2013-07-08T14:58:45.310 に答える