C# Environment Sınıfı Kullanımı



Arkadaşlar merhaba bu yazımızda hayli işe yarayan Environment Class ını inceleyeceğiz.

Bu sınıf adında anlaşıldığı gibi Environment Variables yani Ortam Değişkenleri adı verilen bilgilere ulaşmanın en kısa yoludur.
Peki ortam değişkenleri denildiğinde ne anlamalıyız.
Bunlar resimde de gördüğünüz yazılımlara sistem path leri ve parametreleri hakkında bilgi veren, işletim sisteminin neyi nerede barındıracağı bilgisini tutan değişkenlerdir. Örnek olarak TEMP klösörü, Desktop vs... nerede gibi daha bir çok bilgi içerir.
Burada değişken denilmesinde ki sebep gerçekten değiştirilebilir yani eklenebilir silinebilir ve değiştirebilir olmasıdır. Özel sebeplerden dolayı sistem yönetici bu değişikliğe gidebilir.
Bu ekrana da Win8 için Bilgisayarım/Özellikler/Gelişmiş sistem ayarları/Ortam değişkenleri yolunu izleyerek ulaşabilirsiniz.



















İsterseniz şimdi makalenin konusu olan .Net (C#) içerisinden bu bilgileri nasıl ulaşabiliriz ona bakalım.

İşimiz çok kolay System namespace altında bulunan Environment Sınıfını işe dahil etmek yeterli.
Bu sınıf static olduğu için herhangi bir instance almaya gerek yok direk kullanabiliriz.
Peki bize hangi bilgileri veriyor açıklayarak sıralayalım.

  Environment.CommandLine; //Uygulanın çalıştırıldıgı komutsatırı
  Environment.TickCount//Sistem başladığından beri geçen milisaniye sayısı
  Environment.StackTrace//Uygulama çalıştırıldıgında oluşan StackTrace dediğimiz bilgileri verir. Bu bilgiler aynı zaman da visual studia ekrana yansıyan hatalarda ki StackTrace bilgisidir.
   Environment.SystemDirectory; //Sistem dizinin tam yolunu (C:\Windows\system32) verir.
   Environment.UserDomainName//Kullanıcı Domain Adı.  
   Environment.Version//CLR versiyon numarası
   Environment.OSVersion.VersionString; //İşletim sistemi 
   Environment.UserName//Kullanıcı adı
   Environment.MachineName; //PC adı
   Environment.CurrentDirectory; //Uygunlamamnın çalıştıgı aktif klasör yolu
   Environment.ProcessorCount//Çekirdek sayısı

Environment.SpecialFolder Enum unu kullanarak bir çok özel klasöre erişebilirsiniz.
Ben hepsini tek tek sıralama gereği duymadım ne oldukları zaten açık.
Örnek olarak ;
Environment.GetFolderPath(Environment.SpecialFolder.Desktop); //Masaüstü yolunu verir.

Ayrıca;

Environment.SetEnvironmentVariable("değişken", "değer"); ile değişkenlere değiştire bileğinizi belirtmek istiyorum. Ben bu metodu hiç kullanmadım dip not olarak vereyim.

Faydalı olması dileğiyle...



C# Tarih Fonksiyonları



Merhabalar aslında bu makaleyi yazarken amacım hangisi nedir yerine bu metodların ihtiyaç durumlarına göre kullanımlarına  örnekler vermekti. Ama konu o kadar geniş ki bunu daha sonra ki bir zamana erteleme kararı aldım. Ee başlamışken birşeyler anlatarak konuya girmiş olalım.

DateTime dt = DateTime.Now;
DateTime dt2=new DateTime(2011,1,1);

İki tarih arasında ki farkı bulmak:
İki tarihideki fark Subtract() metoduyla bulunur ve TimeSpan tipinden değer döndürür.

TimeSpan tSpan = dt.Subtract(dt2);

İsterseniz TimeSpan olarak dönen değerle şimdi neler yapabiliriz inceleyelim.
Aşagıdaki örneklerde farkı gün saat gibi int tipinden alabildiğimizi görüyoruz.

tSpan.Days;
tSpan.Hours;
tSpan.Minutes;
tSpan.Seconds;

belli başlı özellikleri ele aldık eğer inceleresenizdaha fazlası oldugunu göreceksiniz.

Tarihin belli bölümlerini alabiliriz.

dt.Day; Tarihin gün değerini int tipinden döndürür
dt.Month; Tarihin ay değerini int tipinden döndürür.
dt.Year; Tarihin yıl değerini int tipinden döndürür.

Saat dakika saniye cinsinden properties lerin oldugunu artık söylemeye gerek yok sanırım.

Tarih ekleme çıkarma:

dt.AddDays(1); Güne 1 ekledik
dt.AddDays(-1); Gün degerini 1 eksilttik yani düne gittik
dt.AddHours(1); Saate 1 ekledik
dt.AddHours(-1); Saati 1 eksilttik
Ay, yıl, dakika, saniye gibi işlemleri kendiniz deneyebilisiniz.
Sizde fakedeceksiniz ama yinede değinmeden geçmiş olamayalım. Saniye, dakika, gün gibi özeliklere yapılan ekleme ve çıkarmalar direk olarak eğer gün ise tarihin yıl kısmınıda etkileyecektir. Yani 31.12.2010 tarihine 1 gün eklerseniz 01.01.2011 tarihine dönecektir. Aynısı dakika, saat gibi özellikler içinde geçerlidir.

Tarih Formatlama :

Zaman zaman tarihleri farklı formatlarda almak isteriz. Şimdi bunu nasıl yapabiliriz inceleyelim. Uygulanan formatlar ve döndürdükleri string degerler aşağıda yanyana gösterilmekte.

dt.ToString("t");  23:29
dt.ToString("r");  Wed, 04 May 2011 23:29:09 GMT
dt.ToString("T");  23:28:30
dt.ToString("m"); 04 Mayıs
dt.ToString("G");  04.05.2011 23:26:10
dt.ToString("g");  04.05.2011 23:25
dt.ToString("F");  04 Mayıs 2011 Çarşamba 23:24:42
dt.ToString("f");  04 Mayıs 2011 Çarşamba 23:24
dt.ToString("D");  04 Mayıs 2011 Çarşamba
dt.ToString("d");  04.05.2011
dt.ToString("yyyy.MM.dd"); 2011.05.04

Yukarıda uygulanan formatların tamamı String.Format() yönteminde de aynen kullanılabilir.
String.Format("{0:m}", dt); 04 Mayıs

dt.ToLongDateString(); 04 Mayıs 2011 Çarşamba
dt.ToShortTimeString(); 23:19
dt.ToShortDateString(); 04.05.2011
dt.ToString(); 04.05.2011 23:17:08

Başta da dediğim gibi geniş bir konu. İhtiyaça göre bu anlatılan özellikler birçok faklı şekilde kullanılabilir.
Başlangıç için umarım faydalı olmuştur.

Using Kullanımı ve Otomatik Dispose()

Merhaba;
Bu makalemizde Using ifadesi kullanımı, nasıl çalıştığını ve bellek yönetimine katkısını incelemeye çalışacagız.

Yazılımda performans ve bellek yönetiminin önemini biliyoruz. Küçük çaplı projelerde .Net CLR (Common Language RunTime) sayesinde kodları çalıştırmak
ve bellek yönetimini otomatik olarak yapma görevini üstlensede büyük çaplı, verilerin yoğun aktığı bir projede bellek yönetimini mümkün olduğu kadar elimizde tutmamız gerekir. CLR de bu görevi GC (Garbage Collector) mekanızması sayesinde yerine getirmektedir.

Bilindiği gibi kod tarafında oluşturulan referans tipler için bellekte heap bölgesinde alan tahsis edilir ve işi bittikden sonra bellekten atılırlar ama bellekten atılma süreleri belirsizdir.

Belirsiz dedik çünkü GC nin ne zaman çalışacağı belli değildir. (Kendi içinde mutlaka bir mekanizmaya bağlıdır.)

Direk şu fikir akla gelebilir ozaman bizde GC yi görev başına çagırırız! Evet bu da bir yöntem ama sadece gerçekten gerektiğinde kullanılması gerekir. Çünkü sık sık GC kullanmak performans kaybına neden olur.

Ayrıca oluşturulan nesnelere null değeri atamak o nesneyi bellekten atmaz sadece üzeri kapatılarak erişilmez hale getirir ama arka tarafta bellek alanında var olmaya devam eder.

Ozaman ne yapılmalı ?
IDispose arayüzünden implemente edilmiş Dispose() metodu kullanmalı.

Kullandığımız bir çok nesne Dispose() metoduna sahiptir ve tamamıda IDispose interface inde kalıtım yoluyla geçmiştir.

İsterseniz şimdi kısa bi örnek ile ilerleyelim.

SqlConnection sqlCon = null;
SqlDataAdapter adp = null;
try
{
sqlCon = new SqlConnection("Server=.;Database=AdventureWorks;Uid=sa;Pwd=1234");
adp = new SqlDataAdapter("Select * From Production.Product", sqlCon);
adp.Fill(dt);
}
catch (Exception ex)
{
throw new Exception ("hata", ex);
}
finally
{
sqlCon.Close();
adp.Dispose();
sqlCon.Dispose();
}

Görüldüğü gibi finally blogu her durumda çalışağı için SqlDataAdapter ve SqlConnection nesneleri Dispose işlemine tabi tutulmuşlardır.

Buraya kadar anladık ama using bunun neresinde diyebilirsiniz. Şimdi sıra bunun cevabını vermeye geldi.

using anahtarı uyğuladıgınız sınıflarda otomatik olarak dispose çalıştırır.
Yani bunun anlamı finaly blogunda ayrıca adp.Dispose(); şeklinde metoduğu çagırmanıza gerek kalmaz using bizim için bunu yapar demektir.

usin ifadesi nesnenin yaşam sürecini belirtir.

using(SqlCommand cmd=new SqlCommand("Select * From Production.Product", sqlCon))
{
// işlenen komutlar
// SqlCommand yaşam alanı
}

Örnekte bakacak olursak SqlCommand yaşam alanı { } arasında son bulacaktır. Otomatik olarak Dipose() uygulanmış olur.

Çok kullanıcılı bir programda bunun ne kadar önemli oldugunu tahmin edersiniz.

Sizlerde geliştirdiğiniz sınıflara aşagıda ki örnegi uygulayarak usin ifadesiyle otomatik dispose a tabi tutabilirsiniz.

class MyClass:IDisposable
{

public void Dispose()
{
//Dispose kodlarınız...
GC.SuppressFinalize(this);
}
}


Umarım faydalı olmuştur...

C# Condition Kullanımı (?:)

Merhabalar;

Blogun tarzı geregi lafı çok uzatmak istemiyorum ama
bi kaç uyarı yapmadan da geçemeyecegim.

Geliştirdigimiz kodlarda asıl amaç çalışması olsada, zaman içinde gelişen ve kalabalıklaşan kod yıgınları için önceden önlemini alıp ona göre bir mimari oluşturmak gerekiyor. Bunun için mümkün oldugu kadar OOP tarafına kaymanızı tavsiye ederim.
OOP a gitmeden önce çok farkına varmadıgımız ve işi kolaylaştıran Condition kullanımından bahsedicem.

Önce kodlarımızı bir inceleyin sonra açıklamasını yapalım



Dönen sonuç 5, den büyük oldugu için dönen sonuç false olacaktır
Hemen açıklamasını yapalım
Burda yapılan işlem şu 5, 3 den büyük ise true, değilse false sonuç dönderecektir.

Condition kullanmadan bunu yapmış olsak kodlarımız aşagıda ki gibi olacaktı.

if (5<3 sonuc=" false;">sonuc =false;


Genel kullanım şekli şöyledir:

(deger) ? dorgu ise : Değilse

deger doğru ise ? den sonra ki kısım, değilse : den sonra ki kısım çalışacaktır.

Farklı bir örnek daha verelim sanırım böylece daha net anlaşılacak

string deger=null;
string str = String.IsNullOrEmpty(deger) ? "Boş" : "Dolu";
MessageBox.Show(str);

Evet işin detaylarına gittikce ufkumuzun genişledigini ve daha az satırlarla çalıştıgımızı farketmişsinizdir.
(blogspot un yapısı yüzünden if else bloklarını vs. veremedim herşeye html hatası veriyor buna ragmen)

Umarım keyfli olmuşdur.


C# Klasör İçini Temizleme

Merhablar zaman zaman klasörlerimizin içini temizleme ya da bazı dosyaları silme geregi duya biliriz.
İşde size çözüm yolu

İşe başlamadan önce

using System.IO; eklemeniz gerektigini biliyorsunuz.

FileInfo fileInfo;
string uzanti = ".txt";

foreach (string dosya in Directory.GetFiles(@"C:\TEST"))
{
fileInfo = new FileInfo(dosya);
if (fileInfo.Extension == uzanti)
// Dosya Uzantısı ve sizin uzantınız aynımı ??
{
fileInfo.Delete();
}
}

Peki ya klasörün kendini silmek istersek

Directory.Delete("klasör konumu");
bu komutun 2 overload ı vardır

1. Klasör boşsa siler
Directory.Delete(@"C:\TEST");

Silmeden önce içinde bişiler varmı kontrolünü yapabilirsiniz.

2. Klasör dolumu boşmu bakmadan siler
Directory.Delete(@"C:\TEST",true);
Tabi olaylar bu kadar değil sanırım bu konuda makelemiz yok en kısa sürede telafi edelim
Şimdilik hoşcakalın...

richTextBox 'a Resim Ekleme

Merhabalar;

Yeteneklerine hayran kaldıgım iki companentten biri richTextBox diğeri ise DataGridView dir. DataGridView için ilerde çok detaylı yazılar yazıcam ama önce richTextBox nasıl resim eklenir onu görelim.


private bool pasteMyBitmap(string fileName)
{

// Open an bitmap from file and copy it to the clipboard.
Bitmap myBitmap = new Bitmap(fileName);

// Copy the bitmap to the clipboard.
Clipboard.SetDataObject(myBitmap);

// Get the format for the object type.
DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);

// After verifying that the data can be pasted, paste it.
if (richTextBox1.CanPaste(myFormat))
{
richTextBox1.Paste(myFormat);
return true;
}
else
{
MessageBox.Show("The data format that you attempted to paste is not supported by this control.");
return false;
}
}


Kaynak:http://http//msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.canpaste.aspx

Umarım faydalı olur.

Params Anahtar Kelimesi ile Sınırsız Sayıda Parametre Tanımlama


Merhabalar;

Birbirinin devamı niteliğinde olan metod tanımları şekillerini gördük. Sıra params anahtar kelimesi ile sınırsız sayıda parametre kullanma yöntemine.

Bildiginiz gibi daha önce anlatılan metodlarda önceden belirlenen sayıda parametre verilirken bu yöntemde istenilen kadar parametre girilebilir.



Bu işleme göre sonuç olarak çıkar.

Out Parametre Metod Kullanımı

Merhabalar;

Out parametresinde gönderilen değerler üzerinde işlemler yapılır ve aynı degerler uot parametresi ile geri aynı değişken üzerinden dışarı taşınır.

Daha detaylı örnekler için araştırma yapmanızda faydalar vardır.


Konuyu daha iyi kavramanız için out ve ref anahtar sözcüklerini araştırmanız daha faydalı olacaktır.
Konunun SQL karşılıgı için buraya bakabilirsiniz.
Bir sonra ki yazımızda görüşmek üzer mutlu kalın....

Overloaded (Aşırı Yüklenmiş) Metotlar

Merhabalar ;
Bu yazımızda Overloaded yani Aşırı yüklenmiş metodlar üzerinde duracağım.
Overloaded Metodlar nedir ne işe yararlar kabaca anlatalım, daha sonrada bir örnek yapalım.
Aşırı yüklenmiş metodlar adında anlaşıldıgı gibi aynı isimde farklı işleri yerine getiren metodlardır. Resimde DataTable nesnesinin 3 tane Overloaded metodu oldugunu görüyoruz.






Bir metod aşırı yüklenmesi için kesinlikle aynı isime sahip olmalıdır ve farklı tipde değer döndermeli yada farklı sayıda (yada tipde) parametre almalıdır. Yani bir birinin aynı olan metod hata verecektir.

Bu bilgiler ışığında kendi örnegimizi yapıyoruz.

Topla adında bir metod tanımlayalım ve bunu 3 aşırı yükleme yapalım.

// 2 para metreli 1. toplama metodumuz
private int topla(int sayi1, int sayi2)
{
return sayi1 + sayi2; // 2 sayıyı toplar tam sayı olarak geri dönderir
}
// 3 parametreli 2. toplama metodumuz
private int topla(int sayi1, int sayi2, int sayi3)
{
return sayi1 + sayi2 + sayi3; // 3 sayıyı toplar tam sayı olarak geriye dönderir
}
// 3 parametreli 3. metodumuz (dikkat ederseniz bu strin türünden parametre alır)
private string topla(string sayi1, string sayi2, string sayi3)
{
return sayi1 + sayi2 + sayi3; // 3 string paramereti alır string olarak geriye dönderir}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(topla(1,1).ToString());
MessageBox.Show(topla(1,1,1).ToString());
}
Geriye dönen degerler 2 ve 3 olacaktır.


Pekiii hemen akla şu soru gelecektir.

---string dönderen metodda 3 parametreli program nasıl anlayacak toplayacakmı yoksa bu stringleri birleştirecekmi??????

cevabı tabi gayet basit girilen bi ifadenin string olarak algılanması için " " (çift tırnak) içine alınması gerekir.

Hatırlayacagınız gibi 1 kendi başına int degeri taşırken "1" string olarak tanınacaktır.
Buna göre şöyle kullanılmalı;

MessageBox.Show(topla("1","1","1").ToString());

Dönen sonuç tabikide 111 olacaktır.

Konularımız biraz daha detaya doğru gidecek. Umarım buraya kadar anlatılanlar faydalı olmuştur.

Bir sonraki yazımda görünşüceye kadar mutlu kalın....

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.

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

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