Çözüldü C# butona günde sadece bir kez tıklama nasıl yapılır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

THE_YORULMAZZZ

Hectopat
Katılım
26 Şubat 2021
Mesajlar
464
Makaleler
1
Çözümler
7
C# da bir projem var ve bu projede veritabanına veri eklemek için bir butonum var ancak günde yalnızca bir kez veri eklemesi gerek bu yüzden butona günde sadece bir kez tıklanma izni vermem gerek. 2. Kez tıklanmaması gerekiyor, yardımcı olur musunuz?
 
Çözüm
Hocam amacınızı anladım da Date'in kullanıldığı yer yok attığınız kodlarda if içerisine eklenmesi gerekmezmi.
Gerek yok hocam, şöyle daha detaylı bir kod daha yazdım buna da bakabilirsiniz.


C#:
using System;
using System.Windows.Forms;

public partial class Form1 : Form
{
    // Bugünün tarihi
    private DateTime today = DateTime.Today;
    // Bugünkü tıklama sayısı
    private int clickCount = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Tarih kontrol et.
        if (today != DateTime.Today)
        {
            // Tarih farklıysa, tıklama sayısı sıfırla
            clickCount = 0;
            today = DateTime.Today;
        }

        // Tıklama sayısı kontrol et.
        if (clickCount < 1)
        {
            // Tıklama sayısı 1 den azsa, veri ekle
            // veritabanına veri ekleme kodu
            clickCount++;
        }
        else
        {
            // Tıklama sayısı 1 den fazla ise, uyarı ver
            MessageBox.Show("Bugün için veri ekleme izniniz doldu.");
        }
    }
}
Hocam o zaman veri tabanı içinde bir sorun var, çünkü bağlantı hatası bu. Kodlarda da ben herhangi bir sorun göremiyorum.
Hocam şimdi kontrol sağladım eski halinde geri getirince herhangi bir hata vermiyor veri ekliyor ancak eksik ekliyor hala sizin paylaştığınız kodlarda hiç bir işlem yapmadan hata veriyor

