1

ここでは、日付単位の選択、および複数の日付と期間の選択を可能にする DateEdit の子孫を作成する方法の例を使用しました。表示される日付のみの配列を提供する機能をもう 1 つ追加したかったのです。コードを変更し、日付範囲を受け入れるプロパティを含めました。提供された場合、それらの日付の表示と選択のみが許可されますが、タスクを達成するためにオーバーライドする必要がある関数を理解できません。動作は、エディターが提供されたときのようにする必要がありますMaxValueMinValue

これが私のコードです

4

1 に答える 1

1

VistaDateEditInfoArgs クラスの (標準) 実装を見てみましょう。.NET Reflector や ILSpy などの .NET アセンブリ逆コンパイラを使用できます。関連する日時を表示/許可しない場合は、オーバーライドして null を返す仮想メソッドがいくつかあります。これらのメソッドのソース コードは次のとおりです (「標準」の MinValue / MaxValue ベースのチェックに注意してください)。

[DevExpress.XtraEditors.ViewInfo.VistaDateEditInfoArgs]

protected virtual DayNumberCellInfo CreateMonthCellInfo(int row, int col)
{
    DayNumberCellInfo info;
    DateTime date = new DateTime(this.DateTime.Year, (1 + (row * 4)) + col, 1);
    if (date > this.Calendar.MaxValue)
    {
        return null;
    }
    if ((date < this.Calendar.MinValue) && (date.Month < this.Calendar.MinValue.Month))
    {
        return null;
    }

    return new DayNumberCellInfo(date) { Text = this.Calendar.DateFormat.GetAbbreviatedMonthName    (info.Date.Month) };
}

protected virtual DayNumberCellInfo CreateYearCellInfo(int row, int col)
{
    int num = ((this.DateTime.Year / 10) * 10) - 1;
    int year = (num + (row * 4)) + col;
    if ((year <= 0) || (year >= 0x2710))
    {
        return null;
    }
    DateTime date = new DateTime(year, 1, 1);
    if (date > this.Calendar.MaxValue)
    {
        return null;
    }
    if ((date < this.Calendar.MinValue) && (date.Year < this.Calendar.MinValue.Year))
    {
        return null;
    }
    DayNumberCellInfo info = new DayNumberCellInfo(date) {
        Text = year.ToString()
    };
    if ((year < ((this.DateTime.Year / 10) * 10)) || (year > (((this.DateTime.Year / 10) * 10) + 1)))
    {
        info.State = ObjectState.Disabled;
    }
    return info;
}

protected virtual DayNumberCellInfo CreateYearsGroupCellInfo(int row, int col)
{
    int num = ((this.DateTime.Year / 100) * 100) - 10;
    int year = num + (((row * 4) + col) * 10);
    if ((year < 0) || (year >= 0x2710))
    {
        return null;
    }
    int num3 = year + 9;
    if (year == 0)
    {
        year = 1;
    }
    DateTime date = new DateTime(year, 1, 1);
    if (date > this.Calendar.MaxValue)
    {
        return null;
    }
    if ((date < this.Calendar.MinValue) && (num3 < this.Calendar.MinValue.Year))
    {
        return null;
    }
    return new DayNumberCellInfo(date) { Text = year.ToString() + "-\n" + num3.ToString() };
}

子孫クラスでこれらのメソッドをオーバーライドし、カスタム チェックを追加することをお勧めします。たとえば、次のように CreateMonthCellInfo メソッドをオーバーライドできます。

protected override DayNumberCellInfo CreateMonthCellInfo(int row, int col)
{
    DateTime date = new DateTime(this.DateTime.Year, (1 + (row * 4)) + col, 1);

    if (!IsDateAvailable(date))
    {
        return null;
    }

    return base.CreateMonthCellInfo(row, col);
}

// Your date availibility check implementation here
private bool IsDateAvailable(DateTime date)
{
    // TODO provide implementation
    throw new NotImplementedException();
} 
于 2013-03-11T13:17:49.070 に答える