17 Nisan 2009 Cuma

Asp.Net Validation


VALIDATION KONTROLLER

Validation Kontroller web sayfalarında önemli bir konu halini alan bilgi girişi ve bunların kontrollerini yapan kontrollerdir.
Kullanıcıların hatasız ve eksiksiz olarak formların doldurulmasını sağlayarak bilgi akışını kolaylaştırırlar. Bu kontroller Javascript veya DHTML kullanılarak da yapılabiliyordu. Fakat Asp.NET 2.0 bize sunmuş olduğu buvalidation sayesinde daha anlaşılır ve hızlı olmamızı sağlamaktadır. Bu kontrollerin çalışması için InternetExplorer 4 ve üstü olması gerekmektedir.
Bu kontrolleri genel olarak şu şekilde tanımlanırlar.
  1. Required Field Validator : Kontrol içerisine bir değer girilip girilmediğini kontrol eder. Atamış olduğumuz kontrol boş geçemez.
  2. Range Validator : Belirlediğimiz iki değer arasında kontrol eder. Örneğin yaş aralığı
    için kullanılabilir.
  3. Reguler Expression Validator : Karakter kontrolleri yapar. Mail adresinde @ işareti gibi kontrollerde kullanılır.
  4. Compare Validator : İki giriş kontrolü arasındaki değeri, tipini veya dosyanı eşitliğini
    kontrol eder.
  5. Custom Validator : Validation için kendi kodumuzu yazmaya izin verir.
RequiredFieldValidator
  1. İlk olarak RequiredFieldValidator kontrolünü kullacağız. Bunun için web sayfamıza birer adet textbox, button ve RequiredFieldValidator kontrollerini ekleyelim.
  2. RequiredFieldValidator kontrolünü tıklayalım ve properties penceresinden ErrorMessage özelliğini kullanarak hata mesajını “Bu alanı boş geçemezsiniz” olarak değiştirelim. Böylece kullanıcı hata yaptığında bu ileti çıkacaktır.
  3. Daha sonra ControlToValidate özelliğinden TextBox1 i seçiniz ve kodumuzu çalıştırınız. Eğer TextBox’ı boş geçerek butona basarsanız hata çıkacaktır (Şekil 3.3). Fakat TextBox’ımıza birşeyler yazıp butona bastığımızda hata mesajı kaybolacaktır.
RangeValidator
  1. Web sayfamızda birer adet textbox, button ve RangeValidator kontrolü yerleştirelim.
  2. RangeValidator kontrolü tıklayarak properties penceresinden ErrorMessage kısmına “0 ile 100 arası birsayı giriniz” mesajını yazınız.
  3. Daha sonra yine RangeValidator kontrolünün MinimumValue özelliğine “0”, MaksimumValue özelliğine ise “100” değerlerini yazınız.
  4. Değerleri girdikten sonra CompareToValidate seçeneğinden Textbox objenizi seçiniz. Seçtikden sonra kodumuzu çalıştıralım ve textbox a “200” gibi büyük bir rakam girelim. RangeValidation hata verecektir. Eğer siz aralık olarak iki tarih aralığı belirlemek istiyorsanız Range Validation’nın Type özelliğini Date yapmanız gerekmektedir.
RegularExpressionValidator
  1. Web sayfamıza birer adet textbox ve buton nesneleri yerleştiriniz. Textbox nesnemizin yanınada RegularExpressionValidator kontolunden koyalım.
  2. RegularExpressionValidator kontrolüne ait properties penceresinden ErrorMessage kısmına “Yanlış E‐Mail” yazısını, ContolToValidate seçeneğinden de textbox1’i seçiniz.
  3. Properties penceresinde bulunan ValidationExpression seçeneğinin tıkladığınızda karşımıza
    Regular Expression Editor penceresi gelecektir. Gelen seçeneklerden telefon numarası, e‐mail, web adresi,posta kodu gibi hazır kalıplar içermektedir. Biz be seçeneklerden Internet e‐mail address seçeneğini seçiniz.
  4. Burada textbox’a bilgi girişi yapıldığında “@” ve “ . ” işaretlerini kontrol edecektir. 