C#:
private void btngunsonu_Click(object sender, EventArgs e)
 {
 // Tarih kontrol et.
 if (today != DateTime.Today)
 {
 // Tarih farklıysa, tıklama sayısı sıfırla.
 clickCount = 0;
 today = DateTime.Today;
 }

 // Tıklama sayısı kontrol et.
 if (clickCount < 1)
 {
 try.
 {
 using (SqlConnection conn = new SqlConnection(connectionString))
 {
 conn.Open();

 // Bugün için Gelir ve Gider bilgilerini al.
 SqlCommand gelirCommand = new SqlCommand(Gelirquery, conn);
 gelirtoplam = (int)gelirCommand.ExecuteScalar();

 SqlCommand giderCommand = new SqlCommand(Giderquery, conn);
 gidertoplam = (int)giderCommand.ExecuteScalar();

 // Bakiye bilgisini hesapla.
 bakiyetoplam = gelirtoplam - gidertoplam;

 // Bakiye bilgisini veritabanına ekle.
 SqlCommand cmd1 = new SqlCommand();
 cmd1.Connection = conn;
 cmd1.CommandText = "INSERT INTO Kasa(Tarih,Gelir,Gider,Bakiye) VALUES (@Tarih, @Gelir, @Gider, @Bakiye)";
 cmd1.Parameters.AddWithValue("@Tarih", DateTime.Now);
 cmd1.Parameters.AddWithValue("@Gelir", gelirtoplam);
 cmd1.Parameters.AddWithValue("@Gider", gidertoplam);
 cmd1.Parameters.AddWithValue("@Bakiye", bakiyetoplam);
 cmd1.ExecuteNonQuery();
 conn.Close();
 // Verileri listele.
 listele();
 }
 }
 catch (Exception ex)
 {
 MessageBox.Show("Hata oluştu: " + ex.Message, "SİSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
 clickCount++;
 }
 else.
 {
 // Tıklama sayısı 1 den fazla ise, uyarı ver.
 MessageBox.Show("Bugün için veri ekleme izniniz doldu.");
 }
 }

Bir de böyle deneyin hocam, yukarıda sizin kodu biraz daha optimize ettim, aşağıdaki kodda da veri sorununuzu da çözüyor. Ayrıca listele() komutunu ellemedim fakat bunun yerine gridview, listview kullanmak daha doğru olacaktır.

Eğer yapmak isterseniz;

C#:
 // Verileri gerçek zamanlı olarak güncelle, SqlDataAdapter veritabanındaki verileri okur ve DataTable'a doldurur. Sonra, dataGridView1 adlı gridview'in DataSource'u olarak DataTable atanır. Bu şekilde, veritabanındaki veriler gerçek zamanlı olarak güncellenir ve kullanıcının verileri tekrar listelemek için "listele()" methodunu çağırmasına gerek olmaz.
 string selectQuery = "SELECT * FROM Kasa";
 SqlDataAdapter adapter = new SqlDataAdapter(selectQuery, conn);
 DataTable table = new DataTable();
 adapter.Fill(table);
 dataGridView1.DataSource = table;

C#:
private void btngunsonu_Click(object sender, EventArgs e)
{
 try.
 {
 using (SqlConnection conn = new SqlConnection(connectionString))
 {
 conn.Open();

 // Bugün için Gelir ve Gider bilgilerini al.
 string Gelirquery = "SELECT SUM(Gelir_Tutari) FROM Gelir WHERE CAST(Tarih AS DATE) = CAST(GETDATE() AS DATE)";
 SqlCommand gelirCommand = new SqlCommand(Gelirquery, conn);
 gelirtoplam = (int)gelirCommand.ExecuteScalar();

 string Giderquery = "SELECT SUM(Gider_Tutari) FROM Gider WHERE CAST(Tarih AS DATE) = CAST(GETDATE() AS DATE)";
 SqlCommand giderCommand = new SqlCommand(Giderquery, conn);
 gidertoplam = (int)giderCommand.ExecuteScalar();

 // Bakiye bilgisini hesapla.
 bakiyetoplam = gelirtoplam - gidertoplam;

 // Bakiye bilgisini veritabanına ekle.
 SqlCommand cmd1 = new SqlCommand();
 cmd1.Connection = conn;
 cmd1.CommandText = "INSERT INTO Kasa(Tarih,Gelir,Gider,Bakiye) VALUES (@Tarih, @Gelir, @Gider, @Bakiye)";
 cmd1.Parameters.AddWithValue("@Tarih", DateTime.Now);
 cmd1.Parameters.AddWithValue("@Gelir", gelirtoplam);
 cmd1.Parameters.AddWithValue("@Gider", gidertoplam);
 cmd1.Parameters.AddWithValue("@Bakiye", bakiyetoplam);
 cmd1.ExecuteNonQuery();
 conn.Close();
 }
 }
 catch (Exception ex)
 {
 MessageBox.Show("Hata oluştu: " + ex.Message, "SİSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
}

Veritabanına bugün için yapılan tüm işlemleri döndüren sorgular kullandım.

Hocam tekrar merhaba dedikleriniz gibi yaptım ancak projede sekmeler arası geçince butona 2.kez basabiliyorum aynı sekmede kalınca bir kez bastırıyor ancak proje içinde farklı bir sekmeye geçip tekrar bu sekmeye geldiğimde 2. kez basabiliyorum ve her defasında basmaya devam ediyorum bunu nasıl çözebiliriz?
 
Son düzenleme:
C#:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    clickCount = 0;
    today = DateTime.MinValue;
//FormClosing
}

C#:
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    clickCount = 0;
    today = DateTime.MinValue;
}

//TabControl.SelectedIndexChanged

Bunları kullanmayı deneyin hocam.
 
C#:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    clickCount = 0;
    today = DateTime.MinValue;
//FormClosing
}

C#:
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    clickCount = 0;
    today = DateTime.MinValue;
}

