Uzun bir süredir yazamıyordum. Yeterince “acıkan” okurlarımızı lezzetli içerikle doyurmanın vakti geldi de geçti bile. İşte o makalelerden biri.

Geçenlerde XP Service Pack 3 çalışan bilgisayarlarımdan birine Windows 7 Visual Transformation Pack yükledim. Aslında hiç sevmem bu tarz uygulamaları ama denemek istedim, nasıl oluyor görmeliydim :)

Uzun lafın kısası, pek iyi bir sonuç vermedi. Kitlenen, tıklanamayn pencereler, sürükle bırak yaparken BSOD’lar vs… Kurulum sırasında değiştirilen sistem dosyalarını nasıl geri yüklerim diye bir endişi sardı. Kurtulmalıydım ! :)

Neyse ki yüklediğim transformation pack’in bir restore özelliği varmış. Tüm sistem dosyaları yüklemeden önceki haline geri döndü. Ancaaak….. Taskbar üzerindeki uygulama buton boyları 50 piksel gibi bir boyuta düştü.  Aşağıdaki gibi :

Tasbar Item Width

 

 

 

 

Bu durumun üstesinden gelmek ve program butonlarınızın boyutunu ayarlamak için aşağıdaki yönergeleri takip edebilirsiniz :

1. Start’a basın, RUN komutunu çalıştırın.
2. Çalışıtırılacak komut alanına “REGEDIT” yazarak Enter tuşuna basın.
3. Açılacak olan pencere Registry penceresi. Sol taraftaki ağaç üzerinde aşağıdaki yolu bulun :
     My Computer >> HKEY_CURRENT_USER >> Control Panel >> Desktop >> WindowMetrics
4. Sol tarafta WindowMetrics seçiliyken, sağ taraftaki listeden MinWidth alanını bulun.
5. Üzerine 2 kez tıklayın ve değer kutusunun içine Piksel cinsinden (sadece sayı) istediğiniz
     genişliği yazın.
6. Bilgisayarınızı baştan başlatın. Birkaç denemeden sonra en uygun boyutu bulacağınıza eminim :)

 

Tekrar görüşmek dileğiyle,

Ozan GUNCELER

Herkese tekrar merhaba!

Bugün çok güzel ve aslında yıllardır DataTable nesnesi ile uğraşmama rağmen bilmediğim, yeni öğrendiğim DataRowVersion.Original kavramı üzerinde duracağız.

Senaryomuz şu şekilde olacak :

1.       Yeni bir DataTable oluşturacağız ve bu DateTable içinde PersonelAd, PersonelSoyad, Yas alanlarını barındıracağız.

2.       Ad, soyad ve yaş bilgilerini barındıran 3 DataRow oluşturacak ve bunları DataTable içerisine yerleştireceğiz.

3.       Sonra, Ozan Günceler personelinin 35 olarak tanımlanan yaşını, 25 olarak set edeceğiz.

4.       En son olarak diyeceğiz ki, Ozan Günceler personelinin yaşı 25 yapılmadan önce kaçtı ? Bunun cevabını almaya çalışacağız.

Hemen DataTable tanımlamasıyla başlayalım. İşin biraz kolayına kaçarak, boş bir Windows Form’un Load event handler’ı içerisine aşağıdaki kodu yerleştiriyorum :

datarowstate001.jpg

Şimdi sırada, Ozan Günceler, İpek Çobanoğlu ve Ejder Kuvemli isimli personellerimizin tanımını yaparak, DataTable içerisine yerleştirmek var. Bunu başarabilmek için 3 DataRow nesnesi oluşturacağım ve bu nesnelerin sütun bilgilerini set ederek, DataTable.Rows içerisine ekleyeceğim.

 

datarowstate002.jpg

 

Gerekli tanımlamaları yaptık. Dikkat ederseniz, row’ları ekledikten sonra DataTable için AcceptChanges() metodunu çağırıyorum. Bunun sebebi, row datatable içine ilk eklendiğinde Added durumunda olması ve bu durumda olduğunda bize önceki değerini vermemesi.

 

Şimdi sırada, DataTable içindeki 2. Sıradaki kaydın yaşını değiştirmek var. O kişi de bendenizin kaydı. Değiştirmek için aşağıdaki kodu ekliyorum :

 

datarowstate003.jpg

 

Artık DataTable üzerindeki, Ozan Günceler’e ait yaş bilgisi değişti. Ama biz öğrenmek istiyoruz ki, değişiklikten önce bu yaş kaçtı ? Aşağıdaki kodu ekliyorum :

 

datarowstate004.jpg

 

Tamamladığımız bu kodu çalıştırdığımızda aşağıdaki mesaj kutusunu karşılamış oluyoruz :

 

datarowstate.jpg

 

DataRowVersion aslında bir Enumaration, ve elemanları da şunlar :

 

datarowstate2.jpg

 

Umarım faydası olur :)

 

Tekrar görüşmek üzere!

DataTable.Compute()

12.07.2007 Per

Çoğu zaman veritabanından çektiğimiz sorguları kod içerisinde kullanmak için DataTable içersinde kullanırız. Örneğin aşağıdaki veri kümesi SQL server’dan gelmiş olsun:

MusteriId

Adi Soyadi Kredi
1 Ozan Günceler 1500
2 İpek Çobanoğlu 2500
3 Asuman Acar 500
4 Kemal Okutan 1250
5 Muharrem Karabay 3443

Yukarıdaki kümeyi bir DataTable içinde barındırdığımızı düşünelim. Bu veriyi göstermek kolay (GridView veya üçüncü parti kontroller kullanarak). Peki bu kümedeki belirli bir alana göre SUM, COUNT, AVERAGE veya bunlar gibi matematiksel işlemler yapmak isteseydik nasıl olacaktı ?

Mantıksal düşünüldüğünde, DataTable.Select() metodu kullanılarak, kritere göre sonuç alınabileceği düşünülebilir ancak Select() metodu matematiksel işlemler için değil, sadece filtreleme işlemleri ile kullanılır. Eğer DataTable.Select(“SUM(‘Kredi’)”) yazarak çalıştırırsanız, .NET size run-time hatası döndürecek ve Select() metodunun bu şekilde kullanılamayacağını belirtecektir.

Matematiksel işlemler için, DataTable.Compute() metodunu kullanıyoruz.

Örnek:

Bizim tablomuzdaki müşterilerin kredi miktarlarının toplamını DataTable içinden hesaplayabilmek için aşağıdaki satırı kullanmanız yeterli :
int KrediToplami = Convert.ToInt32(insDataTableMusteri.Compute(“SUM(‘Kredi’)”));

 

Eğer bir kriter belirterek toplam almak istersek aşağıdaki kodu kullanabilirsiniz
(MusteriId=2 için toplam) :
int KrediToplami = Convert.ToInt32(insDataTableMusteri.Compute(“SUM(‘Kredi’)”,”MusteriId=2”));

 

Daha fazla bilgi almak için aşağıdaki MSDN makalesinden faydalanabilirsiniz :

http://msdn2.microsoft.com/en-us/library/system.data.datatable.compute.aspx

 

Herkese iyi çalışmalar…

Herkese merhaba!

Önce kendimle ilgili bir haber vererek başlamak istiyorum. 11 Haziran 2007 tarihinden itibaren Bilge Adam’daki  görevimi  bırakarak, Proje Yöneticisi olarak başka bir firmada göreve başladım. Son zamanlarda blogu çok aksattım, telafi edeceğiz inşallah.

Bu yazımda değinmek istediğim konu, okurlarımdan birinden geliyor. Sevgili “Fatih”, diskimizdeki  herhangi bir dosyayı , uygulamamız üzerindeki ListView içine bıraktığında, dosyanın ikonunun otomatik olarak gösterilip gösterilemeyeceğini sormuş.

İşte cevabı :

1.       Öncelikle yeni bir proje oluşturuyoruz. C# ile hazırladım, vakit bulabilirsem VB.NET örneğini de göstereceğşm daha sonra. Ama zaten çevirmek kolay olur diye düşünüyorum.

      dfi_01.jpg

 

 

2.       Projeyi oluşturduktan sonra formun üzerine 1 adet ListView yerleştiriyoruz. Özellikleri aşağıdaki şekilde olmalı :

Name               lstDosyaListesi
Allow Drop      true
View                 Details
Columns           2 adet (özelliklerinin çok bir önemi yok)

3.       Bu düzenlemeyi yaptıktan sonra form üzerine bir ImageList ekliyoruz. Özellikleri aşağıdaki gibi olmalı :

Name               imgIkonlar

4.       Property Box kullanarak, lstDosyaListesi kontrolümüzün SmallImageList özelliğini imgIkonlar kontrolüne bağlıyoruz.

             dfi_02.jpg

             (Genel Görünüm)

 

Bilmemiz gereken 2 Event Handler var. Bunlardan ilki DragEnter, diğeri ise DragDrop

 

DragEnter
Bu event, sol klik basılı iken sürüklenen nesne, kontrolümüzün sınırları içerisine girdiği anda tetikleniyor.  Önemli olan nokta, drag işleminin tipini belirtmemiz gerekiyor olması (Effect) .NET bize bu konuda aşağıdaki opsiyonları sunuyor :

Copy   Sürüklenen nesnenin kopyalanmasını istemek.
Move  Sürüklenen nesnenin taşınmasını istemek.
Link     Sürüklenen nesnenin kısayoluna ulaşmak.
None   Sürüklenen nesneyi kontrol üzerinde bırakılsa bile işleme almamak.
Scroll   Scroll (?)
J Henüz inceleyemedim
All        Listedeki hareketlerden herhangi birinin oluşmasına izin vermek.

Bizim senaryomuz gereği copy, move tarzı hareketlere gerek yok. Bu tip hareketler aynı uygulama içindeki birden fazla ListView arasında item’ları kopyalamak veya taşımak için daha çok kullanılıyor. Bizim amacımız sürüklenen dosyanın path bilgisini ve dosyanın adı ile uzantısını elde etmek. (Ben yinede Effect.Copy tanımlasını kullandım)

DragDrop
Bu event, kontrol üzerine sürüklenen nesne bırakıldığında tetikleniyor. Ikonun ne olduğuna karar verip listeye ekleyeceğimiz yer burası.

 

1.       Önce DragEnter event handler’ını yazıyoruz:

       private void lstDosyaListesi_DragEnter(object sender, DragEventArgs e)
      
{
         
e.Effect = DragDropEffects.Copy;
      
}

2.       Daha sonra da DragDrop event handler’ını yazıyoruz

      private void lstDosyaListesi_DragDrop(object sender, DragEventArgs e)      
      
{
         string[] dragDropEdilenDosyalar =
             (string[])e.Data.GetData(DataFormats.FileDrop, false);
        
        
foreach (string strDosyaAdi in dragDropEdilenDosyalar)
         {
            // Dosya uzantısının Windows Registry’de kayıtlı ikonunu al
            System.Drawing.Icon insIkon = SystemIcons.WinLogo;
 
           insIkon = Icon.ExtractAssociatedIcon(strDosyaAdi);
            // Extract edilen ikonu ImageList içine kaydediyoruz.
            // Eğer önceden kayıtlıysa kaydetmeyeceğiz ama :)
 
           // Öncelikle elimizdeki dosya yolunu FileInfo
            // nesnesine bağlıyoruz.
 
           System.IO.FileInfo insFileInfo = new System.IO.FileInfo(strDosyaAdi);
            if (!imgIkonlar.Images.ContainsKey(insFileInfo.Extension))
            {
              //Bu ikon listede yok, ekle
              imgIkonlar.Images.Add(insFileInfo.Extension, insIkon);
            }
            // Son olarak, Drag & Drop edilen dosyanın adını ve ikonunu
 
           // Listview üzerinde göstermek kaldı
            ListViewItem insListViewItem = new ListViewItem();
            
           
insListViewItem.ImageIndex =
                 imgIkonlar.Images.IndexOfKey(insFileInfo.Extension);
           
            insListViewItem.SubItems.Add(insFileInfo.Name);
            lstDosyaListesi.Items.Add(insListViewItem);
         
}
      }

İşte sonuç :

               dfi_03.jpg

Umarım yardımı olur. Tekrar görüşmek üzere ! J

 

Tekrar merhabalar,

Bugünkü yazımda ASP.NET ile pek çok cep telefonunda bulunan WML destekli WAP Browser’lar üzerinde gösterilebilen sayfaların nasıl generate edildiğini inceleyeceğiz.

WML nedir ?

Cep telefonlarının hayatımıza ilk girdiği dönemlerde pek çoğunun üzerinde WAP browser vardı. Günümüzde cep telefonlarının üzerlerinde javascript bile çalıştırabilen gelişmiş tarayıcılar var ancak bu telefonların fiyatları hala oldukça yüksek. Kurumsal ve büyük projelerde firmalar mobile uygulamaların kullanım maliyetlerini en asgaride tutmak istediklerinden genellikle en ucuz cep telefonlarına yöneliyorlar. Haliyle bu cep telefonlarının üzerinde de sadece WAP browser’lar oluyor.

ASP.NET ile WML arasında ne farklar Var ?

Aslında hiçbir fark yok. WAP browser bir istekte bulunduğunda IIS bu isteği ISAPI bileşenleri ile derlemeye çalışıyor. ASP.NET konfigürasyonundaki Machine.config dosyasına bakarak, istekte bulunan cihazın tipini belirlemeye çalışıyor ve kabiliyetlerini gözden geçiriyor. Buna göre sayfadaki görsel öğeleri cihazın kabiliyetleri doğrultusunda WML kodu haline getirerek istemciye iletiyor. WML çok daha “sınırlı” yeteneklere sahip olduğundan, Machine.config dosyasının doğru bir şekilde ayarlanmış olması çok önemli!

Örnek WML uygulaması

Örneğimiz aslında çok basit. Bir form oluşturacağız ve bu formun üzerinde 2 textbox’ımız olacak. Bunlardan biri sadece numarik değer kabul edecek diğerine ise istediğimiz herhangi birşeyi yazabileceğiz. Butona bastığımızda başka bir sayfaya gidecek ve bu kutulara girdiğimiz değerleri göstereceğiz.

Mobile Web Form

Mobile Web Form, sayfamızın WML kullanılarak derlenmesi gerektiğini IIS tarafına anlatan bir yapı. Aslında normal Web Form ile aralarında hiçbir fark yok sadece başka bir sınıftan türüyorlar.

001.jpg

Öncelikle mobileTest adında bir ASP.NET Web Site projesi oluşturuyorum

Daha sonra Solution Explorer içinden default olarak projeyi oluşturduğumuzda hazırlanan Default.aspx ve kendisiyle ilgili tüm dosyaları siliyorum. Neden siliyorum ? Çünkü bu dosya standard bir ASP.NET sayfasının özelliklerini taşıyor. Mobil cihazların çoğu ile uyumsuz.

002.jpg

Şimdi, mobil cihazlar ile uyumlu bir Page’i projemize ekleyelim. Bunun için, proje üzerinde sağ-klik yaparak Add New Item diyorum ve Mobile Web Form nesnesini seçiyorum.

 003.jpg

Default.aspx adında yeni bir Mobile Form projemize eklendi. Dikkat edecek olursanız ASPX kaynağında aşağıdaki gibi bir tag göreceksiniz :

<mobile:Form id=”Form1″ runat=”server”> </mobile:Form>

İşte ilk farklılık burada. Form taglarinin başında mobile ibaresi var.

Eğer ASPX sayfamızın dizaynına bakacak olursanız ikinci bir farklılık göreceksiniz :

004.jpg

Formumuz artık tam sayfa değil, bir çerçeve ile sınırlandırılmış durumda. Form1 çerçevesinin dışına koyacağınız, yazacağınız herhangi birşey doğru olarak derlenemeyebilir. Derlense bile cihaz tarafından doğru gösterilemeyebilir. Biz tüm bileşenlerimizi bu çerçevenin içine yerleştireceğiz.Form içine Adınız ve Yaşınız şeklinde 2 textbox yerleştireceğim. Dikka ederseniz, toolbox üzerinde bulunan Mobile Web Forms kategorisindeki elemanların artık pasif olmadığını görebilirsiniz. Eğer bu kategoriyi göremiyorsanız Toolbox üzerinde sağ-klick yaparak Show All seçeneğini seçebilirsiniz. Biraz kalabalık olacak ama Mobile Web Forms da görüntülenecek.

Bu kategoriden aldığım bir Label kontrolünü form üzerine bırakıyorum.

005.jpg

Dikkat ettiyseniz Label tüm form genişliği kapladı. İşte limitasyonlarımızdan biri. WML destekli sayfalarda tasarım anlamında harikalar yaratamıyorsunuz L Ama biz limitleri zorlayacağız. Hemen ardından bir de Textbox kontrolü bırakıyorum form üzerine.

 006.jpg

Eğer bu noktada Internet Explorer ile önizleme yapmak isterseniz bakın sayfamız şu şekilde gözükecek :

0071.jpg

Şimdi gelelim Textbox’un Label’ın yanından başlamasına. Alt alta görünsün istemiyoruz. Önce Label üzerindeki metni değiştiriyorum. Label’ın Text özelliğini “Adınız : ” olarak değiştirdikten sonra BreakAfter özelliğini ise False yapıyorum. BreakAfter True olduğunda, runtime sırasında, bu kontrolün derlenmesinden sonra bir line break konularak diğer kontrollerin derlenmesine başlanması. Biz textbox’ın label’dan hemen sonra çizilmesini istediğimiz için BreakAfter’ı  False yapıyoruz. Son durum şu hale geliyor :

008.jpg

Aynı şeyi diğer kutumuz için de yapalım. Yine bir label ve ardından bir textbox koyuyoruz. Label’ın Text özelliğini “Yaşınız : “ yapıyoruz ve BreakAfter özelliğini FALSE yapıyoruz. Textbox içine sadece numerik bilgi girebileceğiniz için Numeric özelliğini TRUE yapıyoruz. Son durum aşağıdaki gibi :

009.jpg

Son olarak bir buton yerleştiriyoruz. Bu buton bizi diğer bir sayfaya gönderecek ve textbox’lar içindeki metinleri okumamızı sağlayacak.

Şimdi butonu kodlayalım. Designer üzerinde buton üzerinde double-click yapıyorum ve codebehind içindeki event handler koduna erişiyorum. Aşağıdaki kodu event handler içerisine yazıyoruz:

     protected void Command1_Click(object sender, EventArgs e)
    {
        string strAdiniz = “”;
        string strYasiniz = “”;          strAdiniz = TextBox1.Text;
        strYasiniz = TextBox2.Text;

        this.RedirectToMobilePage(“goster.aspx?var1=” + strAdiniz + “&var2=” + strYasiniz);
    } 

Son olarak, goster.aspx adında yeni bir mobile form oluşturuyoruz ve aşağıdaki kodu Page Activate içerisine yazıyoruz.

     protected void Form1_Activate(object sender, EventArgs e)
    {
        Response.Write(“Adınız : “ + Request.QueryString["var1"].ToString());
       
Response.Write(“Yaşınız : “ + Request.QueryString["var2"].ToString());
    }

010.jpg

011.jpg

Form üzerine girdiğimiz bilgileri diğer sayfaya taşımak için query string kullandık. var1 ve var2 değişkenlerine değerlerimizi yükleyerek RedirectToMobilePage() metodundan faydalandık. Gittiğimiz goster.aspx sayfası Activate olduğunda (yani OnLoad gibi) query string kolleksiyonunu okuyarak ekrana gerekli girişleri yazdı. Default.aspx sayfasını Start Page olarak belirlemeyi unutmayın!

Mobile Web Formlarına giriş yaptık. Eğer bir hosting imkanınız varsa, projenizi derleyip sunucuya yerleştirdikten sonra cep telefonunuz ile de deneyebilirsiniz. Ya da pek çok mobile device emulator’dan herhangi birini kullanabilirsiniz. Google bunlarla dolu.Umarım işinize yarar.

Tekrar görüşmek üzere J