Datagridview birden fazla arama yapma

Merhabalar,
datagridview kullanarak bir arama işlemi gerçekleştirmek istiyorum.
internette arama yaptığımda sadece 1 adet texbox üzerinde arama buluyorum.

Benim yapmak istediğim birden fazla arama kutusu ile ilişkili arama.

Resimde görüldüğü gibi en özellik kısmına taş bile yazsam arama gerçekleşiyor. Bunda sorun yok ama en kısmına 1250 yazınca bir önceki filtreleme siliniyor yeni bir filtreleme yapıyor.

Ben ise şu şekilde olmasını istiyorum.
Özelik kısmında taşlı yazdığımda çıkan sonuçlar içerisinde en kısmınıda 1250 yazdığımda sadece 5 nolu id satırı gelsin istiyorum.
Teşekkürler

Bu işlem için aşağıdaki kodu kullandım

 private void textBox1_TextChanged(object sender, EventArgs e)
        {
            tablo.Clear();
            baglanti.Open();
            SqlDataAdapter adtr = new SqlDataAdapter("select  *from stok where özellik like '%"+textBox1.Text+"%'",baglanti);
            adtr.Fill(tablo);
            dataGridView1.DataSource = tablo;
            baglanti.Close();
            if (textBox1.Text=="")
            {
                dataGridView1.Show();
            }

        }

@semtex

Bu da çözülebilir. Yani, sorudaki gibi data grid üzerinde bir arama yapılabilir. Üzerinde çalışabilirsem benzer bir önek kod bırakabilirim. Yani veri tabanınıza sorgu yapmadan, grid nesenesi üzerinde arama yapmak bir yöntem.

Ama genelde arama işlemleri data grid üzerinde değil, kullanılan veri tabanı tarafında yapılır ve sonrasında data grid güncellenir.

Yani datagridview üzerinde değil veritabanınız üzerinde qrama yapıyorsunuz. Kiz siz de zaten verdiğiniz kod parçasında böyle yapmışsınız.

SqlDataAdapter adtr = new SqlDataAdapter("select  *from stok where özellik like '%"+textBox1.Text+"%'",baglanti);

Bu satırdaki sorgunuzu değiştirmeniz gerekiyor. Soru Sql sorusuna dönüşür.

c# - linq search multiple columns - Stack Overflow

Satırındaki gibi,

var TheOutput = (from t in TheDC.SomeTable

                 where TheIDs.Contains(t.ID) && (
                 t.column1.Contains(TheSearchTerm) ||
                 t.column2.Contains(TheSearchTerm) ||
                 t.column3.Contains(TheSearchTerm) )           
                 select t.ID).ToList();
}

gibi çoklu arama koduna çevirmeniz gerekir.

Yani arama sorgularınız, sonrası oluşan filtre liste üzerinde veya, mevcut sorgu ve önceki sorguları birleştirerek yeni bir sorgu yapmanız gerekir.

Yukarıdaki örnek üzerinde bir kaç değişiklik gerekiyor.

Çok laf salatası yaptım. Kodlamak gerekir, denemeden de önümüze çıkacak problemleri kestiremiyorum.

Tek bir texbox ile yapacaksanız, bir önceki sorgu kriterini bir yerde tutup, sonraki girileni ikinci arama koşulu, bir sonrakinde ise üçüncü koşul olacak şekilde düzenlenerek çözülebilir.

Birden çok textbox ekleyip, her birini sorgu satırınıza ekleyen bir rutin sonrası arama gerçekleştirme işinizi çözebilir gibi geldi.

Yani kodunuzun kilit satırı:

SqlDataAdapter adtr = new SqlDataAdapter("select  *from stok where özellik like '%"+textBox1.Text+"%'",baglanti);

Sorgunuzu yeniden düzenlemek gerekiyor.

select *from stok where sorgusu yerine her bir textboxtan gelen parametrelerin hepsinin bulunduğu bir sorgu tasarlamanız gerekiyor.

where clause’ında;

And ile her bir koşulu ekleyerek arama yapmanız gerekiyor.

