2010-03-25 24 views
6

मुझे यकीन नहीं है कि अन्य लोगों ने इससे पहले क्यों नहीं पूछा है। लेकिन क्या आपने देखा है कि एएसपी: कैलेंडर अंत में एक अतिरिक्त सप्ताह दिखाता है?कैलेंडर के पिछले सप्ताह को कैसे हटाएं

उदाहरण के लिए यदि VisibleMonth 2010-03-01 और FirstDayOfWeek को रविवार को सेट किया गया है: यह 6 सप्ताह दिखाएगा।

  1. 28 फ़र, 6 मार्च तक
  2. मार्च 7 से 13 मार्च
  3. मार्च 14 4 अप्रैल तक 20 मार्च तक
  4. 21 मार्च 27 मार्च 28 मार्च को
  5. 3 अप्रैल को
  6. अप्रैल तक 10

मैं सोच रहा था कि क्यों माइक्रोसॉफ्ट आखिरी पंक्ति दिखाता है जो पूरी तरह से अप्रैल में है। मैंने संपत्ति के लिए नेट खोजने की कोशिश की लेकिन यह मौजूदा प्रतीत नहीं होता है।

एकमात्र समाधान जिसे मैं सोच सकता हूं वह प्री_रेंडर को ओवरराइड करना है और यदि वे अभी भी 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; 
    } 
} 

उत्तर

7

बहुत अच्छा। अधिकांश ब्राउज़रों के साथ काम करता है लेकिन क्रोम 11.0.696.71 के साथ फगली है और विंडोज़ के लिए सफारी (मैक पर परीक्षण नहीं किया गया है)

कुछ महीनों के लिए कैलेंडर नियंत्रण महीने की शुरुआत में अतिरिक्त सप्ताह प्रदर्शित करता है। (जब महीने का पहला सप्ताह सप्ताह का पहला दिन होता है।)

जब आप e.cell.Visible = false सेट करते हैं तो यह तत्व प्रस्तुत नहीं करता है। तो क्रोम में आप <tr></tr> पंक्ति के साथ समाप्त होते हैं। क्रोम इसे एक खाली पंक्ति के रूप में प्रस्तुत करता है। और चूंकि मुझे नहीं लगता कि कैलेंडर नियंत्रण के माध्यम से टीआर तत्व ऊंचाई/शैली को सेट करने का कोई तरीका है, तो आप एक बदसूरत दिखने वाले कैलेंडर के साथ समाप्त हो जाते हैं, जिसमें कुछ महीनों के लिए यह पहली पंक्ति है।

जब भी आप दृश्यमान = झूठी सेट करते हैं तो 0 तक ऊंचाई सेट करना कुछ भी नहीं करता है। यदि आप Visible = false सेट नहीं करते हैं और केवल ऊंचाई = 0 डालते हैं तो यह अभी भी क्रोम में सही ढंग से प्रस्तुत नहीं करता है। तो समाधान ऊंचाई को

यहां मेरा संशोधित समाधान है।

onrowrender

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; 
     } 
    } 
1

ठीक है मैं एक और समाधान है। कुछ tweaking के बाद। उम्मीद है कि यह मदद करता है। इसमें थोड़ा और फ़ंक्शन हैं लेकिन यदि आपका कैलेंडर अलग-अलग हिट प्राप्त करता है, तो यह केवल 1% cpu को सहेज सकता है :)। 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; 
    } 
1
<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

को Calendar1_VisibleMonthChanged घटना संलग्न करने के लिए सुनिश्चित करें कि यहाँ VB कोड मैं का उपयोग करें। जब आवश्यक हो तो यह शीर्ष और नीचे दोनों में खाली पंक्तियों को हटा देगा।यह एक निजी चर का उपयोग करता है। इस विधि में क्रोम या सफारी में कोई समस्या नहीं प्रतीत होती है।

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 
2

यदि आप 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> 
+0

धन्यवाद! यह वही है जो मैं सप्ताह चयन मार्कअप के कारण खोज रहा था। सोमवार के पहले दिन होने के लिए सोमवार को प्रबंधित करने के लिए HideExtraWeek फ़ंक्शन को जोड़ने के लिए (अगर currDay = 0 फिर currDay = 7) जोड़ना था। शायद सबसे साफ समाधान नहीं बल्कि मेरे लिए काम किया। – Michelh91

संबंधित मुद्दे