RichTextBox ve LinkClicked

Merhabalar;
En sevdiğim nesnelerden biri olan RichTextBox ın güzel bir özelliğinde bahsetmek istiyorum. Metim içiresinde yazılan web adreslerini otomatik olarak algılar ve link haline getirir. Bu imkanı bize veren DetectURL özelliğidir. Default olarak true geldiği için aslında bişi yapmanıza gerek yok.

Peki ama bu linke tıklayıp adrese gitmek istemem en doğal tepkim olurdu. İyi ama nasıl ??
İşte bu sorunun cevabı.
Yapmanız gereken form üzerine 1 adet richTextBox koymak.

Form açılışında richTextBox ımıza bişiler yazalımış olalım.

private void Form1_Load(object sender, EventArgs e)
{
richTextBox1.Text = "www.artilogo.net";
richTextBox1.Text += "\nLOGO versiyonları ek çözümleri...";
}

İşde olayın bitti nokta...

private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(e.LinkText); //tıklanan link text ini aldık ve sisteme bunu çalıştır dedik o kadar.}

Bence hem kolay hem etkili bi özellik benim çok işime yarıyor.

Bugünlerde canım çok sıkılıyor umarım geçer.
Bir sonraki yazım nedir ne zaman olur bende bilmiyorum.

SQL ISNULL() Kullanımı

SQL de degerlerin null olup olmama durumlarını kontrol etmemiz gerekebilir. Sorgudan dönen deger matematiksel bir işlem sokuluyorsa hata verecektir. Kullanım sebebleri çogaltalabiliriz

Kullanımı: isnull(alanadı,'null sa') --isnull(ADI,'ismiyok') ADI alanı null sa yerine ismiyok yazar

Konunun mantıgını anladık şimdi örneklere geçelim.

SELECT (ISNULL(MAAS,1)*1.10) AS ZAMLI FROM YMusteri

SELECT ISNULL(LAST_NAME,'--') AS CDG FROM CustomerInfo

Daha sorgular konusunda çok yolumuz var bir adım daha atmış olduk.

SQL Select Case When Kullanımı

Merhabalar;
Bir çogumuz sql sorgularında dönen kayıtlar üzerinde seçim işlemi
yapma gereği duymuşuzdur. Cinsiyet alanına kadın / erkek yazdırmak yerine litaratürde gösterilen şekliyle .T. / .F. yada 0/1 gibi kodlamalar kullanırız. 0 ise kadın 1 ise erkek olarak göster dememiz lazım. Bunun en pratik yolu yazdıgımız programlama dilini kullanmadan sql in kendine yaptırmaktır. Sorgumuzu görünce ne demek istedigimi daha iyi anlayacaksınız.
Hadi ozaman buyrun.

Genel yapısı :

SELECT KolonBaslıgı =
CASE SecilecekALAN
WHEN 'D' THEN 'DÜŞÜNCE'
WHEN 'E' THEN 'EGLENCE'
WHEN 'R' THEN 'RENK'
WHEN 'Y' THEN 'YAŞAM'
WHEN 'A' THEN 'AMAÇ'
ELSE 'Yoksa Neye Yarar Dünya '
END, DigerAlanlar
FROM TabloAdı

Genel kullanımını bu şekilde gösterdikten sonra isterseniz birkaç farklı örnek yapalım.

Müşteri tiplerini kodlara ayırdık. Hangi müşteri hangi statüde bilmek istiyoruz ve yazılım aşamasında verdiğimiz kodların hangisinin hangi manada oldugunu göstermek istiyoruz.

SELECT MUSTIPI=
CASE TIPI
WHEN '1' THEN 'ÜST DÜZEY' WHEN '2' THEN 'ORTA DÜZEY' WHEN '3' THEN 'ALT DÜZEY'
ELSE 'BELİRSİZ MÜŞTERİ TİPİ'
END,ADI As MUSTERI
FROM Musteri

Burda yaptıgımız işlemde sorgu çektik müşterilerin tamamı için müşteri kodlarına baktık 1 ise bunu yaz 2 ise bunu yaz.

SONUÇ:

MUSTIPI MUSTERI
---------- -----------
'ORTA DÜZEY' FATİH
'ORTA DÜZEY' MEHMET
'ÜST DÜZEY' SEDA
'ORTA DÜZEY' EDA