//TabControl.SelectedIndexChanged

Bunları kullanmayı deneyin hocam.
bunları sekme değiştirmek için tıkladığım butonlara ekliyorum değil mi hocam
 
Bunları sekme değiştirmek için tıkladığım butonlara ekliyorum değil mi hocam?
C#:
using System;
using System.Windows.Forms;

public partial class Form1 : Form
{
    // Bugünün tarihi
    private DateTime today = DateTime.Today;
    // Bugünkü tıklama sayısı
    private int clickCount = 0;

    public Form1()
    {
        InitializeComponent();
        // FormClosing event'i ekle
        this.FormClosing += Form1_FormClosing;
        // TabControl.SelectedIndexChanged event'i ekle
        tabControl1.SelectedIndexChanged += tabControl1_SelectedIndexChanged;
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        // Form kapatılırken yapılacak işlemler
    }

    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Seçilen sekme değiştiğinde yapılacak işlemler
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Tarih kontrol et.
        if (today != DateTime.Today)
        {
            // Tarih farklıysa, tıklama sayısı sıfırla
            clickCount = 0;
            today = DateTime.Today;
        }

        // Tıklama sayısı kontrol et.
        if (clickCount < 1)
        {
            // Tıklama sayısı 1 den azsa, veri ekle
            // veritabanına veri ekleme kodu
            clickCount++;
        }
        else
        {
            // Tıklama sayısı 1 den fazla ise, uyarı ver
            MessageBox.Show("Bugün için veri ekleme izniniz doldu.");
        }
    }
}

Şu şekilde deneyin hocam eğer kod hala bunla aynı ise. Farklıysa buradan bakarak anlarsınız zaten.
 
C#:
using System;
using System.Windows.Forms;

public partial class Form1 : Form
{
    // Bugünün tarihi
    private DateTime today = DateTime.Today;
    // Bugünkü tıklama sayısı
    private int clickCount = 0;

    public Form1()
    {
        InitializeComponent();
        // FormClosing event'i ekle
        this.FormClosing += Form1_FormClosing;
        // TabControl.SelectedIndexChanged event'i ekle
        tabControl1.SelectedIndexChanged += tabControl1_SelectedIndexChanged;
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        // Form kapatılırken yapılacak işlemler
    }

    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Seçilen sekme değiştiğinde yapılacak işlemler
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Tarih kontrol et.
        if (today != DateTime.Today)
        {
            // Tarih farklıysa, tıklama sayısı sıfırla
            clickCount = 0;
            today = DateTime.Today;
        }

        // Tıklama sayısı kontrol et.
        if (clickCount < 1)
        {
            // Tıklama sayısı 1 den azsa, veri ekle
            // veritabanına veri ekleme kodu
            clickCount++;
        }
        else
        {
            // Tıklama sayısı 1 den fazla ise, uyarı ver
            MessageBox.Show("Bugün için veri ekleme izniniz doldu.");
        }
    }
}

Şu şekilde deneyin hocam eğer kod hala bunla aynı ise. Farklıysa buradan bakarak anlarsınız zaten.
Hocam şöyle ki benim projemde sekme değiştirme kodları farklı form içerisinde uygulamada birden fazla sekme var isterseniz mail ile paylaşayım sizinle
 
Hocam tam kodları ve aldığınız hata koduna bir bakabilir miyim?
C++:
using System;
using System.Data.SqlClient;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;


namespace Kasa_Hareket_Takip
{
    public partial class Kasa : Form
    {
        // Bugünün tarihi
        private DateTime today = DateTime.Today;
        // Bugünkü tıklama sayısı
        private int clickCount = 0;