Kalıp değerler dışında kendimize göre giriş karakter kontrolü yaptırabiliriz. Regular Expression Editor penceresinde üstte Custom seçeneğini işaretleyerek Validation expression alana ifadeleri yazınız.
CompareValidator
  1. Web sitemize altalta iki adet textbox ve bir adet de buton koyalım. İkinci textbox ‘ımızın yanına CompareValidator kontrolü koyalım.
  2. CompareValidator kontrolünün properties penceresinde ErrorMessage yazısını “Aynı Değerler Giriniz”olarak değiştiriniz. Daha sonra ControlToCompare seçeneğinde textbox1’i, ControlToValidate seçeneğinde ise textbox2’i seçiniz.
  3. Daha sonra kodumuzu çalıştıralım. Textbox1’e ve Textbox2 kontrollerine aynı değerleri yazmamız gerekmektedir. Buradaki seçeneklerden ControlToCompare seçeneğinde TextBox1’i seçtiğimiz için kontrol bu nesne üzerinden olmaktadır.
Kontrolleri kullanarak Web formlarımızda kullanıcı hatalarını büyük oranda engelleyerek doğru bilgilerin gönderilmesini sağlayabiliriz.
Bu yazıyı hazırlarken, yazıları ve anlatımı derleme aşamasında Selçuk Özdemir' in Asp.NET 2.0 Kitabına başvurdum.

14 Nisan 2009 Salı

C# openFileDialog Kontrolü


Bu kontrol sayesinde kullanıcılar windows'un kullandığı ortak iletişim formlarını kullanarak dosya yükleme işlemlerini gerçekleştire bilirler. 

- openFileDialog.ShowDialog()

openDialog pencerisinin açılmasını sağlayan koddur. Bir butonun click olayına yazıldığında dosya windows'un bilindik dosya açma ekranı karşımıza çıkar.

private void button1_Click(object sender, EventArgs e)
    {
       openFileDialog1.ShowDialog();
                                                                                                                  }


- openFileDialog1.Title()

openFileDialog penceresinin başlığını belirler. openFileDialog1.ShowDialog() komutundan önce kullanılmalıdır. Çünkü pencere açıldıktan sonra Title' a değer atasanız bile formun başlığı değişmeyecektir.

 private void button1_Click(object sender, EventArgs e)
  {
  openFileDialog1.Title = "Lütfen Dozya Seçiniz";
  openFileDialog1.ShowDialog();
  }


- openFileDialog1.Filter()

openFileDialog penceresindesadece belirli uzantılı dosyaların listelenmesini istiyorsanız bu kodu kullanmalısınız.

  private void button1_Click(object sender, EventArgs e)
  {
  openFileDialog1.Title = "Lütfen Dozya Seçiniz";
  openFileDialog1.Filter = " (*.jpg)|*.jpg|(*.png)|*.png";
  openFileDialog1.ShowDialog();
  }

Burada sadece jpg ve png uzantılı dostaların listelenmesini istiyorum.

- openFileDialog1.FilterIndex()

Filtreleme yaparken varsayılan olarak hangisinin kullanılacağını belirler. Mesela openDialog penceresi ilk açıldığın varsayılan olarak belirlenen değer jpg ise önce jpg resimler çıkar.

  private void button1_Click(object sender, EventArgs e)
  {
  openFileDialog1.Title = "Lütfen Dozya Seçiniz";
  openFileDialog1.Filter = " (*.jpg)|*.jpg|(*.png)|*.png";
  openFileDialog1.FilterIndex = 1;
// varsayılan olarak jpg uzantıları göster
  openFileDialog1.ShowDialog();
  }


- openFileDialog1.InitialDirectory

openFileDialog penceresinin varsayılan olarak açılması istenilen klasörün yolunu belirler.

 private void button1_Click(object sender, EventArgs e)
  {
  openFileDialog1.Title = "Lütfen Dozya Seçiniz";
  openFileDialog1.Filter = " (*.jpg)|*.jpg|(*.png)|*.png";
  openFileDialog1.FilterIndex = 1;
  openFileDialog1.InitialDirectory="C:\\Documents and Settings\\Emrah\\Desktop\\blog";
  openFileDialog1.ShowDialog();
  }


- openFileDialog1.Multiselect

True değeri aktarılırsa openDialog penceresinde shift tuşuna basarak birden fazla dosya seçilebilinir.

private void button1_Click(object sender, EventArgs e)
  {
  openFileDialog1.Title = "Lütfen Dozya Seçiniz";
  openFileDialog1.Filter = " (*.jpg)|*.jpg|(*.png)|*.png";
  openFileDialog1.FilterIndex = 1;
  openFileDialog1.InitialDirectory="C:\\Documents and Settings\\Emrah\\Desktop\\blog";
  openFileDialog1.Multiselect = true;
  openFileDialog1.ShowDialog();
  }

- openFileDialog1.FileNames

seçilen dosyanın yolunu belirler. Mesela seçilen dosyanın yolunu bir textbox a yazdıralım.