Diğer bir kullanım şekli;

SELECT CASE
WHEN BAKIYE=0 THEN 'RİSK YOK'
WHEN BAKIYE>1 AND BAKIYE <'2' THEN 'DÜŞÜK RİSK'
WHEN BAKIYE>=2 AND BAKIYE<'3' THEN 'ORTA SEVİYELİ RİSK' WHEN BAKIYE>3 OR BAKIYE=3 THEN 'YÜKSEK RİSK'
WHEN BAKIYE BETWEEN 4 AND 10 THEN 'ÇOK YÜKSEK RİSK'
END, m.SOYADI, ym.BAKIYE
FROM Musteri AS m INNER JOIN YMusteri AS ym ON m.ID = ym.M_ID

Başka bir örnek kullanabileceginiz bi çok komut var...

SELECT
CASE
WHEN TIPI IS NULL THEN 'HERHANGI MUSTERİ TIPI'
END AS TIP .........

SQL komutlarını ne kadar etkin biçimde kullanırsanız yazacagınız program o kadar hızlı ve zahmetsiz olur. SQL bize bir çok nimet sunmakta gerisi sizin ihtiyaçlarınıza ve yeteneklerinize kalmış.

Bir sonra ki yazıda görüşmek üzere...

SqlDataReader ve SqlDataAdapter Kardeşliği

Merhabalar bu yazımda da SqlDataReader ve SqlDataAdapter kardeşliği yani birlikde kullanımını inceleyecegiz.

Bilindigi gibi sorgu sonuçlarını döndermek için iki tane yöntem var SqlDataReader ve SqlDataAdapter . Kısaca bilgi verecek olursak SqlDataAdapter daha kullanışlı olsada SqlDataReader ileri yönlü okuma yaparak daha hızlı sonuç dönderir. Kullanım amacına uygun olarak iki yöntemden biri seçilebilir. Peki ya iki yöntemde aynı anda kullanılması gerekirse işde bu durum makalenin konusunu oluşturuyor.

Şimdi biraz kod yazalım.

Projenize birtane buton koyarak aşagıdaki kodları yazın.


Burda bütün satırları tanıyorsunuz.

SqlConnection sqlCon = new SqlConnection("Server=.;Database=TEST;Uid=sa;Pwd=123");
SqlCommand mCommand = new SqlCommand();
mCommand.Connection = sqlCon;
sqlCon.Open();
mCommand.CommandText = "Select * from YMusteri";

bu kısıma kadar her ikisi içinde ortak kodlar.

SqlDataReader dr = mCommand.ExecuteReader();
while (dr.Read())
{
listBox1.Items.Add(dr[0].ToString());
}

Şuana kadar ki kodlarımız SqlDataReader içindi.

dr.Close(); burda dikkat edilmesi gereken asıl nokta bu datareader nesnesi kapatmanız gerekir yoksa zaten veri okur durumda oldugunuz için dataadapter veri okuyamaz sıranın oan gelmesi için datareaderi kapatmanız gerekir.
dr.Dispose(); Madem ki dataReader ile işimiz bitti ozaman bellektende silelim.

SqlDataAdapter adp = new SqlDataAdapter(mCommand);
DataTable dt = new DataTable();
adp.Fill(dt);
dataGridView1.DataSource = dt;

veee mutlu son...

Bir sonra ki yazımızda görüşmek üzere...

Stored Procedure ve Output Parametre Kullanımı

Bu yazımızda da kısaca hem Stored Procedure kullanımını hemde procudereler içinde output parametresini nasıl kullanırız bunları ögrenicez.

Stored Procedureler konusunda detaylı araştırma yapmanız gerekiyor. Ama herşeyden önce konu ne olursa olsun bol örneklerle kendinizi problem çözer yeteneklere ulaştırmanız gerekiyor. Özelliklede Stored Procedure konusunda bol bol örnek yapmazsanız malesef çok ilerleyemezsiniz.

Peki Ama Neden Stored Procedure ?
Kısaca Stored Procedure kullanım amaçlarında bahsedecek olursak eğer ;

