Telerik Rad Calendar - возможно ли изменение источника данных? - PullRequest
0 голосов
/ 21 ноября 2011

Я пытаюсь изменить даты, отображаемые в RadCalendar. Например, я хочу, чтобы он начинался за 2 недели до текущей даты и заканчивался через две недели после текущей даты. Возможно ли это?

Мне удалось изменить текст, отображаемый в ячейках (для отображения «новой» даты), но методы «OnClick» по-прежнему отправляют «старую» дату.

OnDayRender Я добавил:

e.Cell.Text = "<a href=\"#\">" + _calStartDate.Day.ToString() + "</a>";
_calStartDate = _calStartDate.AddDays(1);

Но календарь все еще думает, что новые даты являются старыми, поэтому метод SelectedDate возвращает «старую» дату, а выбранная дата не является текущей датой.

Есть ли способ просто передать новый список дат, который будет проще?

ОБНОВЛЕНИЕ / Решение:

Я смог заставить его работать так:

    private int rowCounter = 0;

    private int rowHeaderCnt = 0;

    private DateTime _startDate;
    private DateTime _endDate;

    private DateTime _calStartDate;
    private DateTime _calEndDate;        

protected void radCalendar_DayRender(object sender, Telerik.Web.UI.Calendar.DayRenderEventArgs e)
    {
        TableRow tr = (TableRow)e.Cell.Parent;
        Table table = (Table)tr.Parent;

        if (e.Day.Date.CompareTo(_calStartDate) < 0)
        {
            ((TableRow)(e.Cell.Parent)).Style["display"] = "none";
        }
        else if (e.Day.Date.CompareTo(_calEndDate) > 0)
        {
            ((TableRow)(e.Cell.Parent)).Style["display"] = "none";
        }
        else if (e.Day.Date.DayOfWeek == DayOfWeek.Sunday)
        {
            // This part will change the week number cell (if you don't display it, hide this part)
            rowCounter++;
            TableCell cellRowHeader = ((TableRow)(e.Cell.Parent)).Cells[0];
            cellRowHeader.Text = rowCounter.ToString();
        }

    }

    protected void Page_Load(object sender, EventArgs e)
    {
        radCalendar.RangeMinDate = _startDate;
        radCalendar.RangeMaxDate = _endDate;
    }

   protected void radCalendar_HeaderCellRender(object sender, Telerik.Web.UI.Calendar.HeaderCellRenderEventArgs e)
    {
        if (e.HeaderType == Telerik.Web.UI.Calendar.HeaderType.Row)
        {
            rowHeaderCnt++;
            e.Cell.Text = "&nbsp;" + rowHeaderCnt;
        }

        if (e.HeaderType == Telerik.Web.UI.Calendar.HeaderType.Column)
        {
            TableRow row = ((TableRow)(e.Cell.Parent));
            row.Cells[0].Text = "&nbsp;" + StringUtil.getStringByLanguage("Week", "Sem.") + "&nbsp;";
        }

    } 


    protected void raCalendar_SelectionChanged(object sender, Telerik.Web.UI.Calendar.SelectedDatesEventArgs e)
    {
        DateTime startDate = new DateTime();            
        DateTime endDate = new DateTime();
        String url = String.Empty;

        if (e.SelectedDates.Count == 1)
        {
            startDate = e.SelectedDates[0].Date;
            endDate = e.SelectedDates[0].Date;
        }
        else
        {
            startDate = e.SelectedDates[0].Date;
            endDate = e.SelectedDates[e.SelectedDates.Count - 1].Date;
        }

       // ... add code here with startDate and endDate

    }

    public void initCalendar(DateTime startDate, DateTime endDate)
    {
        this._startDate = startDate;
        this._endDate = endDate;

        this._calStartDate = startDate;
        this._calEndDate = endDate;

        while (this._calStartDate.DayOfWeek != DayOfWeek.Sunday)
        {
            this._calStartDate = this._calStartDate.AddDays(-1);
        }

        while (this._calEndDate.DayOfWeek != DayOfWeek.Saturday)
        {
            this._calEndDate = this._calEndDate.AddDays(1);
        }

    }

1 Ответ

1 голос
/ 22 ноября 2011

На основании моих попыток вы можете очень близко подойти к этой настройке. Вы должны использовать некоторые хитрости, поскольку, насколько я могу судить, функциональность не встроена в календарь, чтобы отображать только те даты, которые вы просили.

На странице загрузки:

protected void Page_Load(object sender, EventArgs e)
{
    RadCalendar1.RangeMinDate = DateTime.Now.AddDays(-14);
    RadCalendar1.RangeMaxDate = DateTime.Now.AddDays(14);
    RadCalendar1.FirstDayOfWeek = (FirstDayOfWeek)DateTime.Now.AddDays(-14).DayOfWeek; 
}

В день рендера:

protected void RadCalendar1_DayRender1(object sender, Telerik.Web.UI.Calendar.DayRenderEventArgs e)
{
    if (e.Day.Date >= RadCalendar1.RangeMinDate.Date && e.Day.Date <= RadCalendar1.RangeMaxDate.Date)
    {
        e.Cell.Visible = true;
    }
    else
    {
        e.Cell.Visible = false;
    }
}

Это даст вам начальную загрузку календаря, которая показывает 2 недели назад и 2 недели вперед, и позволяет пользователю выбирать только внутри этой даты. Чего он не делает, и я предполагаю, что это отдельный вопрос, так это того, что он не выполняет скрытие дат вне диапазона при переходе на следующий месяц.

enter image description here

Вы должны знать, что формат календаря должен составлять 42 дня согласно дизайну самого инструмента. Вот почему вы видите пустую строку сверху, так как мы прячемся в те дни. Насколько мне известно, вы не можете удалить их, только скрыть или отобразить их, но не позволяют нажимать на них.

...