jQuery ile sürükle bırak yaparak sıralama işlemi

Sıralamadan kastım, kategori sıralama olabilir, eklenti sıralama olabilir, yazı sıralama olabilir vb.. Normalde sıralama işlemlerini yapabilmek için epeyce kod yazmaktan ziyade kullanıcının nasıl en rahat şekilde kullanabileceğinin hesabını kitabını sıklıkla yapıyoruz. Sağolsun  jQuery‘ nin Ui (kullanıcı arayüzü (user interface)) imdadımıza yetişiyor. Önce  sıralama (sortable) fonksiyonunu kullanıyoruz, daha sonra veriyi serileştiriyoruz (serialize) sonrada ajax ile postalıyoruz.Hemen kodlarımıza bakalım. Öncelikle bu iki dosyayı  Jquery Ui indirelim ve sayfamıza ekleyelim.Veritabanımızdaki kategoriler tablomuz.

	CREATE TABLE [kategoriler] (
	  [id] int IDENTITY(1, 1) NOT NULL,
	  [kategoriadi] nvarchar(50) NULL,
	  [sira] int NULL,
	  PRIMARY KEY CLUSTERED ([id])
	)
	ON [PRIMARY]
	GO

 

sirala.aspx sayfamızın içeriği

	<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
	<script type="text/javascript" src="jquery-ui-1.7.1.custom.min.js"></script>
	body {
		font-family: Arial, Helvetica, sans-serif;
		font-size: 16px;
		margin-top: 10px;
	}
	#icerik ul{
	    margin:0;width:300px
	}
	#icerik ul li {
		list-style: none;
		margin: 0 0 4px 0;
		padding: 5px;
		background-color:#007dd5;
		color:#fff;
	}
	#icerik li:hover{
	    cursor:move;
	}
	.yeniyer{border:2px dotted #860101}
<script type="text/javascript">
$(document).ready(function(){
    $(function() {
	    $("#icerik ul").sortable({
	        placeholder: 'yeniyer',
	        opacity: 0.6,
	        cursor: 'move',
	        update: function() {
		    var order = $(this).sortable("serialize");
		    $.post("kaydet.aspx", order);
	    }
	    });
    });
});
</script>
	<div id="icerik">
        <ul>
	         <asp:Literal runat="server" ID="liste"></asp:Literal>
        </ul>
    </div>

Sirala.aspx.cs sayfamızın içeriği

 protected void Page_Load(object sender, EventArgs e)
 {
 if(!IsPostBack)
 {
 listeDoldur();
 }
 }
 
protected void listeDoldur() {
 DataTable dt = veritabani.DataTableGetir("select * from kategoriler order by sira asc");
 foreach (DataRow dr in dt.Rows)
 {
 liste.Text += "

	<li id="\&quot;sira_&quot;">" + dr["kategoriadi"].ToString() + "</li>

";
 }
 }
 

kaydet.aspx.cs sayfamızın içeriği, yani sıralama işlemlerini veritabanına yazan sayfamız.

 protected void Page_Load(object sender, EventArgs e)
 {
 string gelen = Request.Form.ToString().Replace("%5b%5d", "[]").Replace("sira[]=", "");
 char[] ayrac = new char[] { '&amp;' };
 string[] gelenler = gelen.Split(ayrac);
 int i = 1;
 foreach (string veri in gelenler)
 {
 veritabani.guncelle("Update kategoriler set sira='" + i + "' where id=" + veri + " ");
 i++;
 }
 }
 

Örneğin tamamını indirmek için tıklayın. Çalışan örneğe buradan bakabilirsiniz.

Aynı kullanıcı adı daha önceden kullanılmışmı doğrulaması.

Bir kullanıcı kayıt formumuz varsa, önceden kaydedilmiş kullanıcıyı tekrardan
kaydetmemek için bir kontrol yapıp, yeni üye olacak kullanıcıya bu kullanıcı adı
kullanımda gibisinden bir hata verdirmemiz gerekir. Çünkü aynı kullanıcı adından
2 veya daha fazla olursa karışıklıklar meydana gelir ve bunu kimse istemez.
Mantığımız çok basit, yeni yazılan kullanıcı adını eski kayıtlar içerisinden
kontrol edip eğer varsa uyarı veriyor yoksa kayıt işlemini tamamlıyoruz. Bunu
tek bir sql cümlesinde çözmemizde mümkün fakat yeni başlayan arkadaşların olayın
mantığını anlaması açısından c# da kod yazarak bu sorunu çözeceğiz.

Düzenleme
Kullanıcı adını yazıp diğer textboxa geçtiğiniz anda kontrolü yapıp, kullanıcı adı yanına anında müsaitmi değilmi bilgisini yazdırıyoruz. Burada textboxın ontextchanged özelliğinden faydalanıyoruz. Eğer işlem gerçekleştirilirken sayfanın postBack olmasını istemiyorsanız formu UpdatePanel içine alarak isteği gerçekleştirebilirsiniz.

[/html]
SqlConnection conn = new SqlConnection(veritabani.baglanti());//bağlantı cümleniz burada olacak.
protected void Button1_Click(object sender, EventArgs e)
{
if (!kontrol(kullaniciadi.Text)) { //False ise, yani böyle bir kullanıcı yoksa ekleme işlemini yapıyoruz.
SqlCommand sql = new SqlCommand(“insert into kullanicilar (kullaniciadi,sifre,telefon) values (‘”+kullaniciadi.Text+”‘,'”+sifre.Text+”‘,'”+telefon.Text+”‘)”, conn);
conn.Open();
sql.ExecuteReader();
conn.Close();
sql.Dispose();
kullaniciadi.Text = null;
sifre.Text = null;
telefon.Text = null;
mesaj.Text = “Kayıt başarıyla yapıldı !”;
}
else
{
mesaj.Text = “Bu kullanıcı adı kullanımda !”;
}
}

private bool kontrol(string gelenkullanici) {
bool varmisinYokmusun;
SqlCommand sql = new SqlCommand(“Select * from Kullanicilar where kullaniciadi='”+gelenkullanici+”‘”, conn);
conn.Open();
SqlDataReader dr = sql.ExecuteReader();
//eğer kayıt varsa True, yoksa False döndürüyoruz.
varmisinYokmusun = dr.HasRows;
conn.Close();
dr = null;
return varmisinYokmusun;
}

protected void kullaniciadi_TextChanged(object sender, EventArgs e)
{
if (kontrol(kullaniciadi.Text))
{
durum.Text = “Bu kullanıcı adı kullanımda !“;
}
else
{
durum.Text = “Bu kullanıcı adı müsait !“;
}
}
[/html]

		<table border="1" width="100%">
	        <tr>
		        <td>kullanıcı adı</td>
		        <td>
                    <asp:TextBox AutoCompleteType="Disabled" ID="kullaniciadi" runat="server" ontextchanged="kullaniciadi_TextChanged" AutoPostBack="true"></asp:TextBox>
                    <asp:Label runat="server" ID="durum"></asp:Label>    
                </td>
	        </tr>
	        <tr>
		        <td>şifre</td>
		        <td>
                    <asp:TextBox ID="sifre" runat="server"></asp:TextBox></td>
	        </tr>
	        <tr>
		        <td>telefon</td>
		        <td>
                    <asp:TextBox ID="telefon" runat="server"></asp:TextBox></td>
	        </tr>
	        <tr>
		        <td><asp:Label runat="server" ID="mesaj" ForeColor="Red"></asp:Label></td>
		        <td>
                    <asp:Button ID="Button1" runat="server" Text="Ekle !" onclick="Button1_Click" /></td>
	        </tr>	        
        </table>

Çalışan örneğe

buradan
ulaşabilirsiniz.
Bu yazıyı aldığım bir eposta üzerine yazdım, umarım faydalı olmuştur. Herkese iyi çalışmalar.

GridView Satırlarını tıklayınca genişletmek (Expand Rows)

Nedenini bilmiyorum ama başlığı seçerken epeyce zorlandım, neyse ki bir tane buldum :) Konumuza dönelim, GridView kontrolünde verileri listeletirken ilgili satırın altında ilişkili diğer kayıtları göstermemiz gerekebiliyor. Bu sayede kullanıcıya çok işlevsel bir listeleme yapabiliyoruz. Bu işlem için genelde kullanılan yöntem; tüm verilerin tümünün çekilip sonra javascript kullanarak göster-gizle şeklinde gösterilmesi. Bu yöntemde ciddi anlamda performans sıkıntısı yaşarız çünkü 40 tane kaydımız olsa ve bu kayıtlara ait 5′ er de alt kayıt olsa ilk seferde toplam 200 kayıt listelemiş oluyoruz. Anlatacağım yöntemde bu işi jQuery Ajax ile birlikte verimli ve efektif bir şekilde çözeceğiz. (Bugün çok değişik bir gün sanırım havalardan kaynaklanıyor, anlatım bozukluğu varsa kusuruma bakmayın) Mekanızmamız iki adet .aspx sayfasından oluşuyor. Birincisi normal kayıtlarımızı listelettiğimiz GridGenislet.aspx diğeri ise üzerine tıklayınca açılacak olan kısmın bilgilerini getiren Genisle.aspx GridGenislet.aspx sayfamızın ilgili kodlarına bakalım. Burada jQuery ile açılıp kapanma işlemi sırasında oluşacak efekt işini ve Genisle.aspx sayfamıza Ajax ile ilgili kayıtların gelmesini sağlayacak fonksiyonumuzu yazıyoruz. Sonrada Tümünü Göster ve Tümünü Gizle olayını ekledim. Sırf jQuery i biraz daha algılayabilmek adına :)

	$(document).ready(function(){
		$('a#tgizle').click( tumunuGizle );
		$('a#tgoster').click( tumunuGoster );
	});

	function tumunuGizle(){
	    $('div.genisleyenDiv').slideUp();
	}

	function tumunuGoster(){
	    $("div.genisleyenDiv").each(function()
        {
           goster($(this).attr('id'));
        });
	}
	//can damarımız burdaki fonksyion, genisle.aspx e id bilgisini gönderip sayfamızda gösteriyoruz.
	function goster(divId)
	{
		$('div#'+divId).toggle('slow');
		$('div#'+divId).load('Genisle.aspx?Id='+divId);
	}