*** Stored Procedureler Server tarafında derlenip çalışıp sonuçları yolladıgından programınızın hızı konusunda önemli etkendir. Bu bile Stored Procedure kullanmak için yeterli bir sebeptir.
*** Aynı sebepten dolayı kaynakları daha az tükettiği için Network ağınızıda yormamış olur.
*** Projenizde kod kalabalıgınız azaltır. Modüler yazmaya yardımcı olur. Herhangi bir değişlik gündeme geldiğinde projenizi açıp kodları değiştirmekden yerine sadece ilgili procedure üzerinde değişiklik yaparak güncellemeyi halletmiş olursunuz. Diğer türlü kodları açıp gerekli değişiklikleri yaptıkdan sonra tüm kullanıcılarda tekrar aynı değişiklikleir dağıtmanız gerekir. Kullanıcıların tamamı aynı bina yada aynı şehirde olmaya bilir tüm şehirlere bağlanmak yada tek tek dolaşmanın maliyetini ve zaman kaybını siz düşünün. En sevdginiz arkadaşınız evlenirken siz o gece başka bir şehirde kös kös oturmuş güncellemeleri yapıyor olabilirsiniz (!! ihtimal tabi)

Bunlar belli başlı Stored Procedure kullanım amaçları daha birçok sebepten dolayı Stored Procedureler kullanılabilir. Ama dikkat edilemesi gereken bazı şeyler var nerde zaman Stored Procedure kullanılması gerektigini iyi kestirmek gerek olura olmaza S.P yazılmaz.


Bu kadar bilgiden sonra artık kod yazılımda keyfimiz yerine gelsin.

İşe önce bir tablo oluşturmakla başlıyoruz.

CREATE TABLE [dbo].[Musteri]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[ADI] [varchar](50) NULL,
[SOYADI] [varchar](50) NULL,
[BAKIYE] [float] NULL
)
ON [PRIMARY]


Sıra geldi Procuderimiz oluşturmaya;
Burdaki en önemli kısım @ADI ve @SOYADI parametrelerinin yönünün Output olması.

Output parametreler işlemler sonucu elde edilen sonucları geriye döndürmek için kullanılır.

SP ler bir deger döndürebilirler ama dönmesi gereken sonuç birden fazlasaysa Output kullanmanız işinizi kolaylaştırır.
C# da ki out anahtarıyla aynı amaç için kullanılır.

Not: Alter Proc Musteriler komutuyla değişiklikleri kaydedebilirsiniz.

Create Proc Musteriler
@ID int,
@ADI varchar (50) output, <--
@SOYADI varchar (50) output<--
As
Select @ID=ID, @ADI=ADI,@SOYADI=SOYADI From Musteri Where ID=@ID

--parametre olarak aldıgımız @ID ye göre arama yaptık dönen sonuçları @ADI,@SOYADI output parametreleriyle geri döndürdük.

Şimdi de sıra geldi C# kodlamaya;

Gerekenler; 1 buton 3 textBox
projemize using System.Data.SqlClient; ad uzayını eklemeyi unutmuyoruz

devammmmm....

private void button1_Click(object sender, EventArgs e)
{
string conSrt = String.Format("Server={0};Database={1};Uid={2};Pwd={3}", ".", "Test", "sa", "123456");
SqlConnection sqlCon = new SqlConnection(conSrt); //Bağlantımızı oluşturduk.
SqlCommand cmd = new SqlCommand("Musteriler", sqlCon); //Hangi Procedure yi kullanıcagımızı belirtiyoruz. Musteriler bizim S.P adımızdı
cmd.CommandType = CommandType.StoredProcedure; //Komut tipimizde StoredProcedure kullanacagımızı belirtiyoruz.
cmd.Parameters.Add("@ID", SqlDbType.Int); //Parametrelerimizi ekliyoruz
cmd.Parameters.Add("@ADI", SqlDbType.VarChar, 50);
cmd.Parameters.Add("@SOYADI", SqlDbType.VarChar, 50);
cmd.Parameters["@ID"].Value = Convert.ToInt32(textBox1.Text); // Arama yapacagımız ID noyu içeri yolluyoruz. Procedurede tipimiz int oldugu için int tipine Convert etmemiz gerekiyor.
cmd.Parameters["@ADI"].Direction = ParameterDirection.Output; //Parametremizin akış yönünü belirtir.Hatırlasınız bu iki parametreyi output parametre verdiğimişdik
cmd.Parameters["@SOYADI"].Direction = ParameterDirection.Output;
sqlCon.Open(); // Tüm hazırlıklar tamam olduguna göre artıkbağlantımızı açalım
cmd.ExecuteNonQuery(); // komutu çalıştırdık
textBox2.Text = cmd.Parameters["@ADI"].Value.ToString(); //Sonuçları textBoxlara atalımtextBox3.Text = cmd.Parameters["@SOYADI"].Value.ToString(); // Sonuçlar object tipinde geldiği için ToString() metodunu kullanarak string e çevirmeniz gerekir.

}