SQL: Combining the AND and OR Conditions (techonthenet.com)

Gibi.

Tabi ben buradan “özellik” parametrenizi bilmiyorum.

Bir örnek oluşturmadan önce. Veri tabanınız ve özellik gibi bir iki parametreniz hakkında biraz daha bilgi verebilirseniz bir örnek oluşturmaya çalışabilirim.

Kolon isimleri bu konuda önemli çünkü

Aramayı, 1. Kolon bu ise ve 2. kolon bu ise ve 3. kolon bu ise gibi yeniden düzenlemek gerekiyor.

Merhaba,
Öncelikle cevap için teşekkürler.
Bu öğrenme işlerine henüz yeni başladığımdan ve maalesef İngilizce zayıf olduğundan bir çok yabancı kaynakta ne demek istediğini tam olarak çözemedim. :slight_smile:

where clause’ında;

And ile her bir koşulu ekleyerek arama yapmanız gerekiyor.

SQL: Combining the AND and OR Conditions (techonthenet.com)

Gibi.

Tabi ben buradan “özellik” parametrenizi bilmiyorum.

Bir örnek oluşturmadan önce. Veri tabanınız ve özellik gibi bir iki parametreniz hakkında biraz daha bilgi verebilirseniz bir örnek oluşturmaya çalışabilirim.

Kolon isimleri bu konuda önemli çünkü

Aramayı, 1. Kolon bu ise ve 2. kolon bu ise ve 3. kolon bu ise gibi yeniden düzenlemek gerekiyor.

and ve or kısmı dün akşam benimde aklıma geldi fakat bu kodu tam olarak nereye yazacağımı bilemedim.

SqlDataAdapter adtr = new SqlDataAdapter("select  *from stok where özellik like '%"+textBox1.Text+"% || kalinlik where özellik like '%"+textBox2.Text+"%'",baglanti);

Buradaki gibi ekleme yapa yap bir deneme yapacağım…

Tabi ben buradan “özellik” parametrenizi bilmiyorum.

Parametreden kastınız veri tabanı türü int ve char gibi mi bir şeyden mi bahsediyorsunuz?

Burada özellik seçmemin nedeni ise “en” ve " boy" gibi kısımlar int veri türüne sahip olduğundan hata alıyorum. Muhtemelen aldığım hata ise int car çakışmasından kaynaklanıyor.

Şu an çalışıyorum akşam size veritabanı ekran görüntülerini atacağım…

Özür dilerim, ingilizce konusuna çoğunlukla dikkat etmiyorum. Tabi ki Türkçe kaynaklar da var, alışkanlık aramalarımı ve kaynaklarımı ingilizce yapıyorum. Dikkat etmeye çalışırım.

where sonrasında, bir parantez içinde yapmayı deneyebilirsiniz.

Parametreden kastım “özellik” nedir bilemedim. Göz ucuyla bakıyorum iş arasında belki gözden kaçırdım.

Bu da işin ayrı bir boyutu verilerinizi nasıl tuttuğunuz bilmiyorum. Tabloyu nasıl oluşturduğunuzu göremiyorum. Tabi ki hepsinin çözümleri var.

Söylemek istediğim buydu.

Tabloda arama yapacaksınız, string mi arayacağız, varklı veri tipleri mi bilmiyoruz.

Bu nedenle aramalarda gelen verilerin hepsini stringe çevirmek yada, arama verilerinin tipini değiştirmek gibi farklı seçenekler de var.

Bu nedenle sizden bu bilgileri istedim.

Eğer bu bilgiler elimizde olursa örnek kodunuza uyumlu kod yazıp paylaşmam daha kolay olur.

Ama veri tipi dönüştürmekle ilgili konulara da bakabilirsiniz.

Dizeyi sayıya dönüştürme - C# Programlama Kılavuzu | Microsoft Learn

Sayısal tür	Yöntem
decimal	ToDecimal(String)
float	ToSingle(String)
double	ToDouble(String)
short	ToInt16(String)
int	ToInt32(String)
long	ToInt64(String)
ushort	ToUInt16(String)
uint	ToUInt32(String)
ulong	ToUInt64(String)

