DataTable içinde arama

DataTable içinde arama yapmak bizi gereksiz yere sistem kaynaklarını meğul etmekden kurtarır. Müşteri isimleri arasında harf harf arama yaptıgınızı düşünürsek her harf için gidip SQL den sorgu çalıştırmak çokda mantıklı değil. Hem performası olumsuz etkiler hemde diğer kullanıcılar için yeterince kayank bırakmış olursunuz. Tek kullanıcı yada kendi lokalinde çalışan bir program belki çok problem yaratmaz ama 10 000 ler ce kaydın oldugu hatta 20-30 kullanıcının aynı sisteme bağlanıp sorgu çektigimi düşünmek kabus gibi:)
!!!! Not: Anlık değişebilecek kayıtlar için kullanımı uygun değildir. Stok durumunu takip eden bi arayünüz oldugunu düşünürsek. sabah x üründen 10 tane vardı işiniz çıktı gittiniz 3 saat sonra geldiniz ve siz dışardayken bu x ürününden 10 tane sipariş geldi ve satıldı. Siz tekrar veritabanına bağlanmadıgınız için hala sizde 10 tane x ürünü görünür buda içinden çıkılmaz bir hataya yol açar.

public DataTable dtAra(string Filtre, DataTable KaynakVeriKumesi)
{
DataTable yeniDataTable = new DataTable(); //en son döndermek işin kullanacagımız boş bir dataTable tanımladık.

yeniDataTable = KaynakVeriKumesi.Copy(); //bize içini doldurmak işin kolonlara ihtiyacımız var. Yani tablo iskeleti lazım.

yeniDataTable.Clear(); // Row lara ihtiyacımız yok...

DataRow[] dr = KaynakVeriKumesi.Select("Musteri_ like '" + Filtre + "%'", "Musteri_ DESC", DataViewRowState.CurrentRows);

// DataTable select metodu bize dataRow dizisi dönderir. Burda sql select ifadesinde where kısmında kullandıgmız herşeyi aynen kullanabiliriz.
// DataRow dizisini sonuna kadar okuyarak önceden aldıgımız dataTable 'a select metodundan dönen satırlar aktırılıyor.

foreach (DataRow Sonuclar in dr)
{
DataRow dr2 = yeniDataTable.NewRow();
dr2[0] = Sonuclar[0];
dr2[1] = Sonuclar[1];
yeniDataTable.Rows.Add(dr2);
}
return yeniDataTable; // dönen satırlar metot dışına fırlatıyor.
}

Kullanıcı Dostu AutoCompleteSource

Bazılarımız projelerimizde biraz detaya dalarak yada zaman içinde kodlarımızı revize ederek kullanıcıya maximum kolaylık hedefleriz. Zaten kullanıcılarda bunu ister hatta bazıları vardır ki (bilirsiniz onlarla anlaşmak çok oluyor) tek tuşla harikalar yaratsın. Yazdıgımız programları örnek olarak üretim yapan büyük bir işletme için geliştirdiğinizi düşünürseniz büyük ihmal yazılımın bir modülünü üretimde ki işçi diğer modülünüde yönetici kullanacaktır. Zaman zaman aynı modüle kullanabilirler. Bundan dolatyı program mümkün oldugunca işleri kolaylaştırmalı hatta tek tuşla birçok iş yapabilmelidir. Çünkü herkes aynı yetenkelere sahip olmaya bilir. :)

Konuyu çok da uzatmamak için hemen sadete geliyorum. Bahsettiğim amaçlarla kullanıcı dostu arayüzler yaratmak için kullandıgımız bir sınıf var. AutoCompleteStringCollection sınıfı...
Bariz örnegi web browserınızda adres çubugunda otomatik tamamlanan adresleri bilirsiniz şimdi o olay nasıl oluyor onu incelicez.

Sıra geldi kodlara;

AutoCompleteStringCollection otoStr = new AutoCompleteStringCollection(); //Oto tamamlayıcı sınıfımızı tanımlıyoruz.
private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection("Server=.;Database=ILLER;Uid=sa;Pwd=123456");
SqlCommand cmd = new SqlCommand("select * from tbiller",conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
otoStr.Add(dr[1].ToString()); // dönen degerler oto tamalayıcı kolleksiyonumuza dolduruyoruz
listBox1.Items.Add(dr[1].ToString());
}
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; // Tamamlama tipimizi beliritiyoruz
textBox1.AutoCompleteCustomSource = otoStr; // textBox1 nesnemizin AutoCompleteCustomSource özelligine oto tamamlayıcı sınıfımızı atıyoruz.
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) // textBox da otomatik tanımlanarak seçilen derger listedede işaretlensin istiyorum.
listBox1.SelectedItem = textBox1.Text;
}

Ben bunları Şehir isimlerini otomatik tanımlamak için kullandım..
Siz textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource özelliğini inceleyerek sistem kaynaklarınıda kullanalabilirsiniz.

Umarım faydalı olmuştur...
İyi çalışmalar.

FileStream ile Resim Oku Farklı Kaydet

byte byte okunan resmi tersi işlem uygulayarak farklı kaydediyoruz. Fazla söze gerek yok buyrun kodlamaya...
öncelikle using System.IO; sınıfını projemize dahil ediyoruz.