Her zaman ki gibi amacımız kabaca konuyu anlatmak detaylar sizin ihtiyaçlarınıza göre şekillenecektir.

İyi çalışmalar...

Wav Uzantılı Ses Dosyası Çalma

Bu yazımızda da wav uzantılı ses dosyalarını nasıl çalabilir soruna yanıt arıcaz. Lazım olursa eğer sistem kaynaklarında ki varsayılan durum seslerini nasıl kullanacaz sırayla inceleyelim.

Bu anlatamgımız sınıf sadece wav uzantılı dosylar çalar. mp3 v.s ses dosyalarını çalmak için uygulanması gereken yol başka onuda başka bir yazımızda ayrıca işleriz.
Kullanacagımız sınıfımız;
using System.Media; ad uzayı içinde yeralır. Ben kullanmadım ama bilginiz olsun.

Dışardan bir ses dosyası çalmak için;

System.Media.SoundPlayer calKemanci = new System.Media.SoundPlayer(@"C:\pegdisc.wav");

calKemanci.PlayLooping(); // siz durduruncaya kadar aynı sesi çalar.

calKemanci.Play(); //Bir kere çalar

calKemanci.Stop(); // durdurur

if (calKemanci.IsLoadCompleted) // Çalma işlemi bittimi ona bakar
MessageBox.Show("bitti");

Sistem Kaynagını kullanmak için;

Mesajkutusunda ki sesleri kulanabilirsiniz onun dışındaki sesler zaten wav uzantılı olarak sistem içinde buluyor.

System.Media.SystemSounds.Asterisk.Play();
System.Media.SystemSounds.Exclamation.Play();

Sesler tanıdık gelecektir zaten açıklamaya gerek yok...


Sistem kaynaklarını kullanmak ve dışardan ses dosyalarını çaldırmak için yapılmasu gerekenler bu kadar. Bunları nerelerde kullanabileceginiz size kalmış zaman içinde mutluka bi yerlerde yazılımınız için sesli uyarı yada hata mesajları verdirmek isteyeceksiniz;)

Şimdilik bu kadar bi sonra ki yazmın ne olacagını bende bilmiyorum. :D
O zamana kadar görüşmek üzere Hoşcakalın...

Resimi Pixel Pixel Renklere Ayırmak

Bu yazımda resim üzerinde gezinirken farenin bulundugu pixel deki rengi yakalamak için yapılması gerekenleri anlatacagım.
Öncelikle formumuzun üzerine resimi picturebox a yüklemek için 1 adet buton, resmi göstermek için 1 adet picturebox, yakalanan renk kodunu göstermek için 1 adet label eklemeniz gerekiyor.

Bahsettigim gibi resim üzerinde fare ile gezinirken üzerinde oldugumuz pixel rengini formun zemin rengine atayacaz.

GetPixel() metoduyla aktif pixel rengini alırken, SetPixel() metoduylada rengini değiştirebiliriz.

Sıra geldi kodlamaya;


Bitmap btm; // Öncelikle işe bir tane Bitmap deişken tanımlayarak başlıyoruz.
private void button1_Click(object sender, EventArgs e)
{
btm = new Bitmap(@"C:\CC.jpg");
pictureBox1.Image = btm; // Picturebox ımıza resmimizi yükledik
}

pictureBox nesnesinin üzerinde fare ile gezindikce aşagıda ki kodlar tetiklenecektir.

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (btm != null) //Resim yüklememişse hata verir.
{
try
{
Color color = btm.GetPixel(e.X, e.Y); // Olayın koptugu satır. Bize aktif pixselin rengisini veren kod satırı

this.BackColor = color; //Yaklanan renk formun zengine atandı.
label1.Text = color.Name;
}
catch {}
}
}

String.Format()

