﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:blogChannel="https://www.bilalafsar.com/"><channel><title>Bilâl AFŞAR - Bir .NET Yazılımcısının Notları</title><link>https://www.bilalafsar.com/</link><description>Bir .NET Yazılımcısının Notları</description><copyright>Copyright Bilâl AFŞAR</copyright><generator>https://www.bilalafsar.com/</generator><item><title>Xamarin.Forms Localhost Problemi</title><link>https://www.bilalafsar.com/Xamarin-Forms-Localhost-Problemi.aspx</link><description>&lt;p&gt;Bug&amp;uuml;nk&amp;uuml; yazım, Xamarin.Forms &amp;uuml;zerine...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Xamarin.Forms ile ilgilenmeye başladıktan sonra, hi&amp;ccedil; ş&amp;uuml;phesiz sunucu ile irtibat kurma ihtiyacı hissedeceksiniz. Xamarin.Forms'a yeni başlayıp hızlı ilerlemek isteyenlerin mutlaka karşılacakları problemlerden biri de, Visual Studio ile bize sunulan IIS Express hizmetinin sağladığı sunucu adresinin, mobil cihaz &amp;uuml;zerinde &amp;ccedil;alışamaması olacaktır.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bunun sebebi, IIS Express'in ağ erişimine kapalı olmasındandır. (Buna dair araştırma yapmadım ancak g&amp;ouml;r&amp;uuml;nen durum da bu)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bunu aşmak i&amp;ccedil;in, tavsiye edilen şey, IIS Express yerine doğrudan IIS kullanmaktır.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bunun i&amp;ccedil;in uygulanması gereken birka&amp;ccedil; adım var.&lt;/p&gt;
&lt;p&gt;&lt;!-- pagebreak --&gt;&lt;/p&gt;
&lt;p&gt;&amp;Ouml;ncelikle, Denetim Masasında "Windows &amp;ouml;zelliklerini a&amp;ccedil; veya kapat" ekranından "Internet Information Services" aktif h&amp;acirc;le getirilmelidir.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="https://www.bilalafsar.com/Upload/Images/Xamarin.Forms_LocalhostProblem/IISActivationScreen.png"&gt;&lt;img src="https://www.bilalafsar.com/Upload/Images/Xamarin.Forms_LocalhostProblem/IISActivationScreen.png" alt="IISActivationScreen" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ayrıca Visual Studio Installer ekranından "Development Time IIS Support" ("Geliştirme zamanı IIS desteği") işaretlenip kurulmalıdır.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="https://www.bilalafsar.com/Upload/Images/Xamarin.Forms_LocalhostProblem/VSDevelopmentTimeIISSupport.png"&gt;&lt;img alt="VSDevelopmentTimeIISSupport" src="https://www.bilalafsar.com/Upload/Images/Xamarin.Forms_LocalhostProblem/VSDevelopmentTimeIISSupport.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bu işlemden sonra, yapılması gereken, mobil uygulamanın bağlanacağı projenin ayarlarında, sunucu tercihini IIS Express'den IIS'e &amp;ccedil;evirmektir.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="https://www.bilalafsar.com/Upload/Images/Xamarin.Forms_LocalhostProblem/VSChangeIISExpressToIIS.png"&gt;&lt;img alt="VSChangeIISExpressToIIS" src="https://www.bilalafsar.com/Upload/Images/Xamarin.Forms_LocalhostProblem/VSChangeIISExpressToIIS.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bu değişiklikle beraber, &amp;ouml;rneğin http://localhost:50000/ şeklinde olan adres, http://localhost/ProjeAdi şeklinde değişecektir. Artık bu adres ile tarayıcınız &amp;uuml;zerinden sorgulamalar yapabilirsiniz.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ancak, bizim ihtiyacımız olan şey, bu adrese mobil cihaz &amp;uuml;zerinden bağlantı kurmak olduğu i&amp;ccedil;in, bu şekliyle bize &amp;ccedil;&amp;ouml;z&amp;uuml;m sunmayacaktır.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Mobil cihazlar, i&amp;ccedil;lerinden bir işletim sistemi barındırdıkları i&amp;ccedil;in, kendilerine ait bir localhost tanımı vardır. Bu sebeple,&amp;nbsp;&lt;span&gt;http://localhost/ProjeAdi&amp;nbsp;gibi&lt;/span&gt;&amp;nbsp;bir adres tarifi, mobil cihazın kendi b&amp;uuml;nyesinde olan bir adrese işaret edecektir.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Bu problemi aşmak i&amp;ccedil;in, sunucunun &amp;ccedil;alıştığı cihazın IP adresine ihtiyacımız olacaktır. Ancak DHCP sebebiyle, cihaz her a&amp;ccedil;ıldığında bu adres değişir. Bu y&amp;uuml;zden IP adresiniz sabitlememiz gerekmektedir.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Yazıyı gereksiz yere uzatmamak i&amp;ccedil;in, bunu anlatan &amp;ouml;rnek bir video adresi sunuyorum:&amp;nbsp;&lt;a target="_blank" title="https://www.youtube.com/watch?v=WbMOfTJGw9A" href="https://www.youtube.com/watch?v=WbMOfTJGw9A"&gt;https://www.youtube.com/watch?v=WbMOfTJGw9A&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;IP adresinize de sabitledikten sonra, tek yapmanız gereken, Xamarin.Forms projesi i&amp;ccedil;inde kullandığınız sunucu adresini,&amp;nbsp;&lt;span&gt;http://192.168.1.30/ProjeAdi şeklinde değiştirmek olacaktır. Mobil cihazınız ve sunucunuz aynı ağda olduğu i&amp;ccedil;in, problem &amp;ccedil;ıkarmadan &amp;ccedil;alışacaktır.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>11.07.2019 20:36:37</pubDate><author>Bilal AFŞAR | 11 Temmuz 2019 Perşembe 20:36</author></item><item><title>JQuery Marquee</title><link>https://www.bilalafsar.com/JQuery-Marquee.aspx</link><description>&lt;p&gt;Yeni bir makale ile tekrar merhaba.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Bu makalemizdeki mevzu, başlıktan da kısmen anlaşılacağı &amp;uuml;zere jQuery i&amp;ccedil;in yazdığım bir Marquee eklentisi &amp;uuml;zerine.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;Uuml;zerinde &amp;ccedil;alıştığım bir projede ihtiyacım olduğunda, klasik Marquee etiketinin obsolete -modası ge&amp;ccedil;miş- olarak işaretlendiğini ve muhtemelen birka&amp;ccedil; sene i&amp;ccedil;inde tarayıcı desteğinin de yok olacağını g&amp;ouml;r&amp;uuml;nce, bu işi yapacak jQuery plugin arama yoluna gittim. Ancak, karşıma &amp;ccedil;ok g&amp;uuml;zel eklentiler &amp;ccedil;ıkmış olmakla beraber, biri m&amp;uuml;stesna, hi&amp;ccedil;biri işimi g&amp;ouml;rmedi. İstisna&amp;icirc; olan ise maalesef hata barındırıyordu. Bundan dolayı kendi jQuery plugin dosyamı oluşturup kullanmayı tercih ettim.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Yazdığım plugin şu an gayet g&amp;uuml;zel şekilde &amp;ccedil;alışıyor. İhtiya&amp;ccedil; duyanların istifadesine de sunuyorum.&lt;br /&gt;&lt;br /&gt;(Dosyayı, makalenin sonundaki Github adresinden indirebilirsiniz.)&lt;br /&gt;&lt;!-- pagebreak --&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Şimdi de dilerseniz kısaca nasıl kullanılacağını anlatalım.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;İndirdiğiniz dosyayı&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;web projenize jQuery dosyasından sonra&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;referans olarak ekleyip, aşağıdaki gibi bir kod yazarak, eklentiyi &amp;ccedil;alıştırabilirsiniz.&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Varsayılan parametreler
$(".marqueeElement").SSMarquee();&lt;br /&gt;&lt;br /&gt;// Tercihe g&amp;ouml;re değiştirilmiş parametreler
$(".marqueeElement").SSMarquee({ direction: "bottom", speed: 30, scrollAmount: 1.2, pauseOnHover: false, bufferSize: 20 });&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;br /&gt;İkinci kullanım şeklinden de anlaşılacağı &amp;uuml;zere, kullanabileceğiniz 5 adet parametre mevcut:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;direction&lt;/strong&gt;: String tipinde değer alır.&amp;nbsp;Alabileceği değerler: "&lt;strong&gt;top&lt;/strong&gt;", "&lt;strong&gt;&lt;strong&gt;bottom&lt;/strong&gt;&lt;/strong&gt;","&lt;strong&gt;left&lt;/strong&gt;", "&lt;strong&gt;right&lt;/strong&gt;". Aldığı değerde belirtilen y&amp;ouml;ne hareket eder.&amp;nbsp;Değer verilmezse ya da yanlış bir değer g&amp;ouml;nderilirse, "&lt;strong&gt;top&lt;/strong&gt;" olarak ayarlanır.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;speed&lt;/strong&gt;: Milisaniye cinsinden hız. &lt;strong&gt;Integer &lt;/strong&gt;tipinde değer alır. 10 ile 70 aralığında olmalıdır. Asgar&amp;icirc; değerden k&amp;uuml;&amp;ccedil;&amp;uuml;k bir değer verildiğinde asgar&amp;icirc; değere, azam&amp;icirc; değerden b&amp;uuml;y&amp;uuml;k bir değer verildiğinde ise, azam&amp;icirc; değere ayarlanır. Ge&amp;ccedil;ersiz bir değer verildiğinde varsayılan değer olarak &lt;strong&gt;45&lt;/strong&gt; verilir.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;scrollAmount&lt;/strong&gt;: Her bir harekette, nesnenin kayacağı px miktarıdır. &lt;strong&gt;Float &lt;/strong&gt;tipinde değer alır. Sıfıra eşit, sıfırdan k&amp;uuml;&amp;ccedil;&amp;uuml;k ya da ge&amp;ccedil;ersiz bir değer girilirse, varsayılan değer olan &lt;strong&gt;1&lt;/strong&gt; olarak ayarlanır.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;pauseOnHover&lt;/strong&gt;: Nesne &amp;uuml;zerine gelindiğinde duraklama olup olmayacağını belirlemek &amp;uuml;zere, &lt;strong&gt;boolean &lt;/strong&gt;tipinde bir değer alır. Varsayılan değeri &lt;strong&gt;true&lt;/strong&gt;'dur. Ge&amp;ccedil;ersiz bir değer girildiğinde varsayılan değer ayarlanır.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;bufferSize&lt;/strong&gt;: Nesnenin gizlenmesi ile tekrar&amp;nbsp;&lt;/span&gt;g&amp;ouml;r&amp;uuml;nmesi&amp;nbsp;arasında ge&amp;ccedil;en s&amp;uuml;reyi uzatabilmek i&amp;ccedil;in eklenen, &lt;strong&gt;Integer &lt;/strong&gt;tipinde px cinsinden değer. Girilen değer b&amp;uuml;y&amp;uuml;d&amp;uuml;k&amp;ccedil;e, gizlenme ve tekrar g&amp;ouml;r&amp;uuml;nme arasındaki s&amp;uuml;re de uzar. Ge&amp;ccedil;ersiz ya da sıfırdan k&amp;uuml;&amp;ccedil;&amp;uuml;k bir değer girilirse, varsayılan değer olan &lt;strong&gt;10&lt;/strong&gt; olarak ayarlanır.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;Bunların yanısıra, responsive sitelerde ya da ekranın yeniden boyutlandırılmasında rahat kullanılabilmesi i&amp;ccedil;in gerekli destek mevcuttur. Ekran boyutu her değiştiğinde marquee baştan başlar.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Kullanım i&amp;ccedil;in dikkat edilmesi gereken tek bir nokta mevcut. Bu eklentiyi tatbik edeceğiniz nesnenin i&amp;ccedil;inde sadece bir element olmalıdır. Onun i&amp;ccedil;ine istediğiniz herşeyi koyabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style="font-size: 10pt;"&gt;&amp;Ouml;rnek i&amp;ccedil;in şu adrese bakabilirsiniz:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.bilalafsar.com/Upload/Files/jQuery.SSMarquee.Demo.html" target="_blank"&gt;jQuery.SSMarquee &amp;Ouml;rnek&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a href="https://www.bilalafsar.com/Upload/Files/jQuery.SSMarquee.Demo.html" target="_blank"&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt;Projeyi GitHub &amp;uuml;zerinden yayınladım.&amp;nbsp;&lt;/span&gt;&lt;span&gt;Projenin hem sıkıştırılmış hem de normal h&amp;acirc;li mevcut.&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a style="font-size: 10pt;" href="https://github.com/bafsar/jQuery.SSMarquee" target="_blank"&gt;Adrese ulaşmak i&amp;ccedil;in, buraya tıklayabilir ve a&amp;ccedil;ılan sayfadan istediğiniz dosyayı indirebilirsiniz.&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a style="font-size: 10pt;" href="https://github.com/bafsar/jQuery.SSMarquee" target="_blank"&gt;&lt;/a&gt;&lt;span style="font-size: 10pt;"&gt;Şimdilik bu kadar...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Hoş&amp;ccedil;akalın.&lt;/span&gt;&lt;/p&gt;</description><pubDate>18.03.2017 02:07:31</pubDate><author>Bilal AFŞAR | 18 Mart 2017 Cumartesi 02:07</author></item><item><title>WPF TextBox İçindeki Yazının Hepsini Seçmek (SelectAll)</title><link>https://www.bilalafsar.com/WPF-TextBox-Icindeki-Yazinin-Hepsini-Secmek-SelectAll-.aspx</link><description>&lt;p&gt;Uzun bir aradan sonra tekrar merhaba,&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Bu makalemiz, başlıktan da anlaşılacağı &amp;uuml;zere, WPF'te bir TextBox kontrol&amp;uuml;n&amp;uuml;n i&amp;ccedil;indeki yazının tamamının nasıl se&amp;ccedil;ileceği &amp;uuml;zerine.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Uzun zamandır WPF ile uğraşanların muhtemelen &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;k&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;arşılaştıkları bir problemdir bu. WPF i&amp;ccedil;inde, dahili olarak, TextBox i&amp;ccedil;in otomatik metin se&amp;ccedil;imi mevcut değil. Bunun i&amp;ccedil;in birka&amp;ccedil; yol kullanmak m&amp;uuml;mk&amp;uuml;n.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Bunlardan biri, her TextBox kontrol&amp;uuml;ne SelectionStart ve SelectionLength değeri vermek şeklinde ger&amp;ccedil;ekleştirilebilir:&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;TextBox SelectionStart="0" SelectionLength="1000" /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Burada SelectionLength i&amp;ccedil;in verilen değer, toplam karakter sayısından b&amp;uuml;y&amp;uuml;k olabilir. Bu, herhangi bir problem oluşturmayacaktır. Ancak bu kullanım şeklinde, SelectionStart ve SelectionLength ifadelerini, her TextBox kontrol&amp;uuml; i&amp;ccedil;in tek tek yazmamız gereklidir. Bu ise toplu olarak kontrol&amp;uuml; olduk&amp;ccedil;a zorlaştıran bir yol olacaktır.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;!-- pagebreak --&gt;&lt;/p&gt;
&lt;p&gt;Toplu olarak bu işlemi yapmak i&amp;ccedil;in, property'leri Style i&amp;ccedil;inde oluşturmak daha doğru bir yol olmakla beraber,&amp;nbsp;&lt;span&gt;SelectionStart ve SelectionLength&lt;/span&gt;&lt;span&gt;&amp;nbsp;property'lerinin her ikisi de DependencyObject t&amp;uuml;r&amp;uuml;nde olmadıkları i&amp;ccedil;in, Style i&amp;ccedil;inde yazılamazlar.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Bu sebeplerle, bu us&amp;ucirc;lde kullanım pek doğru bir tercih olmayacaktır.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Diğer bir kullanım şekli olarak, App.xaml.cs i&amp;ccedil;inde&amp;nbsp;&lt;/span&gt;&lt;span class="typ" style="font-size: 10pt;"&gt;EventManager&lt;/span&gt;&lt;span class="pun" style="font-size: 10pt;"&gt;.&lt;/span&gt;&lt;span class="typ" style="font-size: 10pt;"&gt;RegisterClassHandler methodunu kullanarak RoutedEvent'leri yakalama yolu tercih edilebilir. Ancak bu da her projede bu kodu tek tek yapıştırmayı gerektireceği i&amp;ccedil;in pek kullanışlı bir yol olarak g&amp;ouml;r&amp;uuml;nm&amp;uuml;yor. Yine de nasıl olacağına bakmak isterseniz şu adreslerden faydalanabilirsiniz:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight: bold; font-size: 10pt;"&gt;&lt;a target="_blank" href="https://www.intertech.com/Blog/how-to-select-all-text-in-a-wpf-textbox-on-focus/"&gt;https://www.intertech.com/Blog/how-to-select-all-text-in-a-wpf-textbox-on-focus/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;a target="_blank" href="http://stackoverflow.com/a/2553297/2374053"&gt;http://stackoverflow.com/a/2553297/2374053&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;a target="_blank" href="http://madprops.org/blog/wpf-textbox-selectall-on-focus/"&gt;http://madprops.org/blog/wpf-textbox-selectall-on-focus/&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Diğer bir yol da AttachedProperty kullanmaktır ki, bu makalede g&amp;ouml;stermek istediğim de buydu zaten.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Evvela, temel olarak aldığım kodları sizlere sunmalıyım:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;a target="_blank" href="http://stackoverflow.com/a/2674291/2374053"&gt;http://stackoverflow.com/a/2674291/2374053&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Karşınıza &amp;ccedil;ıkan kodlar, tatbik edildiği her TextBox kontrol&amp;uuml;nde ger&amp;ccedil;ekleşen her bir focus event'inde, TextBox i&amp;ccedil;indeki b&amp;uuml;t&amp;uuml;n yazıyı tamamen se&amp;ccedil;ecektir. Bu ise kısmen iş g&amp;ouml;rmekle beraber, yine de eksik kalmaktadır.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;İşte bu kısımda kendi kodlarımı geliştirme ihtiyacı hissettim ve size de bunu sunuyorum.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Buradaki mantık, &amp;uuml;sttekinden farklı olarak, d&amp;ouml;rt ayrı senaryo &amp;uuml;zerine kurulu. Bunlar:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- Yazıyı sadece ilk focus event'i ger&amp;ccedil;ekleştiğinde tamamen se&amp;ccedil;mek ve daha sonraki focus işlemlerinde, yazının son se&amp;ccedil;ilen kısmını aynen bırakmak&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- Yazıyı sadece ilk focus event'i ger&amp;ccedil;ekleştiğinde tamamen se&amp;ccedil;mek ve sonrakilerde asla se&amp;ccedil;memek,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- Yazıyı her focus event'i ger&amp;ccedil;ekleştiğinde tamamen se&amp;ccedil;mek,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- Yazıyı &lt;span&gt;her focus event'i ger&amp;ccedil;ekleştiğinde &lt;/span&gt;&lt;span&gt;hi&amp;ccedil; se&amp;ccedil;memek (var olan se&amp;ccedil;imi kaldırmak)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;şeklinde ifade edilebilir.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Şimdi dilerseniz kodlara bir g&amp;ouml;z gezdirin.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;namespace WPF.AttachedProperties
{
    public enum SelectAllMode
    {
        /// &lt;summary&gt;        ///     On first focus, it selects all then leave off textbox and doesn't check again
        /// &lt;/summary&gt;        OnFirstFocusThenLeaveOff = 0,

        /// &lt;summary&gt;        ///     On first focus, it selects all then never selects
        /// &lt;/summary&gt;        OnFirstFocusThenNever = 1,

        /// &lt;summary&gt;        ///     Selects all on every focus
        /// &lt;/summary&gt;        OnEveryFocus = 2,

        /// &lt;summary&gt;        ///     Never selects text (WPF's default attitude)
        /// &lt;/summary&gt;        Never = 4
    }

    public partial class TextBox : DependencyObject
    {
        public static readonly DependencyProperty SelectAllModeProperty = DependencyProperty.RegisterAttached(
            "SelectAllMode",
            typeof(SelectAllMode?),
            typeof(TextBox),
            new PropertyMetadata(SelectAllModePropertyChanged));

        private static void SelectAllModePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is System.Windows.Controls.TextBox)
            {
                var textBox = d as System.Windows.Controls.TextBox;

                if (e.NewValue != null)
                {
                    textBox.GotKeyboardFocus += OnKeyboardFocusSelectText;
                    textBox.PreviewMouseLeftButtonDown += OnMouseLeftButtonDown;
                }
                else
                {
                    textBox.GotKeyboardFocus -= OnKeyboardFocusSelectText;
                    textBox.PreviewMouseLeftButtonDown -= OnMouseLeftButtonDown;
                }
            }
        }

        private static void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var dependencyObject = GetParentFromVisualTree(e.OriginalSource);

            if (dependencyObject == null)
                return;

            var textBox = (System.Windows.Controls.TextBox) dependencyObject;
            if (!textBox.IsKeyboardFocusWithin)
            {
                textBox.Focus();
                e.Handled = true;
            }
        }

        private static DependencyObject GetParentFromVisualTree(object source)
        {
            DependencyObject parent = source as UIElement;
            while (parent != null &amp;amp;&amp;amp; !(parent is System.Windows.Controls.TextBox))
            {
                parent = VisualTreeHelper.GetParent(parent);
            }

            return parent;
        }

        private static void OnKeyboardFocusSelectText(object sender, KeyboardFocusChangedEventArgs e)
        {
            var textBox = e.OriginalSource as System.Windows.Controls.TextBox;
            if (textBox == null) return;

            var selectAllMode = GetSelectAllMode(textBox);

            if (selectAllMode == SelectAllMode.Never)
            {
                textBox.SelectionStart = 0;
                textBox.SelectionLength = 0;
            }
            else
                textBox.SelectAll();

            if (selectAllMode == SelectAllMode.OnFirstFocusThenNever)
                SetSelectAllMode(textBox, SelectAllMode.Never);
            else if (selectAllMode == SelectAllMode.OnFirstFocusThenLeaveOff)
                SetSelectAllMode(textBox, null);
        }

        [AttachedPropertyBrowsableForChildren(IncludeDescendants = false)]
        [AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.TextBox))]
        public static SelectAllMode? GetSelectAllMode(DependencyObject @object)
        {
            return (SelectAllMode) @object.GetValue(SelectAllModeProperty);
        }

        public static void SetSelectAllMode(DependencyObject @object, SelectAllMode? value)
        {
            @object.SetValue(SelectAllModeProperty, value);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Oluşturduğumuz bu attachedproperty'yi kullanmak i&amp;ccedil;in yapmanız gereken, ş&amp;ouml;yle bir kod yazmaktan ibarettir.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;!-- İlk focus event'inde b&amp;uuml;t&amp;uuml;n yazıyı se&amp;ccedil;er ve sonrasında yazının son se&amp;ccedil;ilen kısmını aynen bırakır --&amp;gt;
&amp;lt;TextBox attprop:TextBox.SelectAllMode="OnFirstFocusThenLeaveOff" /&amp;gt;

&amp;lt;!-- İlk focus event'inde b&amp;uuml;t&amp;uuml;n yazıyı se&amp;ccedil;er ve sonrakilerde asla se&amp;ccedil;ili olmamasını sağlar --&amp;gt;
&amp;lt;TextBox attprop:TextBox.SelectAllMode="OnFirstFocusThenNever" /&amp;gt;

&amp;lt;!-- Her focus event'i &amp;ccedil;alıştığında yazının tamamını se&amp;ccedil;er --&amp;gt;
&amp;lt;TextBox attprop:TextBox.SelectAllMode="OnEveryFocus" /&amp;gt;

&amp;lt;!-- Her focus event'i &amp;ccedil;alıştığında yazının se&amp;ccedil;ili olmamasını sağlar ve cursor'&amp;uuml; satırın başına alır --&amp;gt;
&amp;lt;TextBox attprop:TextBox.SelectAllMode="Never" /&amp;gt;
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;B&amp;ouml;yle bir kullanım ise, daha evvel bahsettiğim gibi, toplu olarak değişiklik yapmayı zor h&amp;acirc;le getirir. Bunun i&amp;ccedil;in tercih edilebilecek bir yol ise Style kullanımıdır:&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;Style TargetType="{x:Type TextBox}"&amp;gt;
    &amp;lt;Setter Property="attprop:TextBox.SelectAllMode" Value="OnFirstFocusThenLeaveOff" /&amp;gt;
&amp;lt;/Style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;İsterseniz, bu style'a Key değeri vererek sadece belirli yerlerde kullanmayı tercih edebilirsiniz. Ancak buradaki gibi kullanırsanız, yazdığınız style kodu b&amp;uuml;t&amp;uuml;n TextBox'lara tatbik edilecektir.&lt;br /&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Buradakiler haricinde başka kullanım şekilleri de elbette mevcuttur. Biraz araştırma yaparak ortaya birşeyler &amp;ccedil;ıkarmak m&amp;uuml;mk&amp;uuml;n.&lt;br /&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;a target="_blank" href="http://stackoverflow.com/a/42288384/2374053"&gt;Bu makalenin mevzuunu oluşturan kodları, StackOverFlow &amp;uuml;zerinde de bulabilirsiniz.&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;Ayrıca, aynı sayfada diğer kullanıcılara ait diğer kullanım şekillerine de g&amp;ouml;z atabilir ve daha farklı yollar geliştirebilirsiniz.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 10pt;"&gt;&lt;br /&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;WPF hakkındaki ilk yazım olan bu makale de buraya kadar. Yakın zamanda yeni makaleler sunabilmek dileğiyle, hoş&amp;ccedil;akalın...&lt;/div&gt;</description><pubDate>17.02.2017 17:19:26</pubDate><author>Bilal AFŞAR | 17 Şubat 2017 Cuma 17:19</author></item><item><title>FastReport.Net ile Seçili Satırların Raporlanması</title><link>https://www.bilalafsar.com/FastReport-Net-ile-Secili-Satirlarin-Raporlanmasi.aspx</link><description>&lt;p&gt;Tekrar merhaba,&lt;/p&gt;
&lt;p&gt;Bu seferki makalemiz yine FastReport.Net &amp;uuml;zerine...&lt;/p&gt;
&lt;p&gt;Bu makalede ise DataGridView &amp;uuml;zerinde se&amp;ccedil;ili satırların nasıl raporlanabileceğini incelemeye &amp;ccedil;alışacağız.&lt;/p&gt;
&lt;p&gt;Aslında bu makale, temel olarak '&lt;a href="http://www.bilalafsar.com/FastReport-Net-Kullanimi-Visual-Studio-Integration.aspx" style="color: #292929; text-decoration: none;" target="_blank"&gt;FastReport.Net Kullanımı - Visual Studio Integration&lt;/a&gt;' başlıklı yazıdan &amp;ccedil;ok farklı değil. Aynı bilgileri, ancak farklı veritabanı ve&amp;nbsp;nesne tiplerini kullanarak, başka bir işlem ger&amp;ccedil;ekleştireceğiz.&lt;/p&gt;
&lt;p&gt;Makalenin mevzuu olan kodlara geri d&amp;ouml;nelim.&lt;br /&gt;&lt;br /&gt;&lt;!-- pagebreak --&gt;&lt;span style="font-size: 10pt;"&gt;Formumuzun g&amp;ouml;r&amp;uuml;nt&amp;uuml;s&amp;uuml; şu şekilde olacak:&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;
&lt;a href="https://www.bilalafsar.com/Upload/Images/FastReportSample_001_Resim001.png"&gt;
&lt;img src="https://www.bilalafsar.com/Upload/Images/FastReportSample_001_Resim001.png" alt="FastReportSample_001_Resim001.png" /&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Forma ait kodlarımız da burada:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
public partial class BookList : Form
{
   public BookList()
   {
      InitializeComponent();
      dgv.DataSource = GetList(); // Listeyi y&amp;uuml;kl&amp;uuml;yoruz.
   }

   /// &amp;lt;summary&amp;gt;
   /// Sadece se&amp;ccedil;ili satırları rapora y&amp;uuml;kler ve raporu g&amp;ouml;sterir.
   /// &amp;lt;/summary&amp;gt;
   /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;
   /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;
   private void ReportSelectedRows_Click(object sender, EventArgs e)
   {
      DataTable dt = GetFilledDataTableForReport(dgv);
      if (dt != null)
         CreateReport(dt);
   }

   /// &amp;lt;summary&amp;gt;
   /// B&amp;uuml;t&amp;uuml;n satırları rapora y&amp;uuml;kler ve raporu g&amp;ouml;sterir.
   /// &amp;lt;/summary&amp;gt;
   /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;
   /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;
   private void ReportAllRows_Click(object sender, EventArgs e)
   {
      DataTable dt = GetFilledDataTableForReport(dgv, false);
      if (dt != null)
         CreateReport(dt);
   }

   /// &amp;lt;summary&amp;gt;
   /// Veritabanından kitap listesini &amp;ccedil;eker ve geriye d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.
   /// &amp;lt;/summary&amp;gt;
   /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
   List&amp;lt;BookInfoModel&amp;gt; GetList()
   {
      using (DBDataContext db = new DBDataContext())
      {
         return db.Books.OrderBy(x =&amp;gt; x.Type.Name)
                        .ThenBy(x =&amp;gt; x.Writer.Name)
                        .Select(x =&amp;gt; new BookInfoModel()
                        {
                           Type = x.Type.Name,
                           Writer = x.Writer.Name,
                           Book = x.Name
                        })
                  .ToList();
      }
   }

   /// &amp;lt;summary&amp;gt;
   /// Rapor olarak sunulacak olan bilgileri DataTable'a y&amp;uuml;kler
   /// ve bu DataTable'ı geriye d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.
   /// &amp;lt;/summary&amp;gt;
   /// &amp;lt;param name="dgv"&amp;gt;&amp;lt;/param&amp;gt;
   /// &amp;lt;param name="onlySelectedRows"&amp;gt;Sadece se&amp;ccedil;ili satırların
   /// y&amp;uuml;klenip y&amp;uuml;klenmeyeceğini belirler.&amp;lt;/param&amp;gt;
   /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
   DataTable GetFilledDataTableForReport(DataGridView dgv, bool onlySelectedRows = true)
   {
      // Sadece se&amp;ccedil;ili satırlar talep edildiyse ve hi&amp;ccedil; satır se&amp;ccedil;ilmemişse
      if (onlySelectedRows &amp;amp;&amp;amp; dgv.SelectedRows.Count &amp;lt; 1)
      {
         MessageBox.Show("Se&amp;ccedil;ili satır bulunamadığı i&amp;ccedil;in işlem iptal edildi.",
                         "Ge&amp;ccedil;ersiz İşlem", MessageBoxButtons.OK, MessageBoxIcon.Hand);
         return null;
      }

      DataTable dt = new DataTable();
      dt.Columns.AddRange(new DataColumn[] 
      { 
         new DataColumn("Book"),
         new DataColumn("Type"),
         new DataColumn("Writer") 
      });

      List&amp;lt;DataGridViewRow&amp;gt; rc;

      if (onlySelectedRows)
         rc = dgv.SelectedRows.Cast&amp;lt;DataGridViewRow&amp;gt;().ToList();
      else
         rc = dgv.Rows.Cast&amp;lt;DataGridViewRow&amp;gt;().ToList();

      for (int i = 0; i &amp;lt; rc.Count; i++)
      {
         dt.Rows.Add(
            rc[i].Cells[0].Value.ToString(),
            rc[i].Cells[1].Value.ToString(),
            rc[i].Cells[2].Value.ToString()
         );
      }

      return dt;
   }

   /// &amp;lt;summary&amp;gt;
   /// Raporu oluşturur.
   /// &amp;lt;/summary&amp;gt;
   /// &amp;lt;param name="data"&amp;gt;Rapora y&amp;uuml;klenecek olan veri&amp;lt;/param&amp;gt;
   private void CreateReport(DataTable data)
   {
      // Rapor dosyasını oluşturuyoruz.
      Report report = new Report();

      // Programla aynı dizinden şablon olarak kullandığımız raporu y&amp;uuml;kl&amp;uuml;yoruz.
	  report.Load("Report_Sample.frx");

      // Gelen verileri şablon olarak oluşturduğumuz rapor i&amp;ccedil;erisinde
      // ismi belirtilen tabloya register ediyoruz.
      report.RegisterData(data, "BooksWithTypes");

      // Raporu hazırlıyoruz.
      if (report.Prepare())
      {
         // Hazırlanmış olan raporun g&amp;ouml;sterilmesini sağlıyoruz.
         report.ShowPrepared();
      }
   }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ve bu da modelleme gayesiyle oluşturduğumuz class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
public class BookInfoModel
{
   public string Book { get; set; }
   public string Type { get; set; }
   public string Writer { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;p&gt;Kodları temel itibariyle&amp;nbsp;bu mantık &amp;uuml;zerinde (ya da &amp;nbsp;daha da geliştirerek) oluşturursanız; istediğiniz satırları rapor dosyasına g&amp;ouml;ndererek, sadece onların raporlanmasını sağlayabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.bilalafsar.com/FileHandler.ashx?FileID=237"&gt;&amp;Ouml;rnek kodları buradan indirebilirsiniz&lt;/a&gt;.&amp;nbsp;Zip i&amp;ccedil;indeki db.sql dosyası ile veritabanını&amp;nbsp;oluşturduktan sonra app.config i&amp;ccedil;indeki adres bilgisini&amp;nbsp;kendi SQL sunucunuza ait bilgi ile değiştirerek&amp;nbsp;doğrudan kodları &amp;ccedil;alıştırabilirsiniz.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Biraz kısa bir yazı oldu aslında ama zaten kodların aralarında&amp;nbsp;yeterince a&amp;ccedil;ıklama mevcut.&lt;/p&gt;
&lt;p&gt;Tekrar g&amp;ouml;r&amp;uuml;ş&amp;uuml;nceye kadar hoş&amp;ccedil;akalın...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>6.01.2015 01:46:34</pubDate><author>Bilal AFŞAR | 6 Ocak 2015 Salı 01:46</author></item><item><title>jQuery Post Yoluyla JS Array ve ASP.NET MVC Bağlantısı Oluşturma</title><link>https://www.bilalafsar.com/jQuery-Post-Yoluyla-JS-Array-ve-ASP-NET-MVC-Baglantisi-Olusturma.aspx</link><description>&lt;p&gt;Merhaba,&lt;/p&gt;
&lt;p&gt;Yaptığı işlerde AJAX &amp;uuml;zerinden veri aktarımını tercih eden bir programcı olarak yakın zamanda karşılaştığım bir sıkıntının &amp;ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;n&amp;uuml; makale olarak eklemeyi tercih ettim.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:10pt"&gt;Aynı zamanda, bu makale bir nev'&amp;icirc;, başka bir makalenin terc&amp;uuml;mesi olarak kabul edilebilir. Zira burada vermek istediğim bilgilerin teferruatlı halini orada bulmak m&amp;uuml;mk&amp;uuml;n. Elbette mevzu-ı bahs olan bu makalenin referansını yazının sonunda bulabilirsiniz.&lt;br /&gt;&lt;br /&gt;Gelelim mevzuumuza;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:10pt"&gt;AJAX &amp;uuml;zerinden server ile haberleşiyor ve server tarafında da ASP.NET MVC kullanıyorsanız, server'a bilgi olarak aşağıdaki şekilde bir array g&amp;ouml;nderdiğinizde hata almanız muhakkaktır.&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
var Sayilar = [1,2,3,4];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-size:10pt"&gt;Dilerseniz bunu bir &amp;ouml;rnekle daha da a&amp;ccedil;alım.&lt;br /&gt;&lt;!-- pagebreak --&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Client tarafında;&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$("#Gonder").on("click", function () {
      var Sayilar = [1, 2, 3, 4];

      $.ajax({
            url: "/Home/DegerleriKaydet",
            data: { sayilar: Sayilar },
            type: "POST",
            success: function (returnData) {
                  alert(returnData);
            }
      });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;span&gt;ve server tarafında da;&lt;/span&gt;
&lt;pre&gt;&lt;code&gt;
[HttpPost]
public JsonResult DegerleriKaydet(IEnumerable&lt;int&gt; sayilar)
{
      return Json(sayilar);
}
&lt;/int&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;kodlarının bulunduğunu farzedelim.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Bu halde iken server tarafına g&amp;ouml;nderdiğiniz kodlar ulaşmayacaktır. Bu problemi gidermek i&amp;ccedil;in yapmanız gereken tek şey ise client tarafındaki kodu şu şekilde değiştirmek olacaktır:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$("#Gonder").on("click", function () {
      var Sayilar = [1, 2, 3, 4];

      $.ajax({
            url: "/Home/DegerleriKaydet",
            data: { sayilar: Sayilar },
            type: "POST",
            traditional: true,       // Eklenen satır
            success: function (returnData) {
                  alert(returnData);
            }
      });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Kodu bu şekilde değiştirdikten sonra g&amp;ouml;nderdiğiniz bilgiler doğru şekilde server tarafına ulaşacaktır.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;Uuml;mid ederim, faydalı olur.&lt;/p&gt;
&lt;p&gt;Bu makaleye kaynaklık eden diğer makaleye de şu linkten ulaşabilirsiniz:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://kakimotonline.com/2011/04/21/binding-js-array-to-c-list-in-asp-net-mvc/"&gt;BINDING JS ARRAY TO C# LIST IN ASP.NET MVC&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bir sonraki makaleye kadar, hoş&amp;ccedil;akalın...&lt;/p&gt;</description><pubDate>30.12.2014 14:42:00</pubDate><author>Bilal AFŞAR | 30 Aralık 2014 Salı 14:42</author></item><item><title>Bakış Açısı...</title><link>https://www.bilalafsar.com/Bakis-Acisi-.aspx</link><description>&lt;p style="text-align: center;"&gt;
&lt;a href="https://www.bilalafsar.com/Upload/Images/How-users-see-programmers-and-how-programmers-see-users.jpg"&gt;
&lt;img alt="How-users-see-programmers-and-how-programmers-see-users.jpg" src="https://www.bilalafsar.com/Upload/Images/How-users-see-programmers-and-how-programmers-see-users.jpg" /&gt;
&lt;/a&gt;
&lt;/p&gt;</description><pubDate>15.12.2014 03:24:00</pubDate><author>Bilal AFŞAR | 15 Aralık 2014 Pazartesi 03:24</author></item><item><title>JavaScript XML Açıklama/Yorum (Documentation) Satırları</title><link>https://www.bilalafsar.com/JavaScript-XML-Aciklama-Yorum-Documentation-Satirlari.aspx</link><description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
                                            Visual Studio &amp;uuml;zerinde geliştirme yapan programcılar, yazdıkları kodların ne işe yaradığını hatırlamak maksadıyla methodlar &amp;uuml;zerinde a&amp;ccedil;ıklama satırları bırakırlar.&lt;br /&gt;
                                            &amp;nbsp;
                                        &lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
                                            Bu satırların a&amp;ccedil;ıklama maksatlı olduğunu belirtmek i&amp;ccedil;in dilden dile farklı işaretler kullanılmaktadır. Ems&amp;acirc;l olarak C# i&amp;ccedil;inde kullanılan // ve VB i&amp;ccedil;inde kullanılan ise ' işaretleri g&amp;ouml;sterilebilir.&lt;br /&gt;
                                            &amp;nbsp;
                                        &lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
                                            JavaScript &amp;uuml;zerinde de yine aynı şekilde a&amp;ccedil;ıklama satırları oluşturmayı sağlayan belli karakterler mevcuttur. Bu yazıda bu karakterleri, standart a&amp;ccedil;ıklama satırlarını ve bilhassa da XML a&amp;ccedil;ıklama (documentation) i&amp;ccedil;in gerekli olan satırları, kısaca anlatmaya &amp;ccedil;alışacağım.&lt;br /&gt;
                                            &lt;!-- pagebreak --&gt;
                                        &lt;/div&gt;
&lt;div&gt;
                                            &lt;br /&gt;
                                            JavaScript kodlama da kullanılan a&amp;ccedil;ıklama/yorum satırları C# ile &amp;ccedil;ok benzerlik g&amp;ouml;stermektedir. Ancak bazı noktalarda farklılıklar ihtiva etmektedir.&lt;br /&gt;
                                            &amp;nbsp;
                                        &lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
                                            Mesela, kod bloğu i&amp;ccedil;erisinde herhangi bir yerde tek satırlık bir a&amp;ccedil;ıklama koyacaksak aşağıdaki kullanım yeterlidir:&lt;br /&gt;
                                            &amp;nbsp;
                                        &lt;/div&gt;
&lt;pre&gt;&lt;code&gt;
// A&amp;ccedil;ıklama Satırı
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
                                            Ancak maksadımız birden fazla satırdan oluşan a&amp;ccedil;ıklamalar eklemek ise, ekleyeceğiniz satırlar ş&amp;ouml;yle olmalıdır:
                                        &lt;/div&gt;
&lt;pre&gt;&lt;code&gt;
/*
 A&amp;ccedil;ıklama satırı 1
 A&amp;ccedil;ıklama satırı 2
 A&amp;ccedil;ıklama satırı 3
*/
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
                                            Şu ana kadar ki a&amp;ccedil;ıklama satırları, C# ve JavaScript kodlama da tamamen aynıdır, ancak bu satırlar temel olarak kod dosyasının i&amp;ccedil;ine baktığınız zaman size bilgi sunabilirler.&lt;br /&gt;
                                            &amp;nbsp;
                                        &lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Eğer g&amp;ouml;rmek istediğiniz; herhangi bir function'ı kullanmak istediğinizde karşınıza &amp;ccedil;ıkması gereken a&amp;ccedil;ıklama satırları ise; bahsi ge&amp;ccedil;en a&amp;ccedil;ıklama satırlarından istediğinizi, doğrudan function'ın başladığı satırın &amp;uuml;zerine ekleyerek şu iki yolla da kullanabilirsiniz:&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;strong&gt;1. Yol:&lt;/strong&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;
// A&amp;ccedil;ıklama Satırı
function add(){}
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
                                            &lt;br /&gt;&lt;strong&gt;
                                            2. Yol:&lt;/strong&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;
/*
   A&amp;ccedil;ıklama Satırı 1
   A&amp;ccedil;ıklama Satırı 2
   A&amp;ccedil;ıklama Satırı 3
*/
function add(){}
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
                                            &lt;br /&gt;
                                            Bu şekilde kullanımlara rağmen XML a&amp;ccedil;ıklamaları i&amp;ccedil;in uygun olan kullanım şekli bunlar değildir. &amp;Uuml;stelik bu kullanım şekilleri ile parametreleri ve a&amp;ccedil;ıklamalarını, ilgili parametrenin yazımı sırasında g&amp;ouml;rmek yerine doğrudan function adını yazdığınız sırada g&amp;ouml;r&amp;uuml;rs&amp;uuml;n&amp;uuml;z.&lt;br /&gt;
                                            &amp;nbsp;
                                        &lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Bu sebeplerledir ki function'lar i&amp;ccedil;in gerekli a&amp;ccedil;ıklama satırlarını aşağıdaki şekillerde yazmak gereklidir.&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;
function Get(str) {
    /// &amp;lt;summary&amp;gt;Function'a ait a&amp;ccedil;ıklamalar&amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="str" type="String"&amp;gt;Bir String Değer&amp;lt;/param&amp;gt;
    /// &amp;lt;returns type="String" /&amp;gt;
    return str;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
                                            &lt;br /&gt;
                                            Buradaki kullanım şeklinde &lt;strong&gt;&amp;lt;summary&amp;gt;&amp;lt;/summary&amp;gt;&lt;/strong&gt; arasına yazılan ifade function'ın ne iş yaptığını belirtir. &lt;strong&gt;&amp;lt;param&amp;gt;&amp;lt;/param&amp;gt;&lt;/strong&gt; arasına yazılanlar ise her bir parametre hakkında bilgi i&amp;ccedil;erir. &lt;strong&gt;&amp;lt;param&amp;gt;&lt;/strong&gt; i&amp;ccedil;erisine yazılan name ifadesi, a&amp;ccedil;ıklama satırının hangi parametreye ait olduğunu belirtmek i&amp;ccedil;in kullanılır ve yazılması mecburidir. Aksi durumda parametreye ait a&amp;ccedil;ıklama g&amp;ouml;sterilmeyecektir. type ifadesi ise g&amp;ouml;nderilen parametrenin tipini belirtmek i&amp;ccedil;in kullanılır ancak kullanılması mecburi değildir. Ayrıca i&amp;ccedil;erisine yazılan ifade de yalnızca hatırlatma maksadı taşır. Bu sebeple standart değişken tipleri yerine herhangi bir kelime yazabilir, hatta birden fazla kelimeyi aralarında boşluk bırakarak bile ekleyebilirsiniz. Son olarak &lt;strong&gt;&amp;lt;returns /&amp;gt;&lt;/strong&gt; satırı ile d&amp;ouml;necek olan bilgi hakkında a&amp;ccedil;ıklama ekleyebilirsiniz ancak bu satırda mecburi değildir.
                                        &lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
                                            &lt;br /&gt;
                                            XML a&amp;ccedil;ıklamaları i&amp;ccedil;in eklenebilecek olan daha da g&amp;uuml;zel diğer bir kullanım şekli ise ş&amp;ouml;yledir:
                                        &lt;/div&gt;
&lt;pre&gt;&lt;code&gt;
function Get(a, c) {
    /// &amp;lt;signature&amp;gt;
    /// &amp;lt;summary&amp;gt;Birinci overload function a&amp;ccedil;ıklama satırı&amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="b" type="Number"&amp;gt;Bir rakam.&amp;lt;/param&amp;gt;
    /// &amp;lt;returns type="Number" /&amp;gt;
    /// &amp;lt;/signature&amp;gt;
    /// &amp;lt;signature&amp;gt;
    /// &amp;lt;summary&amp;gt;İkinci overload function a&amp;ccedil;ıklama satırı&amp;lt;/summary&amp;gt;
    /// &amp;lt;param name="a" type="String"&amp;gt;Bir string.&amp;lt;/param&amp;gt;
    /// &amp;lt;returns type="Number" /&amp;gt;
    /// &amp;lt;/signature&amp;gt;
    return a;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
                                            &lt;br /&gt;
                                            Buradaki a&amp;ccedil;ıklama satırları bazı farklar dışında bir &amp;ouml;nceki ile hemen hemen aynıdır. Temel fark şu ki &lt;strong&gt;&amp;lt;signature&amp;gt;&amp;lt;/signature&amp;gt;&lt;/strong&gt; ifadeleri, bu function'ın overload edildiğini (aşırı y&amp;uuml;klendiğini) ifade etmek i&amp;ccedil;in kullanılmaktadır. Ancak dikkat etmek gereken bir nokta var ki buradaki overload ifadesi Visual Studio dillerinde olduğu gibi aynı isimde birden fazla method tanımlama şeklinde değildir. Buradaki husus bunun dışında olduğu i&amp;ccedil;in, bu mevzuyu es ge&amp;ccedil;iyorum. Dileyenler '&lt;a href="https://duckduckgo.com/?q=javascript+function+overload" target="_blank"&gt;JavaScript Function Overload&lt;/a&gt;' ifadesi ile arama yaparak gerekli bilgiye ulaşabilirler.&lt;br /&gt;
                                            &lt;br /&gt;
                                            Tekrar mevzuumuza d&amp;ouml;necek olursak; her &lt;strong&gt;&amp;lt;signature&amp;gt;&amp;lt;/signature&amp;gt;&lt;/strong&gt;&amp;nbsp;arasına yazılan ifade(ler) ayrı overload işlemlerine ait a&amp;ccedil;ıklamaları i&amp;ccedil;erir(ler). Bir &amp;ouml;nceki kullanım şeklinden farklı olarak burada parametre ismini doğru yazmak mecburi değildir. Dilerseniz farklı isimler ile parametreleri g&amp;ouml;sterebilirsiniz. Misal olarak buradaki ilk &lt;strong&gt;&amp;lt;signature&amp;gt;&lt;/strong&gt; i&amp;ccedil;inde yer alan parametrenin name ifadesinde b yazmaktadır. Ancak bu kullanımda a&amp;ccedil;ıklamalar ile parametrelerlerin eşleştirilmesi yerine doğrudan &lt;strong&gt;&amp;lt;signature&amp;gt;&lt;/strong&gt; i&amp;ccedil;inde yazan ifadeler doğru kabul edildiğinden a&amp;ccedil;ıklama satırları g&amp;ouml;r&amp;uuml;nt&amp;uuml;lenecektir. Hatta function parametre almasa, başka isimlerde parametre alsa ya da belirtilenden fazla parametre bile alsa, &lt;strong&gt;&amp;lt;signature&amp;gt;&lt;/strong&gt; i&amp;ccedil;inde&amp;nbsp;belirtilen parametrelerle ilgili a&amp;ccedil;ıklamalar g&amp;ouml;r&amp;uuml;nt&amp;uuml;lenecek ve ger&amp;ccedil;ek parametreler burada g&amp;ouml;sterilmeyecektir. Bu duruma bağlı olarak parametre sıralamasının da bir ehemmiyeti kalmayacaktır. Ancak bu kullanım hataya d&amp;uuml;şmeye sebep olabileceği i&amp;ccedil;in pek doğru bir kullanım olarak g&amp;ouml;z&amp;uuml;kmemektedir.&lt;br /&gt;
                                            &lt;br /&gt;
                                            Bu husus hakkında daha fazla bilgi edinmek isteyenler&amp;nbsp;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/bb514138.aspx"&gt;How to: Create JavaScript XML Documentation Comments&lt;/a&gt;&amp;nbsp;başlıklı yazıyı inceleyebilirler.&lt;br /&gt;
                                            &lt;br /&gt;
                                            Bu husus hakkında yazacaklarım şimdilik bu kadar :) Tekrar g&amp;ouml;r&amp;uuml;ş&amp;uuml;nceye kadar, esen kalın, şen kalın ya da nasıl istiyorsanız &amp;ouml;yle kalın :)
                                        &lt;/div&gt;
&lt;div&gt;
                                            &amp;nbsp;
                                        &lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;</description><pubDate>2.07.2013 05:04:40</pubDate><author>Bilal AFŞAR | 2 Temmuz 2013 Salı 05:04</author></item><item><title>Visual Studio ve Javascript / jQuery IntelliSense Entegrasyonu</title><link>https://www.bilalafsar.com/Visual-Studio-ve-Javascript-jQuery-IntelliSense-Entegrasyonu.aspx</link><description>&lt;p&gt;Visual Studio &amp;uuml;zerinde ASP.NET ve JS ile geliştirme yapanların en b&amp;uuml;y&amp;uuml;k dertlerinden biri de -&amp;nbsp;bende de olduğu gibi :)&amp;nbsp;-&amp;nbsp;&lt;span&gt;muhtemelen&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;JavaScript IntelliSense -kod tamamlama- &amp;ouml;zelliğinin tam manasıyla doğru &amp;ccedil;alışmamasıdır. Visual Studio, m&amp;uuml;stakill js dosyası i&amp;ccedil;inde&amp;nbsp;&amp;ouml;nceden yazılan js tabanlı kodları IntelliSense listesine eklemekte ancak diğer&amp;nbsp;m&amp;uuml;stakill js dosyalarındaki kodlara erişimi&amp;nbsp;m&amp;uuml;mk&amp;uuml;n kılmamaktadır.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Bu problemi gidermek i&amp;ccedil;in yapılması gereken, js dosyası i&amp;ccedil;erisine şu kodları eklemektir:&lt;br /&gt;&lt;!-- pagebreak --&gt;&lt;span style="color:red;"&gt;&lt;strong&gt;/// &amp;lt;reference path="dosya yolu" /&amp;gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Misalen her iki js dosyasının aynı dizinde yer aldığını farzedersek ilk js dosyası i&amp;ccedil;ine&lt;/p&gt;
&lt;p&gt;&lt;span style="color:red;"&gt;&lt;strong&gt;/// &amp;lt;reference path="DigerJSDosyasi.js" /&amp;gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;şeklinde kodumuzu ekleyerek js dosyaları arasında IntelliSense desteğini sağlamış olabiliriz.&lt;br /&gt;&lt;br /&gt;Bunun yanısıra eğer dosyamız başka bir dizinde yer alıyorsa adresin &amp;ouml;n&amp;uuml;ne &lt;span style="color:red;"&gt;&lt;strong&gt;/&lt;/strong&gt;&lt;/span&gt; işareti koyarak, k&amp;ouml;k dizin &amp;uuml;zerinden adres tanımlaması yapabiliriz:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;&lt;strong&gt;/// &amp;lt;reference path="/scripts/DigerJSDosyasi.js" /&amp;gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bunlardan farklı olarak, VS 2012 &amp;uuml;zerinde &amp;ccedil;alışıyorsak, bir web sayfasına &lt;span style="color:red;"&gt;&lt;strong&gt;&amp;lt;script src=""&amp;gt;&amp;lt;/script&amp;gt;&lt;/strong&gt;&lt;/span&gt; etiketi ile eklediğimiz js dosyalarına erişim i&amp;ccedil;in ayrıca kod i&amp;ccedil;inde b&amp;ouml;yle bir tanımlama yapmaya gerek yoktur. Web sayfası i&amp;ccedil;inde&amp;nbsp;&lt;span style="color:red;"&gt;&lt;strong&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/strong&gt;&lt;/span&gt; arasına yazdığımız kodlar i&amp;ccedil;in, url vererek eklediğimiz js dosyaları doğrudan IntelliSense listesinde kullanılabilir olacaktır.&lt;br /&gt;&lt;br /&gt;Ayrıca VS 2012 i&amp;ccedil;inde, a&amp;ccedil;tığımız her projede JS k&amp;uuml;t&amp;uuml;phanelerinin otomatik olarak eklenmesi ve IntelliSense listesinde g&amp;ouml;r&amp;uuml;nt&amp;uuml;lenmesi, talep edilebilecek bir durumdur. Ancak JS k&amp;uuml;t&amp;uuml;phaneleri s&amp;uuml;rekli geliştiği-değiştiği ve neticesinde yeni s&amp;uuml;r&amp;uuml;mler ortaya &amp;ccedil;ıktığı i&amp;ccedil;in, kendi adıma bunu gereksiz buluyorum. Yine de bu konuda bilgi almak isteyenler&amp;nbsp;&lt;a target="_blank" href="http://blog.craigtp.co.uk/post/Javascript-jQuery-Intellisense-in-Visual-Studio-2012" style="cursor: pointer;"&gt;JavaScript / jQuery IntelliSense in Visual Studio 2012&lt;/a&gt;&amp;nbsp;başlıklı&amp;nbsp;makaleye&amp;nbsp;ya da daha da fazla detay i&amp;ccedil;in; MSDN k&amp;uuml;t&amp;uuml;phanesindeki&amp;nbsp;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/vstudio/bb385682.aspx" style="cursor: pointer;"&gt;JavaScript IntelliSense&lt;/a&gt;&amp;nbsp;başlıklı diğer bir makaleye bakabilirler.&lt;br /&gt;&lt;br /&gt;Uzun bir zaman aradan sonra yazdığım bu yazının da sonuna geldik. Tekrar g&amp;ouml;r&amp;uuml;şmek &amp;uuml;zere... :)&lt;/p&gt;</description><pubDate>24.06.2013 23:29:54</pubDate><author>Bilal AFŞAR | 24 Haziran 2013 Pazartesi 23:29</author></item><item><title>SQL Stored Procedure İçerisinde Opsiyonel Parametre Kullanımı</title><link>https://www.bilalafsar.com/SQL-Stored-Procedure-Icerisinde-Opsiyonel-Parametre-Kullanimi.aspx</link><description>&lt;p&gt;Uzun bir aradan sonra tekrar merhabalar,&lt;/p&gt;
&lt;p&gt;Bug&amp;uuml;nk&amp;uuml; yazıda Stored Procedure &amp;uuml;zerinde kullandığımız parametrelerin değerine g&amp;ouml;re kullanımından bahsetmeye &amp;ccedil;alışacağım.&lt;/p&gt;
&lt;p&gt;&amp;Ouml;ncelikle &amp;ouml;rneğin daha iyi anlaşılabilmesi i&amp;ccedil;in senaryoyu anlatayım:&lt;/p&gt;
&lt;p&gt;Elimizde bir sorgu var ve hazırladığımız program ya da web sitesi 
&amp;uuml;zerindeki checkbox se&amp;ccedil;imine g&amp;ouml;re sorguya bir şart (WHERE) eklemek isteyip istediğimize karar veriyoruz.&lt;/p&gt;
&lt;p&gt;1. Durum : Sorguya şart ekleme ve tablo &amp;uuml;zerindeki t&amp;uuml;m verileri getir.&lt;/p&gt;
&lt;p&gt;2. Durum : Sorguya checkbox &amp;uuml;zerinde se&amp;ccedil;ilmiş olan değeri şart olarak ekle ve buna g&amp;ouml;re bir tablo getir.&lt;/p&gt;
&lt;p&gt;&lt;!-- pagebreak --&gt;&lt;/p&gt;
&lt;p&gt;B&amp;ouml;ylesi bir durumda kimi zaman &lt;abbr title="Stored Procedure"&gt;SP&lt;/abbr&gt;
 i&amp;ccedil;erisinde WHERE kısmı haricindeki kısımları aynı olan ama IF 
ifadeleri ile birbirinden ayrılan bir kod kalabalığı i&amp;ccedil;erisine 
g&amp;ouml;m&amp;uuml;l&amp;uuml;r&amp;uuml;z.&lt;/p&gt;
&lt;p&gt;Ancak bundan kurtulmanın basit yolları mevcut.&lt;/p&gt;
&lt;p&gt;Bunlardan bir tanesi de aşağıda. &amp;Ouml;ncelikle &amp;ouml;rnekteki gibi bir  &lt;abbr title="Stored Procedure"&gt;SP&lt;/abbr&gt;
hazırlayalım.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
CREATE PROCEDURE spTEST

     @Col1 INT = 0,
     @Col2 VARCHAR(50) = NULL
AS
BEGIN

   SELECT * FROM Table1
   WHERE (((@Col1 = 0) AND (Table1.Col1 &amp;gt; 0)) OR (Table1.Col1 = @Col1))
             AND ((@Col2 IS NULL) OR (Table1.Col2 LIKE @Col2 + '%'))

END

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dilerseniz &amp;ouml;rnek sorguları yazmadan &amp;ouml;nce buradaki kodları a&amp;ccedil;ıklayalım:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
(((@Col1 = 0) AND (Table1.Col1 &amp;gt; 0)) OR (Table1.Col1 = @Col1))

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;Uuml;stteki
 satır @Col1 parametresi 0 değeri aldığında Col1 s&amp;uuml;tunundaki değeri 
sıfırdan b&amp;uuml;y&amp;uuml;k olan t&amp;uuml;m kayıtları getirir. Eğer @Col1 parametresi 0 
dışında bir değer almışsa o zaman yalnızca Col1 s&amp;uuml;tunundaki değer @Col1 
parametresi ile eşit olan kayıtları getirir.  &lt;abbr title="Stored Procedure"&gt;SP&lt;/abbr&gt;
 i&amp;ccedil;erisinde yaptığımız tanıma g&amp;ouml;re eğer @Col1 parametresine değer 
g&amp;ouml;ndermezsek varsayılan değer olarak 0 alır ve sonu&amp;ccedil; olarak t&amp;uuml;m 
kayıtları se&amp;ccedil;er.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
((@Col2 IS NULL) OR (Table1.Col2 LIKE @Col2 + '%'))

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu
 satırdaki ifade de bir &amp;ouml;nceki ile temelde aynı mantığa sahip. Ancak 
burada metine dayalı ifadeler &amp;uuml;zerinde kontrol işlemi yapıyoruz.&lt;br /&gt;
Bu ifadeye g&amp;ouml;re eğer @Col2 parametresinin değeri NULL durumdaysa t&amp;uuml;m kayıtları, değilse Col2 s&amp;uuml;tunu &amp;uuml;zerindeki değerin @Col2 parametresinin değeri ile başladığı kayıtları d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Son olarak &amp;ouml;rnek sorgularımızı yazalım:
&lt;/p&gt;
&lt;p&gt;Bir query editor penceresi a&amp;ccedil;tıktan sonra şu kodları tek tek deneyelim.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
EXECUTE spTEST
-- B&amp;uuml;t&amp;uuml;n kayıtları d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.


EXECUTE spTEST @Col1 = 10
-- Col1 s&amp;uuml;tunundaki değer 10 olan b&amp;uuml;t&amp;uuml;n kayıtları d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.


EXECUTE spTEST @Col2 = 'A'
-- Col2 s&amp;uuml;tunundaki değer A ile başlayan b&amp;uuml;t&amp;uuml;n kayıtları d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.


EXECUTE spTEST @Col1 = 10, @Col2 = 'A'
-- Col1 s&amp;uuml;tunundaki değer 10 olan ve Col2 s&amp;uuml;tunundaki değer A ile başlayan b&amp;uuml;t&amp;uuml;n kayıtları d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Şimdilik yazımızın sonuna geldik. İsimler birbirine benzerlik g&amp;ouml;steriyor. İnşallah mefh&amp;ucirc;mlar birbirine girmez :)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;G&amp;ouml;r&amp;uuml;şmek &amp;uuml;zere...&lt;/p&gt;</description><pubDate>19.12.2011 20:00:00</pubDate><author>Bilal AFŞAR | 19 Aralık 2011 Pazartesi 20:00</author></item><item><title>FastReport.Net Kullanımı - Visual Studio Integration</title><link>https://www.bilalafsar.com/FastReport-Net-Kullanimi-Visual-Studio-Integration.aspx</link><description>&lt;div&gt;Merhabalar,&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Bu yazımda FastReport.Net raporlama aracının Visual Studio IDE ile hazırlanan C# ve VB.NET projeleri i&amp;ccedil;erisinde kullanımından bahsetmeye &amp;ccedil;alışacağım. Ancak bu yazı daha &amp;ouml;nceki FastReport .NET kullanımı hakkındaki yazılarla bağlantılı olduğu i&amp;ccedil;in &amp;ouml;ncelikle onları incelemeniz konuyu kavramanız a&amp;ccedil;ısından daha faydalı olacaktır.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Şimdi ilk olarak oluşturacağınız rapor dosyalarını g&amp;ouml;r&amp;uuml;nt&amp;uuml;leyebilmek i&amp;ccedil;in PreviewControl componentini form &amp;uuml;zerinde istediğiniz bi&amp;ccedil;imde yerleştirin ve kod sayfasının tepesine C#.NET i&amp;ccedil;in using FastReport; &amp;nbsp;VB.NET i&amp;ccedil;in&amp;nbsp;Imports FastReport&amp;nbsp;satırlarını ekleyin.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Benim yaptığım &amp;ouml;rnekteki g&amp;ouml;r&amp;uuml;nt&amp;uuml; şu şekildeydi.&lt;/div&gt;
&lt;div&gt;&lt;!-- pagebreak --&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: center; "&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: center; "&gt;
&lt;a href="http://www.bilalafsar.com/Upload/Images/FR.NET_Article3_Images/Img01.png"&gt;&lt;img alt="Raporlama Aray&amp;uuml;z&amp;uuml;" src="https://www.bilalafsar.com/Upload/Images/FR.NET_Article3_Images/Img01.png" style="border: 0px none;" title="Raporlama Aray&amp;uuml;z&amp;uuml;" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Şimdi de gerekli kodları yazalım ama &amp;ouml;ncesinde şunu belirtmeliyim. Kullandığım sistem 64 Bit olduğu i&amp;ccedil;in Access DB konusunda problem yaşadım. Bu y&amp;uuml;zden kodlar i&amp;ccedil;erisinde ODBC bağlantısını kullandım. Siz bu bağlantıyı istediğiniz gibi değiştirerek kendinize g&amp;ouml;re uyarlayabilirsiniz. Ancak kullanacağınız bağlantıya ait namespace'i eklemeyi unutmayın.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;&lt;i&gt;C#.NET&lt;/i&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;&lt;code class="cs"&gt;
public partial class ReportPage : Form
{
   Report report;

   private void ReportPage_Load(object sender, EventArgs e)
   {
      CreateReport();
   }
   
   /// &amp;lt;summary&amp;gt;
   /// Rapor i&amp;ccedil;eriğini hazırlar.
   /// &amp;lt;/summary&amp;gt;
   private void CreateReport()
   {
      // Yeni bir rapor dosyası oluşturuyoruz.
      report = new Report(); 

      // Resources i&amp;ccedil;erisindeki string bi&amp;ccedil;imindeki raporu
      // yeni oluşturduğumuz rapor i&amp;ccedil;erisine y&amp;uuml;kl&amp;uuml;yoruz.
      report.LoadFromString(Properties.Resources.ReportString);

      // Veritabanına gerekli sorguyu g&amp;ouml;nderip verileri &amp;ccedil;ekiyoruz.
      DataTable dt = SQLProcesses.GetDataTable("SELECT T.Type, W.WriterName, B.BookName "
                                             + "FROM tblBooks B, tblBookTypes T, tblWriters W "
                                             + "WHERE B.BookTypeID = T.ID AND W.ID = B.BookWriterID "
                                             + "ORDER BY T.Type ASC, W.WriterName ASC");

      // &amp;Ccedil;ektiğimiz verileri daha &amp;ouml;nceden şablon olarak oluşturduğumuz
      // rapor i&amp;ccedil;erisinde ismi belirtilen tabloya register ediyoruz.
      report.RegisterData(dt, "tblBooksWithTypes");

      /* Rapor g&amp;ouml;sterilemezse olacakları burada belirliyoruz.
       * Ancak bu kullanımın mecburi olmadığını yalnızca birden fazla rapor oluştururken
       * kullanımı kolaylaştırmak gayesiyle b&amp;ouml;yle tasarlandığına dikkat edelim. */
      if (!ShowReport(report))
      {
         Application.Exit();
      }
   }

   /// &amp;lt;summary&amp;gt;
   /// G&amp;ouml;nderilen raporun g&amp;ouml;r&amp;uuml;nt&amp;uuml;lenmesini sağlar ve işlemin başarı durumunu geriye d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.
   /// &amp;lt;/summary&amp;gt;
   /// &amp;lt;param name="report"&amp;gt;&amp;lt;/param&amp;gt;
   /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
   private bool ShowReport(Report report)
   {
      bool rV = false;
      try
      {
         // G&amp;ouml;nderilen rapor dosyasının form &amp;uuml;zerindeki
         // PreviewControl de g&amp;ouml;sterileceğini belirtiyoruz.
         report.Preview = pCReports; 

         // Eğer rapor arkapkanda hazırlanmışsa sonraki adıma ge&amp;ccedil;iyoruz. 
         if (report.Prepare()) 
         {
            // Hazırlanmış olan raporun g&amp;ouml;sterilmesini sağlıyoruz.
            report.ShowPrepared();
            
            // Rapor &amp;uuml;zerinde scroll işlemlerini doğrudan ger&amp;ccedil;ekleştirebilmek i&amp;ccedil;in
            // PreviewControl &amp;uuml;zerine odaklanıyoruz.
            pCReports.Focus(); 

            rV = true;
         }
      }
      catch
      {
         rV = false;
      }
     
      // Eğer rapor başarılı bir şekilde oluşturulduysa geriye true değeri d&amp;ouml;nd&amp;uuml;r&amp;uuml;yoruz.
      return rV; 
   }
}

public class SQLProcesses
{
   /// &amp;lt;summary&amp;gt;
   /// Rapor i&amp;ccedil;eriğini veritabanından &amp;ccedil;ekerek DataTable i&amp;ccedil;erisinde geri d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.
   /// &amp;lt;/summary&amp;gt;
   /// &amp;lt;param name="cmd"&amp;gt;Veritabanına g&amp;ouml;nderilecek olan sorgu&amp;lt;/param&amp;gt;
   /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
   public static DataTable GetDataTable(string cmd)
   {
      DataTable returnTable = new DataTable();
      try
      {
         OdbcConnection ODBCConn = new OdbcConnection (@"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
                                                      + "dbq=C:\FASTREPORT .NET SAMPLE\data.mdb;defaultdir=C:\FASTREPORT .NET SAMPLE;"
                                                      + "driverid=25;fil=MS Access;filedsn=C:\FastReport .NET Sample\FR.NETConn.dsn;"
                                                      + "maxbuffersize=2048;maxscanrows=8;pagetimeout=5;safetransactions=0;threads=3;"
                                                      + "usercommitsync=Yes;uid=admin");
         
         OdbcDataAdapter oda = new OdbcDataAdapter(cmd, ODBCConn);
         oda.Fill(returnTable);
      }
      catch(Exception ex)
      {
         MessageBox.Show(string.Format("Hata Oluştu. Hata İ&amp;ccedil;eriğini Aşağıda G&amp;ouml;rebilirsiniz.\n\n{0}", ex.Message));
      }

      return returnTable;
   }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;span style="color:#000000"&gt;&lt;strong&gt;&lt;i&gt;&lt;span style="text-decoration: underline;"&gt;VB.NET&lt;/span&gt;&lt;/i&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code class="vbnet"&gt;
Imports FastReport
Imports System.Data.Odbc

Partial Public Class ReportPage

    Inherits Form

    Private report As Report

    Private Sub ReportPage_Load_1(ByVal sender As System.Object,
                                  ByVal e As System.EventArgs)
    Handles MyBase.Load
        CreateReport()
    End Sub

    ''' &amp;lt;summary&amp;gt;
    ''' Rapor i&amp;ccedil;eriğini hazırlar.
    ''' &amp;lt;/summary&amp;gt;
    Private Sub CreateReport()

        ' Yeni bir rapor dosyası oluşturuyoruz.
        report = New Report()

        ' Resources i&amp;ccedil;erisindeki string bi&amp;ccedil;imindeki raporu
        ' yeni oluşturduğumuz rapor i&amp;ccedil;erisine y&amp;uuml;kl&amp;uuml;yoruz.
        report.LoadFromString(My.Resources.MyResources.ReportString)

        ' Veritabanına gerekli sorguyu g&amp;ouml;nderip verileri &amp;ccedil;ekiyoruz.
        Dim dt As DataTable = SQLProcesses.GetDataTable("SELECT T.Type, W.WriterName, B.BookName "
                                                      &amp;amp; "FROM tblBooks B, tblBookTypes T, tblWriters W "
                                                      &amp;amp; "WHERE B.BookTypeID = T.ID AND W.ID = B.BookWriterID "
                                                      &amp;amp; "ORDER BY T.Type ASC, W.WriterName ASC")

        ' &amp;Ccedil;ektiğimiz verileri daha &amp;ouml;nceden şablon olarak oluşturduğumuz
        ' rapor i&amp;ccedil;erisinde ismi belirtilen tabloya register ediyoruz.
        report.RegisterData(dt, "tblBooksWithTypes")

        ' Rapor g&amp;ouml;sterilemezse olacakları burada belirliyoruz.
        ' Ancak bu kullanımın zorunlu olmadığını yalnızca birden fazla rapor oluştururken
        ' kullanımı kolaylaştırmak amacıyla b&amp;ouml;yle tasarlandığına dikkat edelim.
        If Not ShowReport(report) Then
            Application.[Exit]()
        End If
    End Sub

    ''' &amp;lt;summary&amp;gt;
    ''' G&amp;ouml;nderilen raporun g&amp;ouml;r&amp;uuml;nt&amp;uuml;lenmesini sağlar ve işlemin başarı durumunu geriye d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.
    ''' &amp;lt;/summary&amp;gt;
    ''' &amp;lt;param name="report"&amp;gt;&amp;lt;/param&amp;gt;
    ''' &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
    Private Function ShowReport(ByVal report As Report) As Boolean
        Dim rV As Boolean = False
        Try

            ' G&amp;ouml;nderilen rapor dosyasının form &amp;uuml;zerindeki
            ' PreviewControl de g&amp;ouml;sterileceğini belirtiyoruz.
            report.Preview = pCReports

            ' Eğer rapor arkapkanda hazırlanmışsa sonraki adıma ge&amp;ccedil;iyoruz.
            If report.Prepare() Then

                ' Hazırlanmış olan raporun g&amp;ouml;sterilmesini sağlıyoruz.
                report.ShowPrepared()

                ' Rapor &amp;uuml;zerinde scroll işlemlerini doğrudan ger&amp;ccedil;ekleştirebilmek i&amp;ccedil;in
                ' PreviewControl &amp;uuml;zerine odaklanıyoruz.
                pCReports.Focus()

                rV = True
            End If
        Catch
            rV = False
        End Try

        ' Eğer rapor başarılı bir şekilde oluşturulduysa geriye true değeri d&amp;ouml;nd&amp;uuml;r&amp;uuml;yoruz.
        Return rV

    End Function

End Class

Public Class SQLProcesses
    ''' &amp;lt;summary&amp;gt;
    ''' Rapor i&amp;ccedil;eriğini veritabanından &amp;ccedil;ekerek DataTable i&amp;ccedil;erisinde geri d&amp;ouml;nd&amp;uuml;r&amp;uuml;r.
    ''' &amp;lt;/summary&amp;gt;
    ''' &amp;lt;param name="cmd"&amp;gt;Veritabanına g&amp;ouml;nderilecek olan sorgu&amp;lt;/param&amp;gt;
    ''' &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
    Public Shared Function GetDataTable(ByVal cmd As String) As DataTable
        Dim ReturnTable As New DataTable()
        Try
            Dim ODBCConn As New OdbcConnection("Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
                                             &amp;amp; "dbq=C:\FASTREPORT .NET SAMPLE\data.mdb;"
                                             &amp;amp; "defaultdir=C:\FASTREPORT .NET SAMPLE;driverid=25;"
                                             &amp;amp; "fil=MS Access;filedsn=C:\FastReport .NET Sample\FR.NETConn.dsn;"
                                             &amp;amp; "maxbuffersize=2048;maxscanrows=8;pagetimeout=5;safetransactions=0;"
                                             &amp;amp; "threads=3;usercommitsync=Yes;uid=admin")

            Dim oda As New OdbcDataAdapter(cmd, ODBCConn)
            oda.Fill(ReturnTable)
        Catch ex As Exception
            MessageBox.Show(String.Format("Hata Oluştu. Hata İ&amp;ccedil;eriğini Aşağıda G&amp;ouml;rebilirsiniz."
                                          &amp;amp; vbLf &amp;amp; vbLf &amp;amp; "{0}", ex.Message))
        End Try

        Return ReturnTable
    End Function
End Class

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;Yapmamız gereken işlemler bu kadar. Bunların yanısıra farklı kodlarla doğrudan VS IDE i&amp;ccedil;erisinde rapor i&amp;ccedil;eriği oluşturulabiliyor olmasına rağmen buradaki gibi şablon oluşturup i&amp;ccedil;erisindeki tablolara verileri y&amp;uuml;klemek daha kolay ve kullanışlı olduğu i&amp;ccedil;in diğer kodlara girmiyorum.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Ayrıca şunu da belirtmeliyim.&amp;nbsp;FastReport.Net Designer &amp;uuml;zerinde oluşturup kaydettiğiniz dosyalar metin tabanlı dosyalardır. Basit d&amp;uuml;zeyde herhangi bir metin edit&amp;ouml;r&amp;uuml;&amp;nbsp;(notepad, emeditor, notepad++, vs.)&amp;nbsp;ile a&amp;ccedil;ıp i&amp;ccedil;erisindeki metni alıp resources i&amp;ccedil;erisinde depolayabilirsiniz. Bizim burada yaptığımız da buydu zaten.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="http://www.bilalafsar.com/Upload/Files/usingFastReport.NETonVS.NETIDESample.zip"&gt;Yaptığımız &amp;ouml;rnekle ilgili &amp;ouml;rnek kodları buradan indirebilirsiniz &amp;Ouml;rnek kodlar hem C# .NET hem de VB .NET &amp;uuml;zerinde oluşturulmuştur.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Not1&lt;/strong&gt;:&amp;nbsp;&lt;i&gt;&amp;Ouml;rnek kodun doğru bir şekilde &amp;ccedil;alışması i&amp;ccedil;in zip dosyasının i&amp;ccedil;eriğini C:\ adresine &amp;ccedil;ıkartın.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not2:&amp;nbsp;&lt;/strong&gt;&lt;i&gt;Kullandığım FastReport.Net s&amp;uuml;r&amp;uuml;m&amp;uuml; 1.2.47, Visual Studio s&amp;uuml;r&amp;uuml;m&amp;uuml; 2008'dir.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not3&lt;/strong&gt;&lt;i&gt;: VB.NET kodları&amp;nbsp;&lt;a href="http://www.developerfusion.com/tools/convert/csharp-to-vb/" target="_blank"&gt;http://www.developerfusion.com/tools/convert/csharp-to-vb/&lt;/a&gt; &amp;uuml;zerinden otomatik olarak oluşturulmuştur&amp;nbsp;ancak sonrasında gerekli d&amp;uuml;zeltmeler yapılmış ve &amp;ccedil;alıştığı test edilmiştir.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not4&lt;/strong&gt;&lt;i&gt;: Kod i&amp;ccedil;erisinde kullandığım veritabanı bağlantısı ODBC &amp;uuml;zerinden ger&amp;ccedil;ekleştiği i&amp;ccedil;in resources i&amp;ccedil;erisine g&amp;ouml;md&amp;uuml;ğ&amp;uuml;m string de&amp;nbsp;Report_Sample[ODBCConn].frx isimli dosyaya ait. Bu y&amp;uuml;zden kodları doğrudan &amp;ccedil;alıştırmak istediğinizde ODBC hatası alabilirsiniz. Bu problemi &amp;ccedil;&amp;ouml;zmek i&amp;ccedil;in ya Denetim Masası &amp;uuml;zerinden bir tane ODBC bağlantısı tanımlayın ya da&amp;nbsp;Report_Sample.frx isimli dosyaya ait stringi resources i&amp;ccedil;ine g&amp;ouml;m&amp;uuml;p gerekli değişiklikleri yaparak kullanın.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Herhangi bir problemle karşılaşırsanız yardımcı olmaya &amp;ccedil;alışırım.&lt;/p&gt;
&lt;p&gt;Tekrar g&amp;ouml;r&amp;uuml;ş&amp;uuml;nceye kadar hoş&amp;ccedil;akalın...&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description><pubDate>5.07.2011 17:48:56</pubDate><author>Bilal AFŞAR | 5 Temmuz 2011 Salı 17:48</author></item></channel></rss>