none
System.FormatException: 'Dize geçerli bir DateTime olarak tanınmadı.' RRS feed

  • Soru

  •  private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
            {
                DateTime bugün = DateTime.Parse(DateTime.Now.ToShortDateString());
                DateTime yeni = DateTime.Parse(dateTimePicker1.Text);
                if (yeni==bugün)
                {
                    foreach (Control item in groupBox1.Controls)
                    {
                        if (DateTime.Parse(DateTime.Now.ToShortTimeString())>DateTime.Parse(item.Text))
                        {
                            item.Enabled = false;
                        }
                    }
                }
      Sinema bilet satış otomasyonu yapıyorum

    kodun amacı groupbox1 deki radiobutton ları tarayıp bu günün tarihi seçili ise geridde kalan saatlerin seçilmemesini istiyorum 

    ama hata veriyor

    12 Mayıs 2019 Pazar 15:54

Yanıtlar

  • Kusura bakma ama kod DateTime kullanılan yerlerde çok garip ve hataya müsait yazılmış. Biraz satır satır gitmek daha iyi.

    DateTime bugün = DateTime.Parse(DateTime.Now.ToShortDateString());

    Buradaki değişken DateTime tipinde ve içeriği başka bir DateTime değerinden geliyor (getirilmek isteniyor demek daha doğru). Neden DateTime'dan DateTime değeri getirmek için önce değeri String'e çevirip sonra DateTime'a çevirmeye çalışıyorsunuz????? Tek amacı DateTime değerinden saat kısmını atmak olarak görünüyor. O zaman basitçe yapabileceğiniz:

    DateTime bugün = DateTime.Today;
    
    // ya da - burada Today seçeceği olduğu için gereksiz
    DateTime bugün = DateTime.Now.Date;
    

    DateTime yeni = DateTime.Parse(dateTimePicker1.Text);

    Yine yukarıdaki gibi gereksiz bir işlem. DT'dan DT elde etmek için arada yine string ve parse işlemi var. Oysa basitçe:

    DateTime yeni = dateTimePicker1.Value.Date;

    if (DateTime.Parse(DateTime.Now.ToShortTimeString())>DateTime.Parse(item.Text))

    Yazım yine hatalı, hatanın temel nedeni de, kod hata versin vermesin mantık hatasının olması. Günün herhangi bir anının saat kısmının varsayılan şekilde string'e çevrilmesi, onunla >, < gibi karşılaştırma yapılma şansını ortadan kaldırıyor (istenen karşılaştırma alfabetik değil ise). Saat karşılaştırma için string'e çevirmenin amacı ne olabilir ki? Tam aksine string olan değeri TimeSpan'a çevirmek daha doğru. Yinede mantıksal bir hata var, karşılaştırmanın bir tarafı TimeSpan olarak görünüyor, diğer tarafı ise DateTime.

    Burada 'item' ne onu bilmediğimizden, daha fazla yorum yapmak yanlış olur. Sadece hata mesajından yola çıkarak, şöyle bir hata olabilir:

    item.Text "13.05.2019 11:00" olabilir, DateTime.Parse("13.05.2019 11:00") hata verir, çünkü 13.ay yoktur (varsayılan tarih saat formatı aa/gg/yyyy ss:dd:ss).

    DateTime.Parse("13.05.2019 11:00", new CultureInfo("tr-TR"))
    doğrusu.



    12 Mayıs 2019 Pazar 19:29
    Yanıtlayıcı