Bu yazımızda string ifadeleri formatlama olayına kısaca giriş yapacagım. Daha öncede belirttiğim gibi burda bu kodların en yalın en temel hallerini anlatıyorum. Araştırıp detaylandırmanız gerektigini biliyorsunuz. Amacımız beyinlerde küçükde olsa bir kıvılcım çakmak.

String ifadeler değişik şekillerde formatlanabilir olsada sadece bu amaçla oluşturulmuş bir fonksiyonumuz var String.Format()

Genel Kullanımı : { index[,alignment][:formatString]} şeklindedir.

Ençok kullandıgımız yöntemler için basit bi kaç örnek yapalım.
Kullanacagımız değişkenlerimizi tanımlıyoruz

string veri = "fatih";
double para = 12.52;
DateTime tarihSaat = DateTime.Now;
string sonuc = "";

sonuc = String.Format("Üretici Adı: {0} {1} {2}", "ahmet", "mehmet", "deneme");
MessageBox.Show(sonuc);

Burda "{0} {1} {2}" yerlerine " " (çift tırnaklar) dışındaki virgülden sonra gelecek
ifadeler yani "ahmet", "mehmet", "deneme" degerleri gelecek demektir.
Sonuç şu şekilde görünür "ahmet mehmet deneme"

En basit haliyle Metodumuzu kullandık. Burda bir formatlama işlemi yapmadık şu akla gelebilir neden Formatlama yapmadıysam bu fonksiyonu kullanayım ki? Evet ama bu şimdi formatlamadıysak hiç formatlamıcaz anlamına gelmiyor. Değişen şartlara göre bizden bu ifadenin formatlanması istenebilir butür olaylara hazırlıklı olmak adına kod blogunu değiştirmeden formatlayabilmek için kullandık. Amaç mimari yazılıma doğru kaymak.

sonuc = String.Format("{0:c}", para);
Para için Sonuc: 12.52 TL yerel parabirine göre birim atar.

sonuc = String.Format("{0:(##).(###)}", para);
Özel Format standart olmayan duruma özel format tasarımı için örnek

sonuc = string.Format("{0:M}", tarihSaat);
Tarih den Gün - Ay (14 Aralık) Şeklinde çok daha fazlası var sadece tarih işlemlerindede kullanılabilecegini göstermek için kullanadım.

Umarım faydalı olmuşdur.

Çok daha fazla detay için:
Kaynak: http://www.csharpnedir.com/articles/read/?id=486&title=String.Format%20Fonksiyonu

ListView Kullanımı

Bu yazmızda da sevdiğim bir nesne olan listView ' i anlatmak istiyorum.
Programlarınıza değişik bir hava katıyor tavsiye ederim az da olsa dataGridView kontrolüne göre zahmetli sayılabilir. Burda anlatılanları kabaca kontrol hakkında bilgi sahibi olabilmeniz için yazdım siz daha geliştirebilir ve benimlede paylaşabilirsiniz. Bu kada geyik yeter diyor ve kodlamaya geçiyorum :)
Öncelikle lisView e 3 tane kolon eklemeniz lazım. (isterseniz kodla yapabilirsiniz)

int i = 0;
Bu metod bizden 1 tane görsellik ayarlarını yapmak için listView nesnesi istiyor. Proje içinde çokca kullanacagımızı var sayarsak bu metod işleri hızlandırabilir. Bütün bunları ve daha fazlasını properties ekranından da yapabilirsiniz.

Satır satır açıklayalım biz nerde ne yaptık..

private void ListeDuzenle(ListView _listView)
{
_listView.View = View.Details; //listview in liste şeklinde görünmesi için kullandık.
_listView.Columns[0].Width = 50; // Kolon Genişliğini ayarladık.
_listView.Columns[1].Width = 150; //Kolon isimleride kullanılabilir.
_listView.Columns[2].Width = 150;
_listView.FullRowSelect = true; // Tüm satır seçilmesi için.
_listView.MultiSelect = false; //Birdeb fazla satır seçilemesin diye. Silme vs. işlerde lazım olacak.
_listView.GridLines = true; //Grid çizgileri görünsün istiyorum.
_listView.HideSelection = false; // !!! Normalde listview seçili satırdan (nesneden) ayrıldıgınız zaman seçim olayı kalkar. Biz bunun önüne geçmek için bu özelligi kullandık. Artık nesneden ayrılsanızda arkada gri bir renk bırakır.
}