Gibi dönüştürmeler kullanabilirsiniz.

Vakit ayırabilirsem benzer bir kod eklerim buraya.

O zamana kadar verdiğim ipuçlarından bir yerlere varmaya çalışabilirsiniz.

EDIT:

Şuradaki örnek tam sizin istediğinizi sağlamaz ama fikir edinmek için göz atabilirsiniz.

c# aynı tabloda birden fazla sorgu (microsoft.com)

Birleşim sorgusu kullanarak birden çok sorguyu tek bir sonuçta bir araya getirme - Microsoft Desteği

merhaba,
veritabanı ayrıntıları bu şekildedir.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Sim
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        SqlConnection baglanti = new SqlConnection("Data Source=DESKTOP-RBSHEBT;Initial Catalog=sim;Integrated Security=True");
        DataTable tablo = new DataTable();

        private void Form2_Load(object sender, EventArgs e)
        {
            // TODO: Bu kod satırı 'simDataSet7.stok' tablosuna veri yükler. Bunu gerektiği şekilde taşıyabilir, veya kaldırabilirsiniz.
            this.stokTableAdapter.Fill(this.simDataSet7.stok);


        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            tablo.Clear();
            baglanti.Open();
            SqlDataAdapter adtr = new SqlDataAdapter("select  *from stok where özellik like '%" + textBox1.Text + "%'", baglanti);
            adtr.Fill(tablo);
            dataGridView1.DataSource = tablo;
            baglanti.Close();
            if (textBox1.Text == "")
            {
                dataGridView1.Show();
            }

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
             
            
        }
    }
}

Formdaki tüm kodlar ise bunlardır.

Merhaba;

Aslında SQL sorguları ile yapacaktım ama bunun yerine C# formanını neden kullanmıyorum diye düşündüm:

Şöyle bir şey çıktı:

System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'stokDataSet.stok' table. You can move, or remove it, as needed.
            this.stokTableAdapter.Fill(this.stokDataSet.stok);


        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.stokBindingSource.EndEdit();
            this.stokTableAdapter.Update(this.stokDataSet.stok);
        }

        private void textBox1_TextChanged(object sender, EventArgs e)

        {
            stokBindingSource.Filter = $"en ={textBox1.Text}";
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            stokBindingSource.Filter = $"en ={textBox1.Text} AND boy={textBox2.Text}";
        }
    }
}

stok isminde bir veritabanına bağladım.

Stokbinding ve StoktableAdapter bileşenlerini ekledim projeye.

Veri tabanını resimde gördüğüm kadarıyla benzettim. Sorgularda değer kontrolü yaparsak diye.

Ama gerek kalmadı.

Madem datagrid kullanıyoruz, filremizi de ona uygun yapalım dedim.

Böyle bir şey çıktı.

Bir tane update butonu koydum, Siz onu kullanmazsınız ben veri eklemek için kullandım.

Veriler dolu örnek tablo:

100 yazalım:

Boyu da 100 girelim.

Burada textboxları artırıp, texbotklarda her bir textbox ta and leri artırarak sorguyu geliştirebilirsiniz.

Kolay gelsin.

Vakit azlığından ayak üstü yazdım, yazım hataları varsa şimdiden özür dilerim.

Kolay gelsin.

EDIT 1:

Şimdi baktım.

TextBox’ların on change event’ında çalıştığı için, textbox lari silince, boş değeri filtreye göndererek çökebiliyor.

using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'stokDataSet.stok' table. You can move, or remove it, as needed.
            this.stokTableAdapter.Fill(this.stokDataSet.stok);


        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.stokBindingSource.EndEdit();
            this.stokTableAdapter.Update(this.stokDataSet.stok);
        }

        private void textBox1_TextChanged(object sender, EventArgs e)

        {
            // stokBindingSource.Filter = $"en ={textBox1.Text}";
            if (!string.IsNullOrWhiteSpace(textBox1.Text))
            {
                stokBindingSource.Filter = $"en = {textBox1.Text}";
            }

            else
            {
                stokBindingSource.RemoveFilter();
            }
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            if (textBox2.Text == "")
             stokBindingSource.Filter = $"en ={textBox1.Text}";
            else 
               stokBindingSource.Filter = $"en ={textBox1.Text} AND boy={textBox2.Text}";
        }
    }
}

