Как удалить последнюю неделю календаря - PullRequest
6 голосов
/ 25 марта 2010

Я не уверен, почему другие люди не спрашивали об этом раньше. Но вы заметили, что asp: Calendar показывает дополнительную неделю в конце?

Например, если VisibleMonth установлен на 2010-03-01 и FirstDayOfWeek на воскресенье: Это покажет 6 недель.

  1. 28 февраля - 6 марта
  2. с 7 марта по 13 марта
  3. с 14 марта по 20 марта
  4. с 21 марта по 27 марта
  5. с 28 марта по 3 апреля
  6. с 4 апреля по 10 апреля

Мне было интересно, почему Microsoft показывает последнюю строку, которая целиком на апрель. Я пытался найти в сети свойство, но оно, похоже, не существует.

Единственное решение, о котором я могу подумать, это переопределить Pre_Render и проверить все отдельные даты, если они все еще находятся в пределах недели VisibleDate. Но, конечно, это крайняя проверка, поскольку каждая визуализация элемента управления показывает это.

Вот моя работа.

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
    int dayOfWeek = Convert.ToInt16(e.Day.Date.DayOfWeek);
    int compensate = dayOfWeek - Convert.ToInt16(DayOfWeek.Sunday);
    DateTime WeekStart = e.Day.Date.AddDays(-1 * compensate);
    DateTime WeekEnd = WeekStart.AddDays(6);

    // If the start and end of the week does not have relevance to the current month
    if (WeekStart.Month != Calendar1.VisibleDate.Month &&
        WeekEnd .Month != Calendar1.VisibleDate.Month)
    {
        e.Cell.Text = "";
        e.Cell.Height = 0;
        e.Cell.Visible = false;
    }
}

Ответы [ 5 ]

7 голосов
/ 27 мая 2011

очень приятно. Работает с большинством браузеров, но плохо работает с Chrome 11.0.696.71 и Safari для Windows (не тестировался на Mac)

В течение нескольких месяцев элемент управления календаря отображает дополнительную неделю в начале месяца. (когда 1-е число месяца является первым днем ​​недели.)

Когда вы устанавливаете e.cell.Visible = false, элементы не отображаются. Таким образом, в Chrome вы получите строку <tr></tr>. Chrome отображает это как пустую строку. И так как я не думаю, что есть способ установить высоту / стиль элемента TR с помощью элемента управления календаря, вы получите уродливый календарь, в котором отсутствуют первые строки в определенные месяцы.

Также установка высоты в 0 ничего не делает, когда вы устанавливаете Visible = false. Если вы не установите Visible = false и просто установите height = 0, он все равно не будет правильно отображаться в Chrome. Таким образом, решение состоит в том, чтобы установить высоту 1

Вот мое модифицированное решение.

Следователь

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e){
    hideExtraWeek(sender, e, (DayOfWeek)Calendar1.FirstDayOfWeek);
}

функция

    protected void hideExtraWeek(object sender, DayRenderEventArgs e, DayOfWeek dw){
        if (dw == (DayOfWeek)7) dw = (DayOfWeek)0; // FirstDayOfweek returns 7 when set to default, But it's zero based so valid values are 0 to 6
        Boolean blnBrowserDoesntSupportsEmptyRow= Request.Browser.Browser=="Chrome" ||
                                            Request.Browser.Browser=="Safari";

        int dayOfWeek = Convert.ToInt16(e.Day.Date.DayOfWeek);
        int compensate = dayOfWeek - Convert.ToInt16(dw);
        DateTime WeekStart = e.Day.Date.AddDays(-1 * compensate);
        DateTime WeekEnd = WeekStart.AddDays(6);

        // If the start and end of the week does not have relevance to the current month
        if (WeekStart.Month==WeekEnd.Month && e.Day.IsOtherMonth){
            e.Cell.Text = "";
            e.Cell.Height = 1; // fix for chrome. Visible=false leaves a blank row even when there are no <td>s in the <tr>
            e.Cell.Visible = blnBrowserDoesntSupportsEmptyRow;
        }
    }
2 голосов
/ 29 октября 2013

Если у вас есть SelectWeekText и SelectionMode = "DayWeek" или "DayWeekMonth", у вас будут проблемы с разметкой выбора недели, которая все еще отображается для скрытой недели. Вот как я это сделал с небольшим количеством JQuery.

 Sub cal_DayRender(ByVal sender As Object, ByVal e As DayRenderEventArgs)
      If HideExtraWeek(e, If(Cal.FirstDayOfWeek = WebControls.FirstDayOfWeek.Default, Threading.Thread.CurrentThread.CurrentUICulture.DateTimeFormat.FirstDayOfWeek, Cal.FirstDayOfWeek)) Then
          e.Cell.Style("display") = "none"
          e.Cell.CssClass = "hiddenWeek"
          Exit Sub
      End If
      'do other render stuff here
 End Sub

Private Function HideExtraWeek(ByVal e As DayRenderEventArgs, ByVal startOfWeekDay As Integer) As Boolean
    If e.Day.IsOtherMonth Then
        'hide empty weeks, logic credited to Robert
        Dim currDay As Integer = e.Day.Date.DayOfWeek
        Dim weekStart As DateTime = e.Day.Date.AddDays(startOfWeekDay - currDay) 'first day of the week
        Dim weekEnd As DateTime = weekStart.AddDays(6)

        Return (weekStart.Month = weekEnd.Month) 'the entire week is part of the other month
    End If
    Return False