//Yeni item ler eklediğimiz kısma geldik. Ben burda olayı göstermek için adımı ve web adresimi yazmakla geçiştirdim siz database işlemlerinde de sorgudan dönen degerleri sıkıntı çekmeden ekleye bilirsiniz.

private void btnEkle_Click(object sender, EventArgs e)
{
ListViewItem lstItem = new ListViewItem(); // Yeni bir item tanımladık. Artık item mimiz bu şekilde anılacak.
++i;
lstItem.Text = i.ToString(); // !!! Burdada SubItems.Add() kullanırsınız. 1. kolonun boş oldugunu görürsünüz.
lstItem.SubItems.Add("Fatih UYDURAN"); // SubItems lerimizi eklemeye başladık.
lstItem.SubItems.Add("http://www.artilogo.net");
listView1.Items.Add(lstItem); //Eklediğimiz SubItemleri listView nesnemize ekliyoruz.
}

Sıra geldi eklenen satırlardan silme işlemine

private void btnSil_Click(object sender, EventArgs e)
{
if (listView1.SelectedIndices.Count > 0) //Secili satır varmı yokmu kontrol ediliyor.
listView1.Items.RemoveAt(listView1.SelectedItems[0].Index); //Seçili satırın index i ni yakalayarak satırı sildik.
}
private void Form1_Load(object sender, EventArgs e)
{
ListeDuzenle(listView1); //listview in görünüm ayarlarını yapsın diye metodu çagırdık.
}
private void btnTemizle_Click(object sender, EventArgs e)
{
listView1.Items.Clear(); //listview i boşalttık.
}

Sıra aramada e kadar kayıt var arama olmalı mutlaka.

private void btnAra_Click(object sender, EventArgs e)
{

for (int i = 0 ; i < listView1.Items . Count ; i + + )

{
if (listView1.Items[i].SubItems[1].Text==txtAra.Text)
{
listView1.Items[i].ForeColor = Color.Blue; //Aynıymış ozaman buldugumuz belli olsun işaretleyelim. Yazı rengini mavi yaptık.
listView1.Focus(); // !!! Satırı seçebilmek için nesne üzerine odaklandık. Yoksa alttaki komut iş görmeyecekti. Hata vermezdi ama işlevini yerine getiremezdi.
listView1.Items[i].Selected = true; //Üzerinde oldugumuz satırı seçtik.
break; // !!! Diğer satırları boş yere dolaşmayalım diye döngüden çıktım. Farklı amaçlar için çıkılmayada bilir. Mesela buldugu tüm değerleri işaretlesin yazı rengini mavi yapsın diye.
}
else
{
listView1.Items[i].ForeColor = Color.Empty; //Bir önceki aramada mavi olarak işaretlen değer varsa şimdiki aramayla karışmaması için rengi kaldırdık.
}
}
}

lisview burda en basit haliyle konunun kavrana bilmesi için bu şekilde anlatıldı. Haliyle çok daha detayı var kullanım amacına göre detayladırılabilir.
Umarım faydalı olmuşdur.

String Metodları (String ifadeler üzerinde işlemler)

string str = "fatih"; Tüm işlemleri bu deger temel alınacak.
String boşmu ???
if (String.IsNullOrEmpty(str)) //String ifade Boşsa true dönderir
{
MessageBox.Show("Alana String Bir Deger Giriniz.");
return;
}
String ifadeler Aynımı (Karşılaştırma-1)
*** İnceleyiniz-> String.Compare(strA,strB);
if (str.CompareTo("fatih") == 0) // Aynı ise 0 degilse -1 degeri dönderir.
{
MessageBox.Show("Girilen String Degerler Aynı");
}
else
{
MessageBox.Show("Girilen String ifadeler Farklı");
}
String ifadeler aynımı (Karşılaştırma-2)
*** İnceleyiniz-> String.Equals(strA, strB);)
if (str.Equals("fatih")) //Degerler aynıysa true dönderir
{
MessageBox.Show("Degerler Aynı");
}
else
{
MessageBox.Show("Degerler Farklı");
}
String ifaden belirlenen harflerle başlıyormu ???
if (str.StartsWith("f")) // Başlıyorsa true dönderir
{
MessageBox.Show("Evet");
}
else
{
MessageBox.Show("Hayır");
}
String ifadenin belirlenen harflerle bitiyormu ???
if (str.EndsWith("h")) //Bitiyorsa true d”nderir
{
MessageBox.Show("Evet");
}
else
{
MessageBox.Show("Hayır");
}
Sisteminize e-posta kaydı alıyorsunuz ve sunucunuz. örnk. yahoo desteklemiyor. yahoo.com ile biten e-posta hesaplarını kontrol edip kullanıcılara uyarı verebilirsiniz.