Bunarı da kontrol altına alan ufak kod eklemeleri de yaptım. Aslında try blokları ile de kontrol etmek gerekir ama fikir vermesi açsından yazdığım için çok da o detaya girmedim.

merhaba @semtex,
Öncelikle verdiğin destek için teşekkür ederim. akşam eve gittiğimde mutlaka deneyip bunun sonucunu buradan yazacağım.

Burada asıl sormak istediğim soru şu olacak
tamam siz yardım ediyorsunuz konulara cevap veriyorsunuz ama bu benim için yetersiz oluyor. Benim balık almaya değil balık tutmaya ihtiyacım var.
Bu işin mantığını algoritma nedir adapter nedir sizin yazdığınız kodların anlamını nasıl buldunuz o kodları vs vs bilgileri nasıl öğrenebilirim?
Kitap almam gerekiyor ise hangi kitabı almam gerekli vs vs önerileriniz nelerdir?

1 Beğeni

Umarım çalıştırabilirsiniz. Datasource eklemek, ve bağlamak kodla değil, doğrudan arayüz üzerinden yapıldı. Umarım çuvallamazsınız.

Tamam sorun.

Bundan önceki sorular asıl sorular demek değildi demek ki. Başlığa ve başlıktaki soruya aldandım demek ki ben.

Seçenekler:

a. Cevap vermeyim.

b. neden cevaplar yetersiz tahminde bulunayım.

Balık tutun o zaman.

Ben programlama ile ilgili sorulara bakıyorum. Balıkçılık teknik yeterlilik yanısıra şans işidir de. Tabi olta balıkçlılığıysa. Yoksa radarı açar dibi tarar atarsanız dip ağını balıkları toplar çıkarsınız.

Mantığı basit, koşula göre arama yapıyorsunuz (yada veri tabanında sorgu yapıyorsunuz) ;

Eğer 1. kolondaki veri şu ise ve (AND)

  1. kolondaki veri şu ise listele…

Yani bunu bilgisayar kullanan, excel tablosu kullanan biri bile bilir. Koşullu filtreleme.

Tabi şöyle buldum:

Google.

Her zaman söylediğim iki şey, ilki derleyicinizi tanıyın, ikincisi kullandığınız dili öğrenin.

C# öğrenen biri, nesneye yönelik programlama (OOP) nedir öğrenmeli. Bu dil ile sınıflar oluşturulur, ve bu sınıflardan nesneler oluşturulur ve nesneler üzerinden nesne özellikleri kullanılarak kod yazılır.

Aslında benim yazdığım 2 satır kod var.

Gerisini zaten C# arayüzü otomatik oluşturuyor.

stokBindingSource.Filter = $"en ={textBox1.Text}";

Bu birinci satır.

 stokBindingSource.Filter = $"en ={textBox1.Text} AND boy={textBox2.Text}";

Bu da ikinci satır.

Event’leri ben yazmadım. Textbox’ları ben yazmadım otomatik oluşturuldu.

Açıp google’dan datasource nedir? BindingSource nedir dataGridView nedir baktım.

Hangisi nereden filtreleme yapar diye özelliklerine baktım.

BindingSource özelliğinin filtreleme özelliği olduğunu gördüm.

Filtreleme için nasıl parametre aldığına baktım ve filtreledim.

Neden böyle yaptım, C# nesneler üzerinden haberleşiyor ben de daha güvenli kod olması için bu yöntemi tercih ettim.

sql komutu gönderecek bir nesne tanımlayıp, komutu olduğu gibi gönderip sorguyu geri almak da mümkündü.

Şimdi gelelim hatan nerede;

Bu:

Hatan bu.