        SqlConnection conn = new SqlConnection("Data Source=THEYORULMAZZ;Initial Catalog=Kasa_Hareket_Takip;Integrated Security=True");
        System.Data.DataTable dt = new System.Data.DataTable();
        int gelirtoplam;
        int gidertoplam;
        int bakiyetoplam;
        public Kasa()
        {
            InitializeComponent();
            // FormClosing event'i ekle
            this.FormClosing += Form1_FormClosing;
            // TabControl.SelectedIndexChanged event'i ekle
            tabControl1.SelectedIndexChanged += tabControl1_SelectedIndexChanged;
        }

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            throw new NotImplementedException();
        }

        // VeriTabanı Kayıtları Listeleme
        private void listele()
        {
            conn.Open();
            SqlDataAdapter adtr = new SqlDataAdapter("Select * from Kasa", conn);
            adtr.Fill(dt);
            dataGridView1.DataSource = dt;
            adtr.Dispose();
            conn.Close();
        }
      
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void dataGridView1_Click(object sender, EventArgs e)
        {

        }

        // TextBox Aracında Yazılan Şartlı Bilgi İle Kayıtlar Arasında Arama Yapar
        private void txtsearch_TextChanged(object sender, EventArgs e)
        {
            dt.Clear();
            conn.Open();
            SqlDataAdapter adtr2 = new SqlDataAdapter("Select *  From Kasa where Tarih Like'%" + txtsearch.Text + "%'", conn);
            adtr2.Fill(dt);
            dataGridView1.DataSource = dt;
            adtr2.Dispose();
            conn.Close();
        }

        // TextBox Aracında Yazılan Şartlı Bilgi İle Kayıtlar Arasında Arama Yapar Ve Butona Arama Kodu Atanır
        private void btnsearch_Click(object sender, EventArgs e)
        {
            dt.Clear();
            conn.Open();
            SqlDataAdapter adtr2 = new SqlDataAdapter("Select *  From Kasa where Tarih Like'%" + txtsearch.Text + "%'", conn);
            adtr2.Fill(dt);
            dataGridView1.DataSource = dt;
            adtr2.Dispose();
            conn.Close();
        }

        // Diğer Tablolarda İşlem Yaparak Sonucu Buraya Ekler

        string Gelirquery = "SELECT SUM(Gelir_Tutari) FROM Gelir WHERE CAST(Tarih AS DATE) = CAST(GETDATE() AS DATE)";
        string Giderquery = "SELECT SUM(Gider_Tutari) FROM Gider WHERE CAST(Tarih AS DATE) = CAST(GETDATE() AS DATE)";
        //string Bakiyequery = "UPDATE Kasa SET Bakiye = (SELECT SUM(Gelir.Gelir_Tutari) FROM Gelir WHERE CAST((Gelir.Tarih) AS DATE) = CAST(GETDATE() AS DATE)) - (SELECT SUM(Gider.Gider_Tutari) FROM Gider WHERE CAST((Gider.Tarih) AS DATE) = CAST(GETDATE() AS DATE))";
        string date = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");