private void button1_Click(object sender, EventArgs e)
{
string okunanDosya = "";
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Resim Dosyası *.JPG;*.BMP;*.GIF";
if (open.ShowDialog() == DialogResult.OK)
{
okunanDosya = open.FileName;
pictureBox1.Image = System.Drawing.Bitmap.FromFile(okunanDosya);

Fs;
Fs = new FileStream(okunanDosya, FileMode.Open, FileAccess.Read);
long Uzunluk = Fs.Length;
_Dizi = new byte[Uzunluk];
Fs.Read(_Dizi, 0, (int)Uzunluk);
}
}
byte[] _Dizi;

//YAZ//
private void button2_Click(object sender, EventArgs e)
{
string yazilanDosya;
SaveFileDialog save = new SaveFileDialog();
save.Filter = "Resim Dosyası *.JPG;*.BMP;*.GIF";
if (save.ShowDialog() == DialogResult.OK)
{
yazilanDosya = save.FileName;

save.AutoUpgradeEnabled = true;
FileStream Fs_yaz = new FileStream(yazilanDosya, FileMode.Create);
Fs_yaz.Write(_Dizi, 0, _Dizi.Length);
Fs_yaz.Close();

}
}
Diskden okunan resim istenirse yazılmadan önce bikaç işleme tabi tutularak db de tutulabilir yada txt dosyada tutulup farklı bir kaynaga transfer edilebilir. Alıcıda tersi işlemi uylarak tekrar disk de resmi oluşturabilir.

Settings Sınıfı kullanarak kalıcı form konumu yaratmak

Setting sınıfı proje içinde parametre, form boyutu vs. gibi çok yüklü olmayan ayarların tutulması için kullanılır. Oluşturması ve kullanımı çok basittir. Ben burada form un ekran üzerinde ki pozisyonu alarak formu her yüklendiğinde aynı noktada açılmasını sağladım. Buna başka bir örnek verecek olursak form zeminine atanan rengin kalıcı olması sağlabilir.
Setting sınıfı bool, int, string, DateTime, Point, Size gibi daha bir çok veritipini tutabilir.

Setting sınıfını kullanabilmek için kodlamaya geçmeden önce mauel olarak kendiniz saklanacak alan tipleri ve alan adlarını belirlemeniz gerekir.

Bunu yapmak için Solition explorer da sağ tuş Properties yolunu izleyerek Setting Sekmesinde
yapılacak işleme göre bir alan tipi seçilir ve alan adı verilerek proje kaydedilir.

Sıra geldi kodlamaya...


private void button1_Click(object sender, EventArgs e)
{
Settings.Default.LocationX = int.Parse(textBox1.Text); //textbox larda ki de§erleri
Settings.Default.LocationY = int.Parse(textBox2.Text); // settin dosyasına atar
Settings.Default.Save(); // kaydeder
Close(); //kapat
}
private void Form1_LocationChanged(object sender, EventArgs e)
{
textBox1.Text = this.Location.X.ToString(); //formun o an ki X yani sutün değerini alır
textBox2.Text = this.Location.Y.ToString();//formun o an ki Y yani satır değerini alır
}
private void Form1_Load(object sender, EventArgs e)
{
int X=Settings.Default.LocationX; // form yüklenirken setting doyasından okudugu degerleri
int Y=Settings.Default.LocationY; //
this.Location = new Point(X, Y); //alınan X, Y değerleri formun locationuna atanır...
}


Umarım faydalı olmuşdur.

Toplu olarak nesne temizlemek

Hocamında yıllar önce söyledigi gibi "minimum kod maximum iş" işte size örnek.
Ben burda label textleri ve nesne içlerini boşaltmak için kullandım ama asıl amaç form üzerinde ki tüm nesleri tek foreach yardımıyla nasıl dolaşılır onu göstermek.

// Tüm laballere "fatih" yazar
foreach (Control nesne in this.groupBox1.Controls) // Dikkat !!! this.groupBox1.Controls
{
if (nesne.GetType() == typeof(Label))
{
Label lbl = (Label)nesne;
lbl.Text = "fatih";
}
}
// Tüm comboBox ve textBox ları text lerini temizler
foreach (Control item in this.groupBox1.Controls)
{
if (item.GetType() == typeof(ComboBox) item.GetType() == typeof(TextBox))
{
item.Text = "";
}
if (item.GetType() == typeof(TextBox))
{
TextBox txt = (TextBox)item;
txt.Text = "";
}
}

En basitinden txt dosya okuma yazma

Bazen database yolu, server adı yada benzeri parametreleri saklamak için ini uzantılı yada basit txt dosyarlı olşturur oradan gerektikce okuma yazma yaparız...

//--YAZ--//
StreamWriter yaz = new StreamWriter(@"c:\System.ini",false); //Burdaki false parametresi ekleme yapılıp yapılmayacagıdır.
yaz.WriteLine("SERVER"); //false ekleme modunu kapatır her yeni yazılan dergerler önceki kaydi siler
yaz.WriteLine("DB");
yaz.Close(); // Close() yapılmazsa veriler dosyaya yazılmaz...

//--OKU--//
StreamReader oku = new StreamReader(@"c:\System.ini");
textBox1.Text = oku.ReadLine();
textBox2.Text = oku.ReadLine();
oku.Close();