Programlamaya nasıl bakıyorsan, sana biri 1+1=2 yi öğretecek/gösterecek ama sonrasında 1+2=? dendiğinde bu internette yok ne yapacağım diyorsun.

Yani okulda size.

3+4 öğrettiler sonra 7+5+3 sorsalar yapamaz mısın?

TextBox nedir anlasan ki textbox olsa ne olur üç text box olsa ne yazar, beş textbox olsa ne yazar?

Textbox, sana bir string girme arayüzüdür.

Oradan bir string alırsın hepsi bu.

Sonra bu strinleri ister birleştir ister ayrı ayrı kullan o sana kalmış. (Dili bilsen sorun olmaz)

Sonra anlattığım gibi bindingSource.filter() a nasıl değer atanır microsoftun kaynaklarına bak hepsi bu.

Dünyanın hiç bir yerinde birebir istediğin kodu internetten birebir bulamazsın.

Yani ben bir hikaye yazacağım nasıl yazayım diye sorarsan herkes bir hikaye yazar ama hikaye aynı olmaz.

Burası bir forum;

Bir soru sorduğunda, kimse bir nick üzerinden, gelmişini, geçmişini, yaşını, eğitim seviyeni, duygusal hayatını, aşk yaşamını, yabancı dil düzeyeni, zeka seviyeni bilemez.

Sorarsın, varsa bir çözümü buraya koyar.

Sonra işine yarar yaramaz bilemeyiz.

İşine yaramıştır, ama bir kısmını anlamamışsındır.

Sorarsın onu da açıklar.

Onu da anlamazsan bir başka şekilde açıklar.

Onu da anlamazsan bir başka kullanıcı açıklar.

Bu kadar.

Balık ne? Balıkçı ne? Balık tutmak ne? Konu bu değil.

Mesele, bana ben nasıl öğrenirim diye soruyorsan, ben bilemem.

Eğitimci değilim. Yaş, eğitim, zeka durumunu bilmiyorum.

Herkesin bir yoğurt yeme stlili vardır.

Bunu başkasından bekleme.

Hele ki soru sorduğun birine bana balık tutmayı öğret balık verme dersen.

Adam da döner sana der ki? Bana ne ben senin öğretmenin miyim?

Burada zaman ayırıp bir şeyler anlatıyorsak, sen de sorarak anlamadığın kısmı sor anlatalım.

Hele bu kısım için ne desem bilemedim.

Kitabı mitabı neyi varsa ver de öğrenek tarzı bir öğrenme yaklaşımı yanlış.

Öyle olsa al bir anatomi kitabı tıp oku.

Nacizane tavsiye:

Ne öğrenmek istiyorsun, hangi dilde öğrenmek istiyorsun, hangi seviyede öğrenmek istiyorsun karar ver.

Öğrenirken, kitap mı seviyorsun, videolardan mı seviyorsun, web sayfalarından okuyarak mı seviyorsun kendini tanı karar ver.

Dünyaya bakış açını, kavramsal zekanı, duygusal zekanı ve zekanı tart ne kadarını nasıl sindiririm diye düşün ve karar ver ona göre bir öğrenme yolu seç.

Alan o kadar geniş ki, hangi noktadan başlamanız gerekir nereye varmanız gerekir siz karar vereceksiniz.

Şurada iki satır kod ekledim. Hepsi bu. Bunları ezbere bilmem, kimse de ezberlemez. Alırsınız bir dilin kod referansına nasıl bir kuralla yazıldığın okur, o referansın talimatlarına göre kod yazarsınız.

Sizin sorunuzdaki gibi özel bir modül kullanacaksanız, o modülün/ sınıfın/ companent’in referans dokümanına bakarsınız okursunuz.

Yani hepi topu iki satır kod için, balık, balık tutma hikayesi konuşacaksak hiç zorlamayalım.

Bir sonraki problemde yine çözemeyeceksiniz, çünkü öğrenme metodunuzu gözden geçirmelisiniz. Onu da kendi içinizde çözmelisiniz.

Kolay gelsin.

1 Beğeni