GridGenislet.aspx.cs sayfamızın ilgili kodlarına bakalım.

	DataTable dt = veritabani.DataTableGetir("Select top 10 id,baslik,icerik,tarih from yazilar");
	GridView1.DataSource = dt;
	GridView1.DataBind();

	for (int i = 0; i &lt; GridView1.Rows.Count; i++)
	{
		//burada hersatırın onclick özelliğine goster fonksiyonumuzu atıyoruz ve ilgili id yi yazdırıyoruz.
	    GridView1.Rows[i].Cells[0].Attributes.Add("onclick", "goster('" + dt.Rows[i][0].ToString() + "')");
	}

Genisle.aspx sayfamızda ise gelen id değerini alıp sql cümlemizdeki yerine koyuyor ve listeletiyoruz. Burdaki yöntemde ben GridView üzerine anlatmaya çalışıyorum, mantığı anlarsanız çoğu yerde bu mekanizmayı kullanabilirsiniz.

Sadece dilimin döndüğünce mantığı anlatmaya çalıştım, eğer isteyen olursa çalışır kodları da paylaşabilirim. Çalışan örneği görmek için tıklayın. Zaman problemim nedeniyle css ile süsleyemedim, istendiği taktirde çok şık bir görünüm verilebilir. Herkese güzel günler diliyor ve konuyu burada noktalıyorum.

ASP.NET DropDownList, CheckBoxList ve RadioButtonList Kontrollerinin Kullanımı

Klasik asp den asp.net e zar zorda olsa geçmiş biri olarak, .net’ in en hayran olduğum kısımlarından biride form elemanlarının kullanım esnekliği. Yani bir sürü kodla yaptığımız işleri asp.net de çoğu zaman hiç kod yazmadan halledebilmemiz mümkün. Hele ki  Ajax Control Toolkit ile birleşince mükemmel sonuçlar elde ediyorsunuz. Bu yazımda ajaxı işin içine katmadan, sadece temel hatlarıyla DropDownList, CheckBoxList ve RadioButtonList kontrollerinin en çok kullanılan özelliklerini anlatmaya çalışacağım. DropDownList: En aşina olduğumuz kontrollerin başında geliyor. Bu kontrolün içine eleman nasıl ve ne şekilde ekleniyor bir bakalım.

DropDownList1.Items.Add("Eleman Ekle");
// bu şekilde eleman eklediğimizde value = "Eleman Ekle" olacaktır, yani kullanıcının gördüğünün aynısı.
DropDownList1.Items.Add(new ListItem("Görünen Kısım", "değerimiz"));
// burada ise istediğimiz value değerini atayabiliyoruz. "değerimiz" value miz oluyor.
DropDownList1.Items.Insert(0,"Index kullanımı");
// buradaki 0 eklenecek elemanımızın sırasını tahin ediyor. 0 = en üst

CheckBoxList: İçinde checkbox lar olan liste şeklindeki elemanımız oluyor yani birden fazla seçim yapabildiğimiz bir kontrol. Html de böyle bir eleman bulunmuyor, kod yazarak bu tarz bir seçim listesi yapabiliyorduk. Yapması ayrı sıkıntı içinden veri alması apayrı bir sıkıntıydı. Özelliklede RepeatColumns, RepeatDirection ve RepeatLayout gibi ayarlarıyla tam manasıyla istediğimiz şekilde listeleme yapmamıza olanak sağlayan bu kontrolün içinden veri almak da çok basit ve zahmetsiz. DropDownList e eklediğimiz şekilde CheckBoxList içine ekleme yapabiliyoruz. Kodları buraya yazmıyorum,  indirilebilir örnek de hepsi bulunuyor.

Varsayılan şekliyle CheckBoxList

RepeatColumns=”5″ değerini verdiğimizde oluşan görüntü.

RepeatColumns=”5″ ve RepeatDirection=”Horizontal” değerlerini verdiğimizde oluşan görüntü.

