2011-10-27 20 views
12

मैं wpf का उपयोग कर कैलेंडर बनाने की कोशिश कर रहा हूं। आइटम का उपयोग करके और अधिक, मेरे पास 7 कॉलम (रविवार-शनिवार) और 6 पंक्तियां (सप्ताह का सप्ताह #) वाला ग्रिड है। यदि मैं सप्ताहांत और सप्ताह संख्या (महीने का) प्राप्त करके प्रत्येक महीने के पहले की आरंभिक स्थिति पा सकता हूं, तो मुझे सप्ताह संख्या (प्रत्येक महीने का 0-5) कैसे मिल सकता है? क्या मैं किसी भी तरह से वहां से कैलेंडर भर नहीं सकता? मैं खो गया हूं और मुझे नहीं पता कि और क्या प्रयास करना है।मैं किसी निश्चित तारीख की सप्ताह संख्या कैसे निर्धारित कर सकता हूं?

public partial class SchedulePage : Page 
{   
    MainWindow _parentForm; 
    public int dayofweek; 

    public SchedulePage(MainWindow parentForm) 
    { 
     InitializeComponent(); 
     _parentForm = parentForm; 
     // DateTime date = new DateTime(year, month, day); 

     _parentForm.bindings = new BindingCamper();   
     _parentForm.bindings.schedule.Add(new Schedule { WeekNo = (int) getWeekNumber(), WeekDay = dayofweek }); 
     DataContext = _parentForm.bindings; 
     // lblTest.Content = dates(2011, 10, 27); 
    } 

    public double getWeekNumber() 
    { 
     dayofweek = getWeekDay(2011, 10, 31); 
     double h = dayofweek/7; 
     double g = Math.Floor(h); 
     return g; 
    } 

    public int getWeekDay(int year, int month, int day) 
    { 
     //year = 2011; 
     //month = 10; 
     //day = 27; 
     int[] t = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 }; 
     // year -= month < 3; 
     return (year + year/4 - year/100 + year/400 + t[month - 1] + day) % 7; 
    } 

उत्तर

17

आप अपने आप को लिखने के लिए वरीयता में Calendar.GetDayOfWeek और Calendar.GetWeekOfYear उपयोग करना चाहिए।

आप गारंटी दे सकते हैं कि यदि आप कोई दिनांक/समय हैंडलिंग कोड लिखते हैं तो इसमें त्रुटियां होंगी और विभिन्न स्थानों में काम नहीं करेगी।

public class Row 
{ 
    public string MonthWeek { get; set; } 
    public string Year { get; set; } 
    public string Month { get; set; } 
    public string Day { get; set; } 
    public string WeekOfYear { get; set; } 
} 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     var l = new List<Row>(); 
     DateTime startDate = DateTime.Now; 
     DateTime d = new DateTime(startDate.Year, startDate.Month, 1); 
     var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar; 
     var ms = cal.GetWeekOfYear(new DateTime(d.Year, d.Month, 1), System.Globalization.CalendarWeekRule.FirstDay, System.DayOfWeek.Sunday); 
     for (var i = 1; d.Month == startDate.Month; d = d.AddDays(1)) 
     { 
      var si = new Row(); 
      var month_week = (d.Day/7) + 1; 
      si.MonthWeek = month_week.ToString(); 
      si.Month = d.Year.ToString(); 
      si.Year = d.Month.ToString(); 
      si.Day = d.Day.ToString(); 
      si.WeekOfYear = cal.GetWeekOfYear(d, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString(); 
      l.Add(si); 
     } 
     dataGrid1.ItemsSource = l; 
    } 
} 
XAML में अनिवार्य डेटा ग्रिड के साथ

एक साथ:

<DataGrid AutoGenerateColumns="true" Name="dataGrid1" /> 
+0

तो यह उस सप्ताह में वापस आएगा, जिस तारीख को 1-53 में है, मैं उस जानकारी को कैसे ले सकता हूं और इसका उपयोग कर सकता हूं हालांकि बी/सी मेरे ग्रिड में 6 पंक्तियां ग्रिड हैं। 0-5। अज्ञानता के लिए खेद है यह मेरे लिए बिल्कुल नया है। दूसरे शब्दों में coloumns सप्ताह का दिन और पंक्ति सप्ताह # है। मुझे नहीं पता कि ग्रिड पर इसे कैसे लागू किया जाए और इसे – TMan

+0

@TMan में भरें, मैंने यह एक उदाहरण दिया है कि आप यह कैसे कर सकते हैं; –

+0

धन्यवाद, var ms क्या है और मैंने इसका उपयोग किया, वे कभी भी किसी भी चीज़ के लिए उपयोग नहीं किए जाते हैं? – TMan

11

आप इसे करने के लिए वैश्वीकरण से Calendar.GetWeekOfYear का उपयोग कर सकते हैं।

यहाँ इसके लिए MSDN डॉक्स है: http://msdn.microsoft.com/en-us/library/system.globalization.calendar.getweekofyear.aspx

आप GetWeekOfYear करने के लिए CultureInfo.CurrentCulture से उपयुक्त संस्कृति गुण पास करना चाहिए ताकि आप वर्तमान संस्कृति ठीक से मेल खाते हैं।

उदाहरण:

int GetWeekOfYear(DateTime date) 
{ 
    return Calendar.GetWeekOfYear(
     date, 
     CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule, 
     CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek 
    ); 
} 

आप आसानी से DateTime पर एक विस्तार विधि में इस संशोधित कर सकते हैं:

static int GetWeekOfYear(this DateTime date) 
{ 
    return Calendar.GetWeekOfYear(
     date, 
     CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule, 
     CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek 
    ); 
} 
+0

+1 - लेकिन मैं कहना चाहता हूँ "का उपयोग करना चाहिए" के बजाय "का उपयोग कर सकते" - मेरा उत्तर –

+0

रेफरी मैं के खिलाफ आप सावधानी होगा आप उस विधि पर कितना भरोसा करते हैं - यह आपको असंगत परिणाम देगा। उदाहरण के लिए, 30 दिसंबर 2012 एक रविवार है। यदि आप उस विधि को फर्स्टडे या फर्स्टफॉरडेवेक और रविवार के सप्ताह के पहले दिन के रूप में कॉल करते हैं, तो यह 53 वापस आ जाएगा। हालांकि, अगर आप 1 जनवरी, 2013 की तारीख के साथ उस विधि को कॉल करते हैं जो उसी सप्ताह का हिस्सा होगा 1. – AndrewS

+0

प्राप्त करें तो यह उस सप्ताह में वापस आएगा, जिस तारीख को 1-53 में है, मैं उस जानकारी को कैसे ले सकता हूं और इसका उपयोग कैसे करूं, हालांकि मेरे ग्रिड में 6 पंक्तियां grid.row 0-5 हैं। अज्ञानता के लिए खेद है यह मेरे लिए बिल्कुल नया है। – TMan

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

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