End Function

<script type="text/javascript">
        $(document).ready(function() {
             $("td.hiddenWeek").parent().hide();
        }
</script>
1 голос
/ 18 октября 2012

Вот код VB, который я использую. При необходимости будут удалены пустые строки как сверху, так и снизу. Он использует приватную переменную. Этот метод, похоже, не имеет проблем в Chrome или Safari.

Private _hideEmptyWeek As Boolean

Protected Sub Calendar1_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender

    If e.Day.IsOtherMonth Then

        '' Hide first week if empty
        If e.Day.Date = e.Day.Date.AddDays(-e.Day.Date.Day + 1).AddMonths(1).AddDays(-7) Then ' If this date is a full week before next month
            _hideEmptyWeek = True
        End If


        '' Hide last week if empty
        If e.Day.Date.DayOfWeek = DayOfWeek.Sunday And e.Day.Date.Day < 7 Then ' If this is the first Sunday of next month
            _hideEmptyWeek = True
        End If


        '' Hide cell if we are in an empty week
        If _hideEmptyWeek = True Then
            e.Cell.Visible = False
        End If
    Else
        _hideEmptyWeek = False
    End If
End Sub
1 голос
/ 25 июля 2011
<asp:Calendar ID="Calendar1" runat="server" CellPadding="1" CellSpacing="0"
 Width="600px" FirstDayOfWeek="Monday" BorderColor="#a1a1a1"
BorderWidth="1" BorderStyle="None" ShowGridLines="True" ShowDescriptionAsToolTip="True"
NextPrevStyle-CssClass=""
Height="500px" OnDayRender="Calendar1_DayRender" 
SelectionMode="None"  NextMonthText="&amp;gt;&amp;gt;" PrevMonthText="&amp;lt;&amp;lt;">
<OtherMonthDayStyle BorderStyle="None" />
</asp:Calendar>

bool weekstart = false;
int[] longmonths = new int[] { 1, 3, 5, 7, 8, 10, 12 };// 31 days in a Month
int[] shortmonths = new int[] { 4, 6, 9, 11 };// 30 days in a Month

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{

   if (e.Day.IsOtherMonth)
   {
        e.Cell.Text = String.Empty;
        e.Cell.Height = 0;
        if (e.Day.Date.DayOfWeek == DayOfWeek.Monday )//Monday is FirstDayOfWeek
        {
          if (shortmonths.Contains(e.Day.Date.Month) && e.Day.Date.Day == 24)
          {
             weekstart = true;
          }
          else if (longmonths.Contains(e.Day.Date.Month) && e.Day.Date.Day == 25)
          {
             weekstart = true;
          }
        }
        if (weekstart)
        {
           e.Cell.Visible = false;
        }
   }
   else if (!e.Day.IsOtherMonth)
   {
      weekstart = false;
   }

}
1 голос
/ 29 мая 2011

Хорошо, у меня есть другое решение. После некоторых настроек. Надеюсь, это поможет. У него немного больше функций, но если ваш календарь получает много хитов, он может просто сэкономить 1% процессора :). Обязательно прикрепите событие Calendar1_VisibleMonthChanged к OnVisibleMonthChanged

private DateTime fromDate;
private DateTime toDate;
private Boolean blnBrowserDoesntSupportsEmptyRow = Request.Browser.Browser=="Chrome" ||
                                                       Request.Browser.Browser=="Safari";

    protected void Page_Load(object sender, EventArgs e){
        if (!Page.IsPostBack){
            setFromToDates(new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1));
        }
    }

    protected void Calendar1_VisibleMonthChanged(object sender, MonthChangedEventArgs e){
        setFromToDates(e.NewDate);
    }

    protected void setFromToDates(DateTime monthStart){

        DayOfWeek dw = (DayOfWeek)Calendar1.FirstDayOfWeek;
        if (dw == (DayOfWeek)7) dw = (DayOfWeek)0;


        if (monthStart.DayOfWeek == dw){
            this.fromDate = monthStart;// if 1st day of calendar is also 1st of the month. just set as is
        }else{
            int dayOfWeek = Convert.ToInt16(monthStart.DayOfWeek);
            dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek;
            int compensate = dayOfWeek - Convert.ToInt16(dw);
            this.fromDate = monthStart.AddDays(-1 * compensate);// set FromDate to the beggning day of the calendar. I.e may start from e.g. 25th of the previous month
        }

        this.toDate = monthStart.AddMonths(1);
        if (this.toDate.DayOfWeek != dw)
        {
            int dayOfWeek = Convert.ToInt16(this.toDate.DayOfWeek);
            dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek;
            int compensate = dayOfWeek - Convert.ToInt16(dw);
            this.toDate=this.toDate.AddDays(7-compensate);
        }
    }








    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e){
        // hide extra week
        hideExtraWeek(sender, e);
    }

    // returns weather or not the given day is hidden
    protected Boolean hideExtraWeek(object sender, DayRenderEventArgs e){
            Boolean isVisibleDay = e.Day.Date >= this.fromDate && e.Day.Date < this.toDate;

            // If the start and end of the week does not have relevance to the current month
            if (!isVisibleDay){
                e.Cell.Text = "";
                e.Cell.Height = 1; // fix for chrome. Visible=false leaves a blank row even when there are no <td>s in the <tr>
                e.Cell.Visible = blnBrowserDoesntSupportsEmptyRow;
             }
        return !isVisibleDay;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...