RadioButtonList: CheckBoxList’ in tüm özelliklerini taşıyan bu kontrolün ayrıldığı nokta, sadece bir tane seçim yapabilmemiz.

Yukarıda anlattığım kontrollerin veritabanı ile bağlantısı ise şu şekilde yapılıyor.

SqlConnection conn = new SqlConnection("bağlantı cümlemiz");
SqlDataAdapter sqlAdap = new SqlDataAdapter("Select * from TabloAdi", conn);
DataSet Ds = new DataSet();
sqlAdap.Fill(Ds);
kontrol.DataSource = Ds;
kontrol.DataTextField = "alanAdi"; //görünecek kısım
kontrol.DataValueField="alanAdi2"; //değer (value) kısmı
kontrol.DataBind();

İlgili dosyaları buradan indirebilirsiniz. Umarım faydalı bir yazı olmuştur :)

GridView ve Modal Popup Extender ile birlikte çalışma

Ajax uygulamaları artık web sayfalarının olmazsa olmazlarından, Asp.Net ile birlikte  Ajax Control Toolkit ile birlikte ajaxın nimetlerinden en iyi ve rahat şekilde faydalanmamız hedeflenmiş. Bu yazımda Modal Popup Extender ile GridView satırında bulunan kaydın id si ile birlikte nasıl işlerimizi yürüteceğimizi anlatmaya çalışacağım. Bu konuda beni bilgilendiren Yunus Emre ye sonsuz teşekkürlerimi sunuyorum.

Burada Modal Popup kontrolüne ait bilgiler bulunuyor. Klasik kullanımı oldukça basit olan bu kontrolü GridView gibi kayıtların listelendiği nesnelerde kullanmak için farklı yöntemler kullanmak gerekiyor. Bu yöntemde aptal buton adı verilen bir buton kullanıp, modal popupu bir nevi kandırıp hata vermemesini sağlıyacağız. Modal Popupumuzun güzel görünmesi için gerekli olan sitil kodlarımız.

.popupArka{
    background-color:#333;
    filter:alpha(opacity:90);
}

.popupKapat{
    text-align:right;
    background-color:#706c6c;
    padding:2px;
    border-bottom:1px solid #c0c0c0;
}

.popupKapat input{
    font-weight:bold;
    width:25px;
    height:25px;
}

.popupKapat span{
    float:left;
    font-size:18px;
    color:White;
    font-weight:bold;
}

Üstten aşşağıya doğru açıklamaya çalışayım. ScriptManager ajax kontrollerinin çalışması için gerekli olan mekanızmamız. UpdatePanel, içerisinde olayların ajax kullanılarak gerçekleşeceği alan. Yani burada sayfamız yenilenmeden işlemlerimiz gerçekteşecek. GridView bildiğimiz Grid :) burda dikkat etmemiz gereken noktalar onrowcommand=”GridView1_RowCommand” burdaki ifadeyi aşşağıdaki kodlarda görebilirsiniz. TemplateField içinde bir adet LinkButon’ umuz bulunuyor. Bunu normal buton imagebuton şeklinde de değiştirebilirsiniz. Buna tıklandığında modalboxumuz açılacak. Burdaki önemli nokta  CommandName=”Detay” ve ommandArgument=’gidecekDeğer’ Aşşağıya indiğimizde modal boxun kendisini görüyoruz. İçinde sitil ve diğer tanımlamalarımız bulunuyor. Bu tanımlamalardan biride yukarda bahsettiğim aptalbuton. Hemen altta ise panel‘ imizi panelimizi görüyoruz. ModalPopup bu paneli bize gösterecek. Belki biraz karışık bir anlatım oldu ama örneği uygulayınca hiçde öyle olmadığını göreceksiniz ve sürekli bu kontrolü kullanmak isteyeceksiniz.

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<div class="popupKapat"><span>Modal Box Başlık</span></div>

RowCommand’ dan gelen Detay adındaki butonumuzu bulup, iFrameOlustur methodumuzu çalıştırıyoruz. iFrameOlustur methodumuzda popupPanel içine myiframe kontrolünü ekliyoruz. Kodlara bakıldığında herşeyin anlaşıldığını düşünüyorum.

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Detay")
{
iFrameOlustur("GosterilecekSayfa.aspx?Id=" + e.CommandArgument, "800", "500");
ModalPopupExtender1.Show();
}
}

protected void iFrameOlustur(string src, string width, string height)
{
HtmlGenericControl myiframe = new HtmlGenericControl("iframe");
myiframe.Attributes.Add("frameborder","0");
myiframe.Attributes.Add("src", src);
myiframe.Attributes.Add("width", width);
myiframe.Attributes.Add("height", height);
popupPanel.Controls.Add(myiframe);
}

Evet arkadaşlar bir yazının daha sonuna geldik. İnşallah işinize yarayan bir yazı olur. Hepinize güzel günler diliyorum.

Web Servis Yazmak ve Kullanmak

Bu yazımda elimden geldiğince Web Service (Web Servis) konusuna değinmeye çalışacağım. Öncelikle web servis nedir sorusunun cevabını kendimce vermeye çalışayım. Çeşitli uygulamalar geliştiren bir firma olduğunuzu kabul edelim. Projelerinizde sık sık kullandığınız yapılar var örneğin, seçilen şehire göre ilçeleri listeleme veya döviz kurlarını gösterme gibi.. Biraz daha geniş düşünürsek, birden fazla uygulamada kullandığımız sanal posları tek bir merkezde toplayıp, istediğimiz uygulamadan veri gönderip işlemlerimizi gerçekleştirebiliriz. Servislerin bir güzelliği de, php, klasik asp, jsp, java vb.. dillerlede çok rahat bir şekilde kullanılması. Ne kadar yazarsam yazayım web servisin nimetlerini uygulamadan görmemiz imkansız. Öncelikle burada ve şurada ki makalelere göz atmanızda fayda var.

Visual Studio 2008′ i çalıştırıp, File / New Project / ASP.NET Web Service
Application
‘ a tıklayıp yeni projemizi oluşturuyoruz.

Karşımıza ilk gelen ekran şu şekilde olacaktır.

Hiç birşey yapmadan projemizi çalıştırıp örneğimizi gözlemliyoruz. (F5) Gördüğünüz gibi karşınıza HelloWorld adındaki işlemimiz geldi. Sayfadaki tasarımıda biz yapmadık otomatik geldi.

HelloWorld işlemine tıkladığımızda Çağır adındaki butonu görüyoruz, alt satırlarda gerekli açıklamalar yer alıyor.

Çağır butonuna tıkladığımızda, karşımıza xml şeklide bir veri geliyor. Hello World değişkeni string olduğu için string olarak geri döndü.