String den parça alma
Kullanımı : string.Substring(BaslangicIndex, BitisIndex);
MessageBox.Show(str.Substring(1, 3));
Sonuç : "fatih" ifadesi için "ati" olarak döner

String ifadenin belilenen kısmını silmek
String.Remove(BaslangicIndex, BitisIndex);
MessageBox.Show(str.Remove(2, 3));
Sonuc : "fatih" ifadesi için "fa" olarak döner.

String ifadenin belirlenen kısmını yada tamamını yeni degerle degiştirmek
Kullanımı : String.Replace(ArananEskiDeger,YeniDeger)
MessageBox.Show(str.Replace("f", "F"));
*** Girilen isimlerin baş harflarini büyük almak isteye bilirsiniz butür durumlarda işinizi görür.
Sonuç : "fatih" ifaderisi için "Fatih" olarak dönderir.

Verilen karakteri String ifade işinde arar ve buldugu index numarasını geriye dönderir.

MessageBox.Show(str.IndexOf("i").ToString());

*** "fatih" ifadesi işinde "i" harfi 4 sırada oldugu için dönderecegi int deger 3 tür.
Neden 4 ncü sıradaki deger 3 dönderiyor diye bir soru oluşabilir. Cevap indexler 0 dan başladıgı için..


Örnek Uygulama:

e-posta adresinde @ işaretinden sonraki uzantıya aldık.
Böyle birşey ne için kullanılabilir. insanlar sisteminize (bu web yada desktop uygulamanız olabilir) e-postalarını kaydettikce bunu bir uzantı havuzu oluşturarak tutabilir bir sonra ki kullanıcı kaydında otomatik olarak listenize eklenmesi saglanabilir. bknz: Kullanıcı Dostu AutoCompleteSource yazımızla birleştirebilirsiniz.
string str = fatih@artilogo.net;

string sonucStr = "";
int Index=0,uzunluk=0;
if (str.IndexOf("@") == -1)
{
MessageBox.Show("Uygun E-posta adresi De§il");
}
else
{
Index = str.IndexOf("@")+1;
uzunluk = str.Length-Index;
sonucStr = str.Substring(Index, uzunluk);
MessageBox.Show(sonucStr);
}

DataView RowFilter

Bu yazımızda SQL de ki viewlere karşılık gelen DataView sınıfını inceleyecez. DataView tıpkı sql de ki View ler gibi belli kriter grupları oluşturularak veri çekilmesini sağlar. Datatable üzerinde çalıştıgı için sizi kaynaklarını boş yere kullanmakdan kurtarır buda performansı olumlu yönde etkiler.

DataView sınıfının RowFilter Özelliği sql deki where komutunun birebir destekler.
Where komutunda kullandıgının her şartı RowFilter da da kullanabilirsiniz.

Sıra geldi kodlamaya;

DataTable dt = new DataTable();

//Gerekli metodumuz
private DataView dtViewFilter(string filtre)
{
DataView dv = new DataView(dt);
dv.RowFilter="AD LIKE '" + filtre + "%'";
return dv;
}

// Metodun kullanımı..
private void textBox1_TextChanged(object sender, EventArgs e)
{
dataGridView1.DataSource = dtViewFilter(textBox1.Text);
}

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();

Unutmayım Diye Yazıyorum

Söz uçar yazı kalır... Yazınız... Hele yazılımcıysanız zaten kaçış yok. Burda nacizane kodlarımı yazıcam heryerde herkesin yaptıgı gibi yogun class delegate oop kuralları vs. şeyler olmayacak zaten nette yeterince var arkadaşlarımızın ellerine sağlık. Onun yerine daha çok boş kaldıkca yada bir şeyleri ilkkez bakalım nasıl oluyor derken yaptıgım örneklerden olacak. Bu açıdan bakıldığında yeni başlayan arkaşlar için küçük bir kıvılcım çakar umudu taşıyorum....