        private void btngunsonu_Click_1(object sender, EventArgs e)
        {
            // Tarih kontrol et.
            if (today != DateTime.Today)
            {
                // Tarih farklıysa, tıklama sayısı sıfırla
                clickCount = 0;
                today = DateTime.Today;
            }

            // Tıklama sayısı kontrol et.
            if (clickCount < 1)
            {
                // Tıklama sayısı 1 den azsa, veri ekle
                // veritabanına veri ekleme kodu
                try
                {
                    conn.Open();

                    SqlCommand cmd = new SqlCommand(Gelirquery, conn);
                    SqlDataReader sdr = cmd.ExecuteReader();
                    if (sdr.Read())
                    {
                        gelirtoplam = (int)Convert.ToDouble(sdr[0]);
                        conn.Close();
                    }
                    sdr.Close();

                    conn.Open();

                    SqlCommand cmdd = new SqlCommand(Giderquery, conn);
                    SqlDataReader sdr2 = cmdd.ExecuteReader();
                    if (sdr2.Read())
                    {
                        gidertoplam = Convert.ToInt32(sdr2[0]);
                        conn.Close();
                    }
                    sdr2.Close();

                    conn.Open();

                    //SqlCommand cmddd = new SqlCommand(Bakiyequery, conn);
                    //SqlDataReader sdr3 = cmddd.ExecuteReader();
                    //if (sdr3.Read())
                    //{
                    //    bakiyetoplam = Convert.ToInt32(sdr3[0]);
                    //    conn.Close();
                    //}
                    //sdr3.Close();

                    SqlCommand cmd1 = new SqlCommand();
                    cmd1.Connection = conn;
                    cmd1.CommandText = "INSERT INTO Kasa(Tarih,Gelir,Gider,Bakiye) VALUES (@Tarih, @Gelir, @Gider, @Bakiye)";
                    cmd1.Parameters.AddWithValue("@Tarih", date);
                    cmd1.Parameters.AddWithValue("@Gelir", gelirtoplam);
                    cmd1.Parameters.AddWithValue("@Gider", gidertoplam);
                    cmd1.Parameters.AddWithValue("@Bakiye", gelirtoplam - gidertoplam);
                    cmd1.ExecuteNonQuery();
                    dt.Clear();
                    conn.Close();
                    listele();
                }
                catch (Exception)
                {
                    MessageBox.Show("Eksik Veri Var ! \nVerilerinizi Kontrol Edin Lütfen", "SİSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                clickCount++;
            }
            else
            {
                // Tıklama sayısı 1 den fazla ise, uyarı ver
                MessageBox.Show("Bugün İçin Veri Ekleme İzniniz Doldu.", "SİSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // Kayıtlı Olan Veriyi Silmek İçin Gerekli Kodlar
        private void btnSil_Click_1(object sender, EventArgs e)
        {
            if (MessageBox.Show("KAYIT SİLİNSİNMİ ?", "SİSTEM", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk) == DialogResult.Yes)
            {
                conn.Open();
                SqlCommand cmd3 = new SqlCommand();
                cmd3.Connection = conn;
                cmd3.CommandText = "DELETE FROM Kasa WHERE ID=@NUMARA";
                cmd3.Parameters.AddWithValue("@NUMARA", dataGridView1.CurrentRow.Cells[0].Value.ToString());
                cmd3.ExecuteNonQuery();
                dt.Clear();
                conn.Close();
                listele();
            }
        }

        // Excel'e Kayıtlı Olan Verileri Aktarmak İçin Aktarma Ve Ekleme Kodları
        private void btnexcel_Click_1(object sender, EventArgs e)
        {
            int sutun = 1;
            int satir = 1;
            Excel.Application ExcelApp = new Excel.Application();
            ExcelApp.Workbooks.Add();
            ExcelApp.Visible = true;
            ExcelApp.Worksheets[1].Activate();
            for (int j = 0; j < dataGridView1.Columns.Count; j++)
            {
                ExcelApp.Cells[satir, sutun + j].Value = dataGridView1.Columns[j].HeaderText;

            }
            satir++;

            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    ExcelApp.Cells[satir + i, sutun + j].Value = dataGridView1[j, i].Value;
                }
            }
        }       
        private void Kasa_Load_1(object sender, EventArgs e)
        {
            // TODO: Bu kod satırı 'kasa_Hareket_TakipDataSet1.Kasa' tablosuna veri yükler. Bunu gerektiği şekilde taşıyabilir, veya kaldırabilirsiniz.
            this.kasaTableAdapter.Fill(this.kasa_Hareket_TakipDataSet1.Kasa);
            listele();
        }
    }
}

Hocam kasa bölümünün kodları bunlar hata da şu ;
 

Dosya Ekleri

  • Ekran görüntüsü 2023-01-22 174123.png
    Ekran görüntüsü 2023-01-22 174123.png
    306,5 KB · Görüntüleme: 29

Bu konuyu görüntüleyen kullanıcılar

Technopat Haberler

Geri
Yukarı