Gördüğünüz gibi çok basit bir yapı. Hemen kendimize bir işlem yazalım ve bilgimizi pekiştirelim. Projemize geri dönüyoruz ve HelloWord un altına yazmaya başlıyoruz. İşlemimiz ad ve soyad kontrolü yapıp geriye bool (true, false) bir değer döndürsün.

    [WebMethod]
    public bool ilkServisimiz(string ad, string soyad)
    {
        bool geriDonecekDeger;
        if (ad == "ali" && soyad == "veli")
        {
            geriDonecekDeger = true;
        }
        else
        {
            geriDonecekDeger = false;
        }
        return geriDonecekDeger;
    }
    //gördünüz gibi klasik c# dan hiç bir fark bulunmuyor.
    //servisde görüntülenecek işlemin kodlarının başına [WebMethod] eklememiz yeterli.

Bu basit yapıda ad ve soyad adında iki stringi alıp kontrol ediyoruz. Eğer istediğimiz bilgiler gelirse true değilse false döndürüyoruz. Projemizi hemen çalıştırıyoruz. HelloWorld şleminin altında ilkServisimiz adındaki işlemi görmüş olmamız gerekiyor. Tıklayıp çalıştırdığımızda bizden ad ve soyad değişkenlerini isteyen bir form görüntüleniyor. ali veli yazıp çağır dediğimizde sonuç true olarak, aksi durumda false olarak dönüyor. İlk servisimiz hayırlı uğurlu olsun :)

Şimdi web servis uygulamamızı web sayfalarımızda nasıl kullanacağımıza bakalım. Hemen Visual Studio 2008 den File / New Web Site diyoruz. Default.aspx sayfamızın içine hemen aşağıdaki gibi basit bir form koyuyoruz.

Ad

&lt;asp:TextBox ID="txtad" runat="server"&gt;&lt;/asp:TextBox&gt;

&lt;br /&gt;

Soyad

&lt;asp:TextBox ID="txtsoyad" runat="server"&gt;&lt;/asp:TextBox&gt;

&lt;br /&gt;

&lt;asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Gönder" /&gt;

&lt;br /&gt;

&lt;asp:Label runat="server" ID="lblmesaj" ForeColor="Red"&gt;&lt;/asp:Label&gt;

Şimdi gelelim web servisimizi web sayfamızda kullanmak için gerekli adımlara.  Solution Explorer dan sağ tuş tıklayıp Add Web Reference diyoruz.

Açılan pencereye oluşturduğumuz web servisin adresini girip Go diyoruz. Karşımıza işlemlerimiz geliyor ve ilkServisimiz adlı işleme tıklıyoruz.

Görüldüğü gibi web servis projemizi çalıştırdığımızdaki ekranlar ile birebir aynı bir arayüz geliyor karşımıza. Web reference name kısmında referans için bir isim giriyoruz. Ben ebreferansim diye giriyorum ve Add Reference ye tıklayıp projeme dahil ediyorum.

Solution Explore baktığımızda APP_WebReferences klasörünün altına gerekli dosyaların geldiğini görüyoruz. Aynı projede birden fazla web servis kullanmamız mümkün.

Default.aspx.cs dosyamıza gidip kodlarımızı yazmaya başlıyoruz. Unutmadan kodlarımızı oluşturduğumuz formdaki butonun onclick özelliğine yazıyoruz.

protected void Button1_Click(object sender, EventArgs e)
{
// servis adındaki nesnemizi oluşturuyoruz.
webreferansim.Service1 servis = new webreferansim.Service1();

//hemen servisimiz içindeki kodları hatırlayalım
//---------------------------------------------------
//[WebMethod]
//public bool ilkServisimiz(string ad,string soyad) {}
//aşşağıdaki satırda, ad ve soyad değişkenlerini aynen methodumuza gönderiyoruz.
bool servistenGeriDonenDeger = servis.ilkServisimiz(txtad.Text, txtsoyad.Text);

//dönen değeri ekrana yazdırıyoruz.
Response.Write("Geri dönen değerimiz: <strong>" + servistenGeriDonenDeger + "</strong>");

//pekiştirmek için basit bir if bloğu
if (servistenGeriDonenDeger)
{
lblmesaj.Text = "Bilgiler doğru !";
}
else
{
lblmesaj.Text = "Bilgiler yanlış !";
}
}

İşte bu kadar gördüğünüz gibi .net ortamında web servis hazırlama ve kullanma işi gerçekten çok basit. Unutmadan burada incelemeye değer çokça servis bulunuyor. Umarım faydalı bir yazı olmuştur, hoşçakalın.

Örnek
dosyaları buradan indirebilirsiniz.

Datalist içinde RadioButton Gruplamak !

İlkten çok basit gibi görünen bir durum, fakat uğraşmaya başlayınca durumun böyle olmadığını görüyorsunuz. Senaryomuz şu şekilde;
verileri listelediğimiz bir DataList nesnemiz var, her satırın başında
bir RadioButton bulunuyor, biz kullanıcının sadece bir tane seçim
yapmasını istiyoruz (Şekil 1). Bir nevi RadioButtonList nesnesinin
yaptığı işi DataList içinde yapmak istiyoruz. Yaptığım araştırmalarda

CodePorject
de bir .dll sayesinde yapıldığını gördüm, fakat projeye bu .dll
yi eklemek işime gelmedi. Aklıma bu işin Javascript’ le çözülebileceği geldi ve
aramalarımı bu yönde sürdürdüm, en sonunda aradığım betiği buldum ve çok mutlu
oldum :) Sizlerlede paylaşmak istedim :)

 
Şekil 1

JavaScript Kodumuz

<script type="text/javascript">
function clickit() {
        var doc=document.all;
        var el=event.srcElement;
        if(el.tagName=="INPUT"&&el.type.toLowerCase()=="radio")
        {
                for(i=0;i<doc.length;i++)
                {
                        if(doc[i].tagName=="INPUT"&&doc[i].type.toLowerCase()=="radio")
                        {
                                doc[i].checked=false;
                        }
                }
        }
        el.checked=true;
}
</script>

Kullanımı ise şu şekilde

<asp:RadioButton ID="RadioButton1" runat="server" onclick="clickit();"/>

ASP.Net ile veri çekme testleri..

Zamanında overclock ile epeyce uğraştım, çok
fazla sayıda donanımı deneme ve test etme imkanı buldum. Sonrasında yazılım
tarafı ağır basınca overclock işini maziye gömdüm. Kaç zamandır acaba DataTable
mi kullansam, foreach mı kullansam veya DataAdapter mi kullansamın hesabını
yapıyordum, diğer yandan acaba hangisi daha performanslı çalışır veya kullanıcı
tarafında hangisi daha sorunsuz görüntülenebilir gibi düşünceler içerisindeydim.
Madem eski hız aşırtmacılardanım kendimce bir test (benchmark)
platformu hazırlayıp işe koyulayım dedim. Belki yanlış işlemler yapmış
olabilirim, göz ardı ettiğim noktalar olabilir bunları eğer paylaşırsanız çok
sevinirim.

Test sistemi;

Acer 5920G Dizüstü Bilgisayar (T7100 @ 1,8Ghz İşlemci, 4GB 800Mhz Bellek)
Windows Vista Ultimate (32-Bit) (Güncel), Internet Explorer 7, Mssql 2005, FrameWork 3,5 (Güncel),
Visual Studio 2008

Test hakkında:
Sql server, IIS ve İstemci aynı bilgisayardır, sonuçları ms cinsinden
etkilemiştir fakat tüm testler için aynı ortam olduğu için % olarak çok bir fark
olacağını sanmıyorum.
Testleri en çok kullanılan veri listeleme nesneleri olan GridView ve
DataList içinde listeledim.
Her testi 3 kez tekrarlayarak ortalamasını aldıktan sonra kayda geçtim.
SQL Server Profiler sadece ilgili testi yaparken açıktı, diğer durumlarda
kapalı.
Grafiklerdeki veriler milisaniye (ms) cinsinden olup, Sql S.P.
SQL
Server Profiler kısalıtılmış halidir.
Testler sırasında  EnableViewState=”false” durumundadır, nedenlerin başında
foreach döngüsünde viewstate boşken gridview ve datalist’ te dolu olması.
Haksızlık olmasın diye kapattım.

Sırasıyla 1000,10.000 ve 100.000 kayıt üzerinde denemeler yapılmıştır.
Testler arasındaki geçişleri // işaretlerini kaldırarak ve pageload daki method ismini değiştirerek gerçekleştirdim.
Hatırlatma: Milisaniye cinsinden değerler azaldıkça performansın arttığını
anlıyoruz.

Testte kullanılan kodlar ve tablonun yapısı:
Testte Vegawin ticari yazılımının kullanıcı işlemlerini loglayan tablosunu
kullandım, içerisinde 530.000 adet kayıt bulunan bir tablo, test sırasında
dışarıyla bağlantısı olmadığından herhangi bir ekleme yada silme işlemi söz
konusu değildi.

CREATE TABLE [dbo].[TBLLOG] (
[IND] int IDENTITY(100, 1) NOT NULL,
[FIND] int NULL,
[DIND] int NULL,
[PID] smallint NULL,
[TARIH] datetime NULL,
[MAKINE] nvarchar(50) COLLATE Turkish_CI_AS NULL,
[USERID] int NULL,
[BELGE] int NULL,
[BELGENO] int NULL,
[EYLEM] int NULL,
[ACIKLAMA] nvarchar(100) COLLATE Turkish_CI_AS NULL
)
ON [PRIMARY]
GO
[/html]

Yeri gelmişken bana Object Oriented konusunda yol gösteren ve herzaman vakit ayırıp sorularımı cevaplayan Yunus Emre arkadaşıma teşekkürlerimi sunuyorum.

Class.cs
[/html]
public class veritabani
{
static private string baglanti()
{
return @"Data Source=sunucu;Initial Catalog=veritabani;Persist Security Info=True;User ID=kullaniciadi;Password=sifre;pooling=true";
}
public static DataTable DataTableGetir(string strSQL)
{
SqlConnection conn = new SqlConnection(baglanti());
SqlCommand cmd = new SqlCommand(strSQL, conn);
cmd.CommandTimeout = 0;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
try
{
da.Fill(ds, "TABLE");
return ds.Tables["TABLE"];
}
catch
{
}
finally
{
if (conn != null && conn.State == ConnectionState.Open)
{
conn.Close();
}
conn = null;
}
}
}
[/html]
[/html]
public partial class _Default : System.Web.UI.Page
{
string kayitsayisi="100000";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
griddoldur2();
}
}

protected void griddoldur1() {
DateTime baslangic = DateTime.Now;

DataTable dt = veritabani.DataTableGetir("Select top "+kayitsayisi+" * from TBLLOG");
GridView1.DataSource = dt;
GridView1.DataBind();

//foreach (DataRow dr in dt.Rows)
//{
//Response.Write("

");
//Response.Write("

");
//Response.Write("

" + dr["IND"].ToString() + " - " + dr["FIND"].ToString() + " -
" + dr["DIND"].ToString() + " - " + dr["PID"].ToString() + " - " + dr["TARIH"].ToString() + " -
" + dr["MAKINE"].ToString() + " - " + dr["USERID"].ToString() + " - " + dr["BELGE"].ToString() + " -
" + dr["BELGENO"].ToString() + " - " + dr["EYLEM"].ToString() + " - " + dr["ACIKLAMA"].ToString() + "

");
//}

DateTime bitis = DateTime.Now;
TimeSpan fark = bitis - baslangic;
sonuc.Text = fark.TotalMilliseconds.ToString() +" mili saniye";
}

protected void griddoldur2() {
DateTime baslangic = DateTime.Now;
SqlConnection sqlConn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["baglanti"].ToString());
SqlDataAdapter sqlAdap = new SqlDataAdapter("Select top " + kayitsayisi + " * from TBLLOG", sqlConn);
DataSet Ds = new DataSet();
sqlAdap.Fill(Ds);
GridView1.DataSource = Ds;
GridView1.DataBind();
DateTime bitis = DateTime.Now;
TimeSpan fark = bitis - baslangic;
sonuc.Text = fark.TotalMilliseconds.ToString() + " mili saniye";
}
}
[/html]

Grafiklerle test sonuçları
asp.net 1000 kayıt performansı
asp.net 10000 kayıt performansı
asp.net 100000 kayıt performansı

Test sonuçları ve gözlemlerim:
Kayıt sayısı arttıkça foreach döngüsünün başarısıda ciddi anlamda artıyor.
Ekstra bir ayar yapmadığımdan dolayı veriler geldikçe tarayıcıya basılıyor ve bu
sayede kullanıcı diğer yöntemlerde verinin tam yüklenmesini beklerken bu yöntemde uzun süreli beklemeden
kurtulmuş oluyor, kayıtların tamamı döndükçe döndükçe geliyor ve aynı zamanda
düşük konfigürasyonlu bilgisayarlarda oluşacak olan donma ve yanıt vermeme
durumu ortadan kalkmış oluyor. 100.000 kayıt
ciddi bir rakam uygulamada belkide hiç karşılaşılmayacak bir rakam fakat neler
olduğunu görmek adına denemek istedim, veriler ekrana basılırken ve basıldıktan
sonra zaman zaman tarayıcınızın cevap vermemesine sebep oluyor, yinede sorunsuz
bir şekilde listeleniyor. Burada
belkide sql sunucu, istemci ve iis in bir arada olmasıda önemli bir faktör
olarak görülebilir fakat bellek kullanımı ve işlemci kullanımına baktığımda
anormal bir durum söz konusu değildi. Bu sadece bir testti, test sonuçlarından
sonra foreach çok daha performnslı diye bu yöntemi kullanıp, gridview ve
datalist gibi nesnelerin nimetlerinden yararlanmamak tabiki söz konusu olamaz.
Bu kadar çok kaydı ciddi raporlarda almadıktan sonra kolay kolay web de
karşımıza sanmıyorumki çıksın, az kayıt sayısında da devasa farklar oluşmuyor.
Burda dikkatimi çeken nokta ise DataTable nin performansı oldu, 1000 ve 10.000
kayıtta DataAdapter' e fark atıp foreach ile kafa kafa ya giderken 100.000
kayıtta tepetaklak olması beni şaşırttı. İlk fırsatta bu testi yeniden yapıp
sonuçları paylaşacağım. Asıl bundan sonra yapacak olduğum Insert ve Update
işlemleri beni çok meraklandırıyor, bakalım bu testlerde neler olacak. Kendime
göre çıkardığım sonuçta DataTable kullanmak en sağlıklısı, ama unutmayınki her
yiğidin bir yoğurt yiğişi vardır. :)

Datalist ile kayıtları kolay bir şekilde sayfalama.

DataGrid ile sayfalama işlemini 2 satır kodla yapabilirken bu durum DataList için biraz farklı. Birden fazla sayfalama şekli bulunuyor. İnternette en basit şekilde nasıl
yapılabilirin yollarını ararken şunu gördüm, kabaca iki şekil bulunuyor. Birincisi PagedDataSource nesnesini kullanarak sayfalama yapmak, diğeride benim izlediğim yol tarzı yöntemler.
Araştırmalarımda üçüncü bir yola rastlamadım.

Gelelim mekanızmamıza, başlıkta kolay ifadesinin geçmesinin sebebini açıklayayım hemen. Eğer araştırma yaparsanız bu teknikte genelde birden fazla method kullanılıyor,
bir methotda toplam kayıt sayısı bulunuyor, (düşünün datalist içinde sayfalayacığınız bilglerin gösterimi için kullanacağınız sql cümlenizin hem burada hemde verilerin listeleneceği yerde aynı olması gerekirki buda ek külfet demek.) diğerinde sayfalama işlemleri yapılıyor vb..
Ben burda tek method altında tüm sayfalama işlemlerini toplamaya çalıştım.
Direk kodları burdan kopyala yapıştır yaparak, sadece tablo adını be veritabanınıza bağlantı cümlenizi değiştirerek kullanabilirsiniz. Sayfalamamız göze hoş gelsin diye
birazcık sitil ayarlarını değiştiriyoruz. Kodlarla ilgili açıklamaları karşılarına dilimin döndüğü kadar yazmaya çalıştım. Umarım işinize yarar.
Başka yazıda görüşmek üzere hoşçakalın.

Tasarım kısmımız;

.sayfalama a{
    display:block;
    float:left;
    border:1px solid #ededed;
    padding:5px;
    width:15px;
    text-decoration:none;
    font-weight:bold;
    background-color:#f2f2f2;
    margin:2px;
    text-align:center;
    color:Black;
}
.sayfalama a:hover{
    border:1px solid #c0c0c0
}
.sayfalama .aktif{
    display:block;
    float:left;
    border:1px solid #ededed;
    padding:5px;
    width:15px;
    text-decoration:none;
    font-weight:bold;
    background-color:#da010d;
    margin:2px;
    text-align:center;
    color:white;
}
[/html]
<asp:DataList ID="DataList1" runat="server"></asp:DataList>
<div class="sayfalama">
    <asp:Label runat="server" ID="sayfalar"></asp:Label>
</div>
<asp:Label runat="server" ID="kayitbulunamadi"></asp:Label>

Kod kısmımız;

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataBind();
        }
    }
 

    private void DataBind()
    {
        SqlConnection conn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["baglanti"].ToString());
        //ben burda web.config içindeki sql bağlantısı cümlesini kullanıyorum.
        SqlDataAdapter objDA = new SqlDataAdapter("Select * From TabloAdi", conn);
        DataSet objDS = new DataSet();

        //Değişkenlerimiz
        int goruntulenecekKayitSayisi=5; //bir sayfadaki kayıt sayısı
        int toplamKayitSayisi=0; //Tablomuzdaki toplam kayıt sayısı
        int toplamSayfaSayisi = 0; //Toplam sayfa sayısı
        int ilkKayit = 0; //Listelemeye başlanılacak kayıt sayısı
        int sayfa; //Sayfamız

        string adresEk = Request.QueryString.ToString(); //Burada QueryStringle tarayıcıdaki adresi alıyoruz.
        												//Amacamız şu diyelimki sayfanızda değişken querystringler var, yani Sayfamiz.aspx?Islem=Deneme&Kat=3
        												//Burdaki değişkenleri aynen alıp sayfa numaramızı replace ediyoruz ve herzaman sabit bir adres elde etmiş oluyoruz.
        												//Sayfamiz.aspx?Islem=Deneme&Kat=3&Sayfa=1 , Sayfamiz.aspx?Islem=Deneme&Kat=3&Sayfa=2
        												//Sayfamiz.aspx?Islem=BaskaBisiy&Kat=1&Sayfa=1, Sayfamiz.aspx?Islem=BaskaBisiy&Kat=1&Sayfa=2 gibi..
        												//Bu sayede kodlarda hiç bir değişiklik yapmadan DataList nesnesinin olduğu yerde bu mekanızmayı kullanabilirsiniz.

        try // bu blokda eğer QueryString deki Sayfa karşısıa sayıdan başka bir değer girilirse, sayfada hata oluşmadan sayfa değişkenimize 1 değerini atıyoruz.
        {
            sayfa = Convert.ToInt32(Request.QueryString["Sayfa"]);
        }
        catch
        {
            sayfa = 1;
        }

        if (sayfa == 0) { sayfa = 1; } 

        objDA.Fill(objDS);
        toplamKayitSayisi = objDS.Tables[0].Rows.Count;
        objDS = null;
        objDS = new DataSet();
        //burdkai dikkat edilecek nokta, önce toplam kayıt sayımızı ilgili değişkene atıyor ve datasesi temizliyor, tekrar yeniden oluşturuyoruz.

        //Toplam sayfa sayısını buluyoruz.
        //Burdaki olayı çok kaba tabirle özetliyeyim, örneğin Tablomuzda 9 kayıt var ve biz bu kayıtları sayfa başına 2 olarak göstermek istiyoruz.
        //Bu durumda 9/2=4,5 çıkıyor yani 4 sayfa ! aşşağıda bu tip durumlarda görüntüleyeceğimiz kayit sayımıza 1 ekleyip 5 sayfa olmasını sağlıyoruz.
        // Buradaki % işareti Mod anlamına geliyor.
        if (toplamKayitSayisi % goruntulenecekKayitSayisi == 0)
        {
            toplamSayfaSayisi = toplamKayitSayisi / goruntulenecekKayitSayisi;
        }
        else
        {
            toplamSayfaSayisi = toplamKayitSayisi / goruntulenecekKayitSayisi + 1;
        }

        //Toplam sayfa sayısı kadar ekrana sayfa numaralarını basıyoruz.
        adresEk = adresEk.Replace("&Sayfa="+sayfa,""); //yukarıda açıklamasını yapmıştık.

        for (int i = 1; i <= toplamSayfaSayisi; i++) //toplamSayfaSayisi kadar döngümüzü kurup, ekrana çıktıyı basıyoruz.
        {
            if (i == sayfa) //Eğer bulunduğumuz sayfadaysak bunu belirtiyoruz. Burda a tagını kaldırıp span kullanıyorumki tıklanamasın.
            {
                sayfalar.Text += "" + i + "";
            }
            else
            {
                sayfalar.Text += "" + i + "";
            }
        }

        ilkKayit = (sayfa * goruntulenecekKayitSayisi) - goruntulenecekKayitSayisi; // ilk kayıt için hesaplamamızı yapıyoruz.

        objDA.Fill(objDS, ilkKayit, goruntulenecekKayitSayisi, "TabloAdi");
        DataList1.DataSource = objDS.Tables[0].DefaultView;
        DataList1.DataBind();
        conn.Close();
        objDA.Dispose();
        objDS.Dispose();

        if (DataList1.Items.Count == 0) // Eğer kayıt yoksa uyarı veriyoruz.
        {
            kayitbulunamadi.Text = "Kayıt bulunamadı";
        }
    }
[/html]

ASP.NET C# T-SQL ile İlgili İpuçları

Daha çok yeni başlayanların işine yarayacağını düşündüğüm bu yazıda sizlerle, gerek tasarım tarafında gerekse kod tarafında karşılaştığım sıkıntıların çözümlerini, teknik ve taktiklerini paylaşmaya çalışacağım.

  • Birden fazla DataReader kullanmak: Eğer aynı yerde iki adet DataReader nesnesi kullanmak isterseniz karşınıza, “Bu komut ile ilişkili, öncelikle kapatılması gereken açık bir DataReader zaten var.” gibisinden bir hatayla kaşılaşırsınız. Bunu önlemek için ConnectionString’ inize “MultipleActiveResultSets=true” ibaresini eklemelisiniz.
  • Nesnelere özellikler atamak: Örneğin bir tane asp:Label imiz var ve buna kod kısmından bir click yada bir style ataması yapacağız. Bunu yapabilmek için nesnelere Attributes özelliğinden yükleme yapabiliyoruz. Örneğin; Button1.Attributes.Add(“style”, “color:red”); veya Button1.Attributes.Add(“onclick”, “alert(‘deneme’)”); gibi.. Bunu bir kenara not alın çünki çoğu zaman çok işinize yarayacak bir özellik.
  • HTML etiketlerine kod tarafından erişip işlem yapmak: Mesela bir <table> yada <div> iniz var yani HTML ile oluşturduğunuz bir etiket, bunlara runat=”server” ve d=”herhangibirid” ifadelerini eklediğinizde kod tarafından erişip işlem yapabilirsiniz. Örneğin herhangibirid.Visible = false; deyip işlem sonunda o id ye sahip elemanı görünmez yapabilirsiniz. Yani ekstradan javascript kasmanıza gerek kalmaz. Yapabilecekleriniz sadece bu değil tabiki, içine içerik ekleyebilir style ayarlarını değişebilir kısacası desteklenen tüm özellikleri ayarlayabilirsiniz.
  • GridView Nesnesinin renklendirilmesi: Bahsettiğim olay şu, gridview de listeleme yaptığımızda bir satırın farklı diğer satırın farklı renkte olma olayı. Bunu kodla çözememizde mümkün fakat GridView’ in AlternatingRowStyle özelliği ile koda gerek kalmadan rahatça çözelbiliriz. Örnek Kullanım: <asp:GridView ID=”GridView1″ runat=”server”><AlternatingRowStyle BackColor=”Red” /></asp:GridView>
  • Bir işlemi yapmadan önce Eminmisiniz sorusunu javascript kullanarak sorma: İster GridView içinden bir kayıt silerken, ister bir kaydı güncellerken nerde kullanmak isterseniz kullanabileceğiniz bu işlemi, eğere nesnemizde OnClientClick özelliği varsa direk oraya OnClientClick=”return confirm(‘Bu Kategoriyi silmek istediğinizden emin misiniz?’);” yoksa yukarıda anlattığım Attributes şeklinde onclick olarak nesneye ekleyebilirsiniz. NesneId.Attributes.Add(“onclick”,”return confirm(‘Bu Kategoriyi silmek istediğinizden emin misiniz?’)”)
  • Sql sorgusunda Insert ile birlikte Select ifadesini bir arada kullanmak: Normal insert cümlemiz şu şekilde yazılıyor, Insert Into TabloAdi (Alan1,Alan2) Values (‘Değer1′,’Değer2’) anlaşılacağı üzere tablomuzdaki alanlara karşılık gelen değerleri tablomuza ekliyoruz. Diyelimki farklı bir tablodaki kayıtları istediğimiz koşula göre diğer tablomuza ekliyoruz. Hemen örneğimize bakalım; Insert Into VerilerinEklenecegiTablo (Alan1,Alan2,Alan3) Select tablo_alani1, tablo_alani2,'”+TextBox1.Text+”‘ From DigerTablo Where id=1 Gödüğünüz gibi koşullu bir şekilde farklı bir tablodan diğer tabloya kayıtlarımızı ekliyoruz, ekstra olarak dışardan bir verininde girilmesini istiyorsak ” arasına değişkenimizi yada değerimizi yazıyoruz.
  • Aynı anda ilişkili iki tabloya veri eklemek: Öncelikle olayımızı biraz açayım, diyelim veritabanımızdaki iki tabloya kayıt gireceğiz, ama bu tablolar bir birleriyle ilişkili. Yani; id | adsoyad | email —> Bu bizim birinci tablomuz adı Kullanici olsun id | kullanici_id | resimadi | tarih —> Buda bizim Kullanici tablosuyla ilişkili olan Resimler ablomuz olsun. Senaryomuza göre yeni bir kullanıcı kayıt olurken bir resim yüklüyor ve bu resimi biz Resimler tablomuza kayıt yapmak istiyoruz. İlk bakışta kolay gibi görünüyor fakat, ilk anda Kullanici tablosunda ilgili kullanıcıya ait bir kayıt olmadığından id değerinin ne geleceğini bilmiyoruz, yani Resimler tablosundaki kullanici_id yerine yazacağımız id belli değil. Bunu bir kaç değişik yoldan yapmak mümkün, fakat kullandığım yöntemlerin içinde en sağlıklı olanı SELECT IDENT_CURRENT(‘TabloAdi’)) şeklinde sorgulama yapıp gelecek olan id nin ne olduğunu bulmak. Örnek cümlemizin tamamına bakalım;
    Adım 1: Insert Into Resimler (kullanici_id,resimadi,tarih) Select Ident_Current(‘Kullanicilar’),’resminadi.jpg’,’01.01.2009′
    Adım 2:
    Insert Into Kullanicilar (adsoyad,email) values (‘abdullah’,’abdullah@xxx.com’)
    Bu şekildeki kullanımda milisaniye cinsinden aynı anda işlem yapılırsa sıkıntı olabilir, haricinde sıkıntı olması zor. Bu sıkıntıyıda  Transaction kullanarak aşabiliriz. Transaction kullanım örneğinide aşşağıda ayrı bir başlık halinde anlatmaya çalışacağım.
  • Transaction Nedir ve Kullanımı: Zaman zaman aynı anda birden fazla Insert veya Update işlemi yaptığımız oluyor. Bu cümlelerin büyük çoğunluğu zaman zaman birbiriyle ilişkili oluyor. Herhangi bir teknik hata veya farklı nedenlerden dolayı bir kopma olduğunda bütünlüğümüz boluzulur ve kayıtlarımızda ciddi sıkıntılar meydana çıkar. Bunu engellemek için Transaction denen mekanızmayı kullanıyoruz. Bu sayede herhangir bir hata durumunda işlemlerin hiçbiri gerçekleşmiyor, hata olmadığında ise hepsi birden gerçekleşiyor. Hemen bir örnekle Transaction kullanımı örnekleyeyim.
    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["baglanti"].ToString());// Sql bağlantımızı yapıyoruz.
    SqlCommand islem1 = new SqlCommand(“Insert Into TabloAdi_1 (alan1,alan2,alan3) Values (‘değer1′,’değer2′,’değer3′)”, conn);// 1. işlemimiz
    
    SqlCommand islem2 = new SqlCommand(“Insert Into TabloAdi_2 (alan1,alan2,alan3) Values (‘değer1′,’değer2′,’değer3′)”, conn);// 2. işlemimiz
    
    SqlCommand islem3 = new SqlCommand(“Insert Into TabloAdi_3 (alan1,alan2,alan3) Values (‘değer1′,’değer2′,’değer3′)”, conn); // 3.işlemimiz
    
    conn.Open(); // Bağlantımızı açıyoruz.
    SqlTransaction sqlTrans = conn.BeginTransaction(); // Transaction nesnemizi tanımlıyoruz.
    
    // Transaction nesnesine işlemleri eşitliyoruz.
    islem1.Transaction = sqlTrans ;
    islem2.Transaction = sqlTrans ;
    islem3.Transaction = sqlTrans ;
    //Burda try cath bloğunu kullarak hata olmadığında ve olduğunda yapılacak işlemleri belirtiyoruz.
    try
    { // eğer hata yoksa try bloğunun içi çalışır !
    islem1.ExecuteNonQuery();
    islem2.ExecuteNonQuery();
    islem3.ExecuteNonQuery();
    sqlTrans.Commit(); // hiç bir problem oluşmamışsa işlemlerimiz yapılıyor.
    }
    catch (Exception hata)
    { // eğer bir hata olmuşsa catch bloğu çalışır !
    Response.Write(“İşleminiz yapılamadı, Oluşan Hatanın Detayı<br />”+hata);
    sqlTrans.Rollback(); // herhangi bir sebepten dolayı hata oluşmuşsa işlemlerimiz geri alınıyor yani yapılmıyor.
    }
    finally
    { // hata olsun olmasın finally bloğunun içi çalışır ! burda nesneleri sonlandırıyoruz.
    conn.Close();
    conn.Dispose();
    sqlTrans.Dispose();
    islem1.Dispose();
    islem2.Dispose();
    islem3.Dispose();
    }
    

    Umarım faydalı olur, zaman zaman günlerce üzerinde uğraştığım, saç baş yonduğum konuları sizlerle tecrüblerim dahilinde paylaşmaya çalıştım. Eğer hatalı bir yer görürseniz lütfen yorum olarak ekleyin, gerekli düzeltmeleri yapayım. Öğrendikçe bu tarz paylaşımlarıma devam edeceğim, kalın sağlıcakla.

ASP.NET de Password alanını postBack yapınca silmeme..

Başlık acayip gelebilir, ama başınıza gün gelirde böle bişiy gelirse ozaman görürüm sizi :) Olayımız şu, kullanıcı formu dolduruyor, alanlar arasında password tipinde bir alanımızda var. Sayfayı herhangi bir nedenden dolayı postback etmemiz gerekiyor. Durum böyle olunca password alanları boşalıyor, halbuki boşalmasını istemiyoruz. Mesela adam formu doldurdu, sözleşmeyi okudum kabul ediyorum adındaki checkboxa tıkladı, sayfa postpack oldu, hobaaaa password alanları boşaldı, bunun önüne şu şekilde geçebiliyoruz.

sifre.Attributes.Add(“value”, sifre.Text);

Yaptığımız iş çok basit, ID si sifre olan alanımızın valuesine sifre.text bilgisini yazıyoruz.

ASP.NET ile Kullanıcı Kayıt Formu Tasarımı ve Kontroller

Formları oluştururken şüphesiz en büyük sıkıntı, istediğimiz bilgilerin istediğimiz şekilde doldurulması olayıdır. Bu olaya “Geçerlilik Denetimi” (Validation) denilmektedir. ASP.NET de bu iş için bizlere sunulmuş validation nesnelerimiz bulunuyor. Genellikle e-posta, telefon numarası, kredi kartı numarası,web adresi ve tarih gibi belli bir formatı olan bilgileri alırken egularExpressionValidator adındaki nesne sayesinde çok rahat bir biçimde bu kontrolleri sağlıyabiliyoruz. Bu adreste istemediğiniz kadar regularexpressionvalidator için kullanabileceğiniz formül bulunuyor. Eğer bir alanın zorunlu doldurulmasını istiyorsak RequiredFieldValidator tam bize göre :) Yazılan şifrelerin eşit olup olmadığını yada yazılan e-posta adreslerinin eşit olup olmadığını ise CompareValidator nesnesiyle yapabiliyorsunuz.

asp.net form kontrol

Güvenilirlik konusuna gelince, validation kontrolleri sadece tasarım kısmında değil kod kısmındada işini yapıyor. Yani birdaha kod kısmında eğer bu buna eşit değilse geri dön felan filan gibi kontrollere ihtiyacınız olmuyor.

Validation nesnelerinde;

ControlToValidate=”kontrol edilmesini istediğimiz alanın ID si”

ErrorMessage=”Adı üstünde hata olunca görünecek hata”

Display=”Dynamic” Bu özellik varsayılan olarak gelmiyor yani None, eğer Dynamic yaparsak; yan yana birden fazla kontrol kullandığımızda örneğin; 2. hatanın belirdiğinde 1. hata aktif değilse, 1. hatanın olduğu yerde 2. hatanın görünmesini isteriz. Bu nun için bu özelliği kullanıyoruz. Kaynak kodlarını inceledğimizde, Dynamic olduğunda display:none, diğer durumda visibility:hidden oluyor. Eğer deneme yaparsanız demek istediğimi daha iyi anlayacaksınız.

InitialValue=”vasayılan değer” Bu şu demek örneğin bir drop down listiniz var ve bunun ilk elemanı Seçiniz, bu Seçiniz elemanın varsayılan değeride Seçiniz dir. Yani her halükarda bir değer geri döner, kullanıcı hiç birşeyi seçmese bile hata olarak geri bir dönüş olmaz. initialvalue=”Seçiniz” diyerek bunu engelleyebiliriz.

Kodları verip burayı bulandırmak istemedim, buradan hazır yapılmışını indirebilir ve konuyu çok daha iyi anlayabilirsiniz. Elimden geldiğince olabilecek varyasyonları gerçekleştirmeye çalıştım.

Düzeltme; yukarda indirdiğiniz örneği yanlış eklemişim, 100 ün üzerinde okunmasına rağmen nasıl kimse farkedip bişiy yazmadı şaşırdım açıkcası. Adres güncellenmiştir, ilgilenen arkadaşlara duyurulur.