private void button1_Click(object sender, EventArgs e)
  {
  openFileDialog1.Title = "Lütfen Dozya Seçiniz";
  openFileDialog1.Filter = " (*.jpg)|*.jpg|(*.png)|*.png";
  openFileDialog1.FilterIndex = 1;
  openFileDialog1.InitialDirectory="C:\\Documents and Settings\\Emrah\\Desktop\\blog";
  openFileDialog1.Multiselect = true;
  openFileDialog1.ShowDialog();
  foreach (string str in openFileDialog1.FileNames)
  textBox1.Text = str;
  }

13 Nisan 2009 Pazartesi

ASP.NET te En Basit INSERT Cümlesi

Bir yazılımda veri tabanı kullanıyorsak olmazsa olmazımız bu veritabanına veri eklemektir. Ben burada iki şekilde insert cümlesi yazmayı anlatmaya çalışacağım.

Birincisi en temel sayılan direkt yazılımın içine yazdığımız INSERT cümlesidir.


Veri Kaydetmek istediğimiz butonun altına aşağıdaki kodu yazıyoruz.

using System.Data.SqlClient; //Bunu eklemeyi unutmayın

SqlConnection con = new SqlConnection("server=.\\sqlexpress;database=databaseadımız;uid=varsakullanıcıadımız;pwd=varsaşifremiz"); //Connection cümlemizi yazıyoruz ve programın hangi veritabanına bağlanacağını ve varsa veritabanımızın kullanıcı adı ve şifresini belirtiyoruz.

string ekle = "insert into tblbilgileri(Ad,Soyad,Adres,Yas) Values ('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "')"; // Burada yazdığımız cümleyi direkt SqlDataAdapter içinede yazabiliriz. Ben  burada insert cümlesini bir string değişkene atayıp oradan SqlDataAdapter içine aldım. Siz dilerseniz bu string değişkenini tanımlamayıp, insert cümlesini direkt DataAdapterda yer alan ekle kısmına yazabilirsiniz.

SqlDataAdapter sadp = new SqlDataAdapter(ekle,con); // Daha Sonra bir DataAdapter belirliyoruz...

DataAdapter Nedir?

DataAdapter nesnesi Connected ve Disconnected bağlantı yapısı ile veri arasında köprü vazifesi görür. Veritabanınızdan çektiğiniz veriyi DataSetinize doldurmak yada DataSetinizde güncellenerek cachelenmiş verilerinizi veri kaynağınızda da güncellemek için istediğiniz zaman DataAdapter nesnesini kullanabilirsiniz. Güncelleme işlemlerini daha ileri konuları içeren makalelerimizde göreceğiz. Konuyu daha fazla dağıtmamak için şu anda bu nesnenin DataSet ile kullanımı ve veriye erişim konuları üzerinde yoğunlaşmalıyız.

Bilmeniz gereken bir-iki ufak ayrıntı da şunlar:
- DataAdapter Disconnected Data ile çalışmak için tasarlanmıştır.
- DataAdapter ve DataSet arasında direkt olarak bir bağlantı yoktur.

DataAdapter ile DataSete veri doldurulurken database bağlantısı kapalı ise açılır, dataset doldurulur ve işlem bittiği anda otomatik olarak kapatılır. Eğer bağlantı halihazırda açıksa herhangi bir hata vermeden işlemi yapar ve bağlantıyı kapatarak işlemini sonlandırır. Böylece bizlerin de fazla detayla uğraşmadan hızlıca işlemlerimizi yapmamızı sağlar.

Kullanımına gelince; Temelde iki adet argüman alır. Bunlardan birincisi DataSete doldurmak istediğimiz veriyi belirten “SELECT * from Nothwind” gibi bir SQL cümlesidir. Ikincisi ise bağlantıyı açıp veriyi almasını ve bağlantıyı kapatmasını sağlayan Connection String adını verdiğimiz databasee bağlantı cümlesidir. Son olarak DataSete veriyi doldururken de Fill() methodu kullanılır.


DataSet ds = new DataSet(); 
sadp.Fill(ds); // DataAdapter ımızı Dataset imize dolduruyoruz ediyoruz.
Response.Write("Veri Eklendi");
// Ekrana Veri Eklendi Yazıyoruz
foreach (Control c in this.Page.Form.Controls)
  {
         if (c is TextBox)
      {
         ((TextBox)c).Text = string.Empty;
       }
  }            
// Bu kod veri eklendikten sonra Textboxları temizliyor.


Kodu baştan ytazarsak şu hale geliyor.

using System.Data.SqlClient;

SqlConnection con = new SqlConnection("server=.\\sqlexpress;database=databaseadımız;uid=varsakullanıcıadımız;pwd=varsaşifremiz");

string ekle = "insert into tblbilgileri(Ad,Soyad,Adres,Yas) Values ('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "')";

SqlDataAdapter sadp = new SqlDataAdapter(ekle,con);

DataSet ds = new DataSet(); 
sadp.Fill(ds);
Response.Write("Veri Eklendi");

foreach (Control c in this.Page.Form.Controls)
  {
         if (c is TextBox)
      {
         ((TextBox)c).Text = string.Empty;
       }
  }  

İkincisi ise bir Class kullanarak veri kaydetme yoludur. 

Öncelikle App_Code klasörüne sağ tıklıyoruz ve Add New Item diyoruz. Karşımıza çıkan pencereden bir Class seçiyoruz. Adına verigetir diyoruz ve Add butonuna basarak class ımızı ekliyoruz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;

///


/// Summary description for VeriGetir
///

public class VeriGetir
{
  static SqlConnection con = new SqlConnection("server=.\\sqlexpress;database=databaseadımız;uid=varsakullanıcıadımız;pwd=varsaşifremiz");
  public DataTable dt = new DataTable();
 public VeriGetir(string query)
 {
  SqlDataAdapter da = new SqlDataAdapter(query, con);
  da.Fill(dt);
 }
  public static int verikaydet(string query)
  {
  if (con.State != ConnectionState.Open)
  {
  con.Open();
  }
  SqlCommand com = new SqlCommand(query, con);
  return com.ExecuteNonQuery();
  }
}

Class ımıza yazacağımız kodları yukarıda verdim. Bu Class sayesinde hem Select hende Insert işlemlerimizi yapabiliriz. Önece bir insert işlemi yapalım.

Yine veri kaydedeceğimiz butona tıklıyoruz ve kod sayfasına şu kodu yazıyoruz.

using System.Data.SqlClient; // Bunu eklemeyi unutmayın

VeriGetir.verikaydet("insert into tblbilgileri(Ad,Soyad,Adres,Yas) Values ('" + TextBox5.Text + "','" + TextBox6.Text + "','" + TextBox7.Text + "','" + TextBox8.Text + "')");

foreach (Control c in this.Page.Form.Controls)
  {
  if (c is TextBox)
  {
  ((TextBox)c).Text = string.Empty;
  }
  }

Bukadar. Sadece tek satır Insert cümlesiyle veri kaydetme işlemini gerçekleştiriyoruz.

Aynı şekilde select cümlemizi yazarkende
VeriGetir ver = new VeriGetir("select * from tabloadi");

İşte bukadar Class kullanmak yazılımlarınıza hem hız kazandırır hemde kodları okurken daha rahat edersiniz.

SQL Komutları

Order By

Bu komut ile belirtilen kolona göre artan veya azalan bir sıralama ile sorgulama yapabiliriz.
ASC : kullanarak küçükten büyüğe doğru artan sıralama yapabiliriz.
DESC : kullanarak büyükten küçüğe doğru azalan sıralama yapabiliriz.

Ancak ASC kullanmak zorunlu değildir. Çünkü default sıralama tipi ASC'dir. Aynı anda birkaç kolon üzerindende sıralama yapabiliriz.

SELECT * FROM personel ORDER BY isim ASC;

Bu query ile personel tablosundaki bütün kayıtları ad'a göre küçükten büyüğe dogru sıralayabiliriz.

SELECT * FROM personel ORDER BY isim DESC; 

Bu query ile personel tablosundaki kayıtları büyükten küçüğe dogru sıralar.

SELECT * FROM personel ORDER BY isim,soyisim; 

Bu query kayıları isime göre artan bir sıralama yapar. Ancak aynı isim ile yaratılmış birden fazla kayıt var ise bunları soyisim sırasına göre artan bir şekilde sıralar.

En çok kullanılan sıralama ise ID ye göre sıralamadır. Örneğin bir haber tablonuz var ve en son eklenen 10 haberleri çekmek istiyorsunuz. Bu durumda query i şu şekilde yazıyoruz.

SELECT TOP10 * FROM Haberler ORDER BY Haber_ID DESC;

Bu query ile veri tabanımızda yer alan son 10 haberi çekiyoruz.

Where 

Yukarıda yaptığımız sorgulamaların hepsinde hiç bir koşul belirtmedik.Yani bütün kayıtları tablolardan çektik. Ancak gerçek hayat'ta bu kayıtların sadece bir kısmına ihtiyaç duyarız.Bize gerekli olan dataları diğerlerinden ayıran bazı özellikleri vardır. İşte bu özellikleri bu komut yardımı ile kullanarak gerekli datalara ulaşabiliriz.

Örneğin sadece adı Emrah olan verileri çekmek istiyoruz. O zaman query imizi şu şekilde yazıyoruz.

SELECT * FROM personel WHERE isim='Emrah'; Burada personel tablomuzun isim kolonu altındaki Emrah yazan verileri getirdik.
 
Sorgumuzu biraz daha geliştirelim ve sadece 500 ile 600 TL maaş alanları çekelim.

SELECT * FROM ucretler WHERE aylik_ucret BETWEEN 500 AND 600 ; Burada ucretler tablomuzun aylik_ucretler kolonu altındaki 500 ve 600 TL maaş alanları getirdik.

Like

İçinde belli bir karakter dizisi bulunan datalara ulaşmak istersek kullanabileceğimiz bir operatördür.

SELECT * FROM personel WHERE adres LIKE '%Eskişehir%' ;
Bu sorgulama ile adres alanında Eskişehir geçen kayıtları listelemiş oluruz.

SELECT * FROM personel WHERE adres LIKE '%Eskişehir' ;
Bu sorgulama ile adres alanının sonunda Eskişehir geçen kayıtları listelemiş oluruz

SELECT * FROM personel WHERE adres LIKE 'Eskişehir%'; 
Bu sorgulama ile adres alanının başında Eskişehir geçen kayıtları listelemiş oluruz

SQL'de Yeni Bir Kayıt Eklemek

Tabloya yeni bir satır eklemek istersek
INSERT INTO sözcüğünü kullanırız. 

INSERT INTO tablo adı(kolon1,kolon2,kolon5,kolon8) VALUES (deger1,deger2,deger6,deger7);

Mesela personel adında bir tablomuz var. Bu tablonun içindede isim,soyisim ve adres kolonları var. Bu tabloya veri eklemek istiyoruz.

INSERT INTO personel(isim,soyisim,adres) VALUES (Emrah,Akın,Eskişehir); Bu query ile verimizi eklemiş oluyoruz. Fakat dikkat ederseniz biz burada eklenecek veriyi insert cümlemizin içine yazdık. Peki bu verileri textbox lardan nasıl alırız?

INSERT INTO personel(isim,soyisim,adres) VALUES (' " + TextBox1.Text + " ' , ' " + TextBox2.Text + " ' , ' " + TextBox3.Text + " '); Bu şekilde istediğimiz yerdeki veriyi alıp veritabanımıza ekleyebiliriz. Burada dikkat edilmesi gerek en önemli şey kolonsayısı ile Values den sonra gelen değer sayılarının aynı olmasıdır. Ben burada örnek veririken sql cümlelerinin salt halini kullanıyorum. Fakat bu cümleler program içinde kullanılırken belli parantezler ve tırnaklar içinde yazılır. Programlarınızda bu cümleleri kullanırken bu konuya özen gösterin. 


4 Nisan 2009 Cumartesi

Asp. Net Usercontrol de javascript kullanımı

User controllere yazdığımız javascript kodları, masterpage de herzaman tam randımanla çalışmaz. Herzaman diyorum çünkü yazılan koda göre değişkenlik gösterir. Özellikle usercontrolleri ayrı bir klasörde tutuyorsak (örn. usercontrol klasörü), script kodlarında sorunla karşılaşırız. Bunun nedeni ise script kodları kendisini oluşturduğunuz klasör içinde çalıştırır fakat masterpage ana dizinde olduğundan aynı kodları algılayamayabilir.

Ben aşağıda örnek bir javascript uygulaması yazdım, siz kendinize uygun olacak şekilde düzenlersiniz.

Öncelikle bir tane usercontrol oluşturuyoruz ve script kodumuzu yazıyoruz. Aşağıda yazdığım örnekte ben bir tane usercontrol klasörü oluşturdum. Yeniden hatırlatmakta yarar var eğer usercontrolü bir klasör içinde değilde ana dizinde oluşturacaksanız (ki bu çok mantıksız bir şey) zaten sorunla karşılaşmazsınız.

Gelelim koda... işin püf noktası ClientID olayıdır.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Haber_Paneli.ascx.cs" Inherits="usercontrols_Haber_Paneli" %>

script type="text/javascript"
  function getir(resim)
  {
  document.getElementById('<%=manset.ClientID %>').src= resim;
  }
  function yazi(baslik,ozet)
  {  
  document.getElementById('<%=icerik1.ClientID %>').innerHTML = baslik;
  document.getElementById('<%=icerik2.ClientID %>').innerHTML = ozet;
  }
 
  /script


Burada kullandığımız ClientID, script imizin anadizinde çalışmasını sağlar.