Bu yazımızda C# ile veri tabanından DataGridView içine veri çekerek oluşturduğumuz Sağ tuş menüsü (ContextMenuStrip) ile DatagridView kontrolü üzerinde farenin sağ tuşuna bastığımızda satırın seçilmesini ve bu seçilen satırdaki verinin veritabanından silinmesini gerçekleştiren bir örnek oluşturacağız.
Örneğimizde yukarıdaki form tasarımını kullanacağız. Ayrıca kutuphane.mdb isimli access dosyasını kullanacağız. kutuphane.mdb dosyamızı projemizde Bin\Debug klasörüne kopyalayacağız.
Form açıldığında verilerin DatagridView kontrolünde gösterilmesini sağlayacağız. DataGridView üzerinde sağ tıklandığında ise satırın seçilmesini ve Sil komutunun görüntülenmesini sağlayacağız.Formumuz tasarlayarak Sağ tuş menüsü eklemek için Toolbox‘ tan ContextMenuStrip kontrolünü formumuza sürükleyelim ve Sil menüsünü oluşturalım.
Şimdi de DatagridView kontrolü üzerinde tıklayarak Properties penceresinde ContextMenuStrip özelliğini aşağıdaki gibi ayarlayalım.
Ayrıca yine DataGridview kontrolünde SelectionMode özelliğini FullRowSelect ve MultiSelect özelliğini False olarak ayarlayalım.
Bu ayarları açıklamak gerekirse ContextMenuStrip özelliğinde oluşturduğumuz sağ tuş menüsünün DatagridView üzerinde sağ tuşa basıldığında çalışmasını, SelectionMode – FullRowSelect özelliği ile tüm satırın seçili olarak görünmesini ve MultiSelect özelliğinin False olarak ayarlanması ile de çoklu seçim yapılamayacağını ayarlamış oluyoruz.
Şimdi kodlarımızı yazacağız. Kodlarımızda Verileri çekme işlemini Doldur() isimli metotta, Silme işlemini ise Sil() isimli metotta gerçekleştireceğiz.
Kodlarımızı yazmaya;
1 2 3 | using System.Data.OleDb; |
kütüphanemizi projemize dahil ederek başlayalım.
Daha sonra kullanacağımız nesneleri projemize public olarak ekleyelim. numara adlı değişkeni datagridview’ de tıklanan satırdaki öğrencinin numarasını almak için kullanacağız.
1 2 3 4 5 6 | OleDbConnection con; OleDbDataAdapter da; DataTable dt; int numara; |
Şimdi Doldur isimli metodumuzu oluşturalım. Bu metod verilerin DataGridView‘ de görüntülenmesini sağlayacak.
1 2 3 4 5 6 7 8 9 10 11 12 13 | void Doldur() { con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=kutuphane.mdb"); da = new OleDbDataAdapter("SELECT * FROM ogrenci", con); dt = new DataTable(); con.Open(); da.Fill(dt); con.Close(); dataGridView1.DataSource = dt; } |
Daha sonra Sil isimli metodu oluşturacağız. Bu metot öğrenci numarasına göre kayıt silme işlemi yapacağından parametreli olarak oluşturacağız. Parametre olarak öğrenci numarasını alacağız.
1 2 3 4 5 6 7 8 9 10 11 | void Sil(int numara) { con.Open(); string sql = "delete from ogrenci where ogrno=@no"; OleDbCommand com = new OleDbCommand(sql, con); com.Parameters.AddWithValue("@no", numara); com.ExecuteNonQuery();//www.yazilimkodlama.com con.Close(); } |
Form_Load olayında datagridview’de kayıtların görüntülenmesini sağlamak için Doldur metodunu çağıralım.
1 2 3 4 5 6 | private void Form1_Load(object sender, EventArgs e) { Doldur();//www.yazilimkodlama.com } |
DataGridview’de seçilen satırdaki kayda ait ogrno verisinin numara değişkenine aktarılmasını sağlayalım. Bunun için DatagridView MouseDown olayını kullanacağız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | private void dataGridView1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right)//farenin sağ tuşuna basılmışsa { int satir = dataGridView1.HitTest(e.X, e.Y).RowIndex; if (satir >-1) //www.yazilimkodlama.com { dataGridView1.Rows[satir].Selected = true;//bu tıkladığımız alanı seçtiriyoruz numara = Convert.ToInt32(dataGridView1.Rows[satir].Cells["ogrno"].Value); } } } |
Bu işlem sonucunda silmek istediğimiz öğrenci numarasını numara değişkenine almış oluyoruz. Şimdi ContextMenuStrip‘ te oluşturmuş olduğumuz Sil menüsüne basıldığında Sil metodu ve Doldur metodunun çalıştırılmasını sağlayalım.
1 2 3 4 5 6 7 | private void silToolStripMenuItem_Click(object sender, EventArgs e) { Sil(numara); Doldur(); } |
Kodlarımızı tamamlamış olduk. Artık DataGridview üzerinde sağ tıklandığında Sil menüsü açılarak Sil butonuna basıldığında ilgili kaydın silinmesi sağlanacak.
ilk seferde sile basınca silmiyor, ikincide siliyor , sebebi ne olabilir ?
selamunaleykum ustam sana bir sorum olacak: bir tane textboxum var ve ıki tanede datatimepickerım var .textboxa girilen veriye göre butona bastığımda veritabanında kayıtlı verinin iki tarih aralığında olanları nasıl listeletebilirim datagride
textboxa girilen: estas_kodu
private void button1_Click(object sender, EventArgs e)
{
tablo.Clear();
baglanti.Open();
OleDbDataAdapter adp = new OleDbDataAdapter(“SELECT * FROM kayit Where tarih BETWEEN @tar1 and @tar2 and estas_kodu=@estas_kodu”, baglanti);
adp.SelectCommand.Parameters.AddWithValue(“@estas_kodu”, textBox1.Text);
adp.SelectCommand.Parameters.AddWithValue(“@tar1”, dateTimePicker1.Value.ToShortDateString());
adp.SelectCommand.Parameters.AddWithValue(“@tar2”, dateTimePicker2.Value.ToShortDateString());
adp.Fill(tablo);
dataGridView1.DataSource = tablo;
baglanti.Close();
baglanti.Open();
OleDbCommand komut = new OleDbCommand(“select sum(saglam_uretim) from kayit where tarih between @tar1 and @tar2”, baglanti);
komut.Parameters.AddWithValue(“@tar1”, dateTimePicker1.Value.ToShortDateString());
komut.Parameters.AddWithValue(“@tar2”, dateTimePicker2.Value.ToShortDateString());
label4.Text = komut.ExecuteScalar() + “Adet”;
baglanti.Close();
}
https://www.tasarimkodlama.com/csharp-programlama/csharp-windows-form/c-secilen-datagridview-ile-iki-tarih-arasinda-textboxa-girilen-verileri-filtreleme/
dostum ben bunu yaptım lakin olmadı örnek uygulamayı almam mümkün mü
https://drive.google.com/open?id=1SSXeZVCwk0pb-a8bCWUV17_V46UeuZSQ
ustam aradığım ürün datagridde görünmüyor neden acaba
admin onu yaptım lakin bir sorum daha olacak bu ürünleri datagridde sıralama yaparken artan şekilde sıralanmasını istiyorum nasıl yapabilirim
com.Parameters.AddWithValue(“@id”, Convert.ToInt32((dataGridView1.CurrentRow.Cells[0].Value)));
satırında
Nesne, DBNull’dan diğer türlere atanamaz.
hatası alıyorum yardımcı olurmusunuz
Hatanın sebebi ne olabilir sizce ? 🙁
veritabanındaki alan isimlerine göre yazmanız gerekiyor
Allan isimleri aynı veri tabanımdaki
alan isimlerinde bir sıkıntı yoksa bu hatayı da vermemesi gerekiyor. Tekrar kontrol edin.
Hocam o kadar çok kontrol ettim ki , aynı hepsi
Kendi projeme uyarlamaya çalıştığımda tekrar aynı hata ile karşılatım ;
con.Open();
string sql = “delete from musteri where musteri_id=@no”;
musteri_id alanını bulmuyor. Bursaki tanımlamayı tc_no, adi gibi değerlerle değiştirebilirmiyiz.
Column named tc_no cannot be found. gibi
Çok teşekkürler , oldu ufak bir hatam olmuş 🙂
Attığınız örnekle birebir aynı , bu defa context menu çalışmıyor sağ tıkladığımda sil görünmüyor ve de ‘Form1.komut’ alanı hiçbir zaman kullanılmaz: gibi bir hata ile karşılaştım
hata alıyorum yardımıcı olur musunuz. numara = Convert.ToInt32(dataGridView1.Rows[satir].Cells[“no”].Value); alan bulunamadı diyor
veritabanında “no” adında bir alan varmı kontrol edin.
Mesela no , ad gibi sütünun üzerine tıkladığımda silme işlemi gerçekleşiyor fakat seçili gelen satıra tıkladığımda bu hata geliyor.
DataGridview kontrolünde SelectionMode özelliğini FullRowSelect ve MultiSelect özelliğini False olarak ayarladınızmı
Evet yazdığınız bütün aşamaları tek tek yaptım
Buradan indirip kontrol edebilirsiniz.
Sayın eyp: Verilen örnek zaten SQL , Hoca’yı Abuk Sabuk şeylerle lütfen rahatsız etmeyiniz..
Site içinde sql bağlantısı örneği mevcut. Sağ tuş ile silme işlemi için ise çok önemli bir değişiklik olmayacaktır.
bunu sql yaparmısınız size zahmet hoccam