DataRowVersion | Original
20.07.2007 Cum
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 :
Ş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.
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 :
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 :
Tamamladığımız bu kodu çalıştırdığımızda aşağıdaki mesaj kutusunu karşılamış oluyoruz :
DataRowVersion aslında bir Enumaration, ve elemanları da şunlar :
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…
Ö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.
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.
(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ç :
Umarım yardımı olur. Tekrar görüşmek üzere ! J
WML Browser Destekli ASP.NET Sayfaları
20.05.2007 Paz
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.
Ö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.
Ş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.
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 :
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.
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.
Eğer bu noktada Internet Explorer ile önizleme yapmak isterseniz bakın sayfamız şu şekilde gözükecek :
Ş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 :
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 :
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());
}
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




















