Bu Blogda Ara

18 Ekim 2011 Salı

Dinamik olarak Asp.Net GridView kullanmak...

Senaryomuz basit arkadaşlar;
Faturaların listelendiği bir gridview'imiz var.Bu faturalar saha satış elemanları tarafından işlenip sisteme kaydediliyor.Fakat bu faturaların şirket binasında çalışan personeller tarafından onaylanması gerekmektedir...
Personellet,Gridview içinde listelenmiş faturalardan hangilerinin onaylandığını ve hangilerinin hala onay beklediğini  görmek zorundadır...
Veritabanımızda faturalarımızın tutulduğu iki adet tablomuz var,faturaUst ve faturaAlt...faturaUst tablomuz bizim üzerinde çalışacağımız tablodur çünkü bizim bu işlemi yaparken faturada yer alan alt satırlar yani satılan ürün,ürünün fiyatı,kaç adet satıldığı,kdv matrahı vb... gibi şeylerle işimiz yok,biz sadece faturanın onaylanıp onaylanmadığı bilgisiyle ilgileniyoruz ve dolayısıyla bizim asıl ilgileneceğimiz tablo,faturanın genel bilgilerini tutan faturaUst tablosudur...O zaman ne yapıyoruz ? Hemen bu tabloda "Onay" adında int32 veritipinde bir alan oluşturmalıyız...Eğer bu alandaki değer 0 ise fatura onaylanmamış,bu değer 1 ise fatura onaylanmış...
Saha çalışanları faturayı işledikten sonra sistem otomatik olarak faturaUst tablosuna faturanın genel bilgilerini kaydederken "Onay" bilgisini 0 olarak kaydettiğini farzediyoruz...Şirket binasında çalışan arkadaşlarımız faturayı onayladığında ise ilgili faturanın "Onay" alanındaki 0 değerini 1 yapıyoruz.Yani aslında gayet basit...Ama listede bu değerlerin direk 1 ya da 0 olarak görünmesini istemek ve "anlasınlar kardeşim işte 0 false 1 true" diyemeyiz değil mi ? Çünkü onlar programcı değiller....
Bunu bir Sql sorgusu ile 0 değerini "Bekliyor",1 değerini ise "Onaylandı" şeklinde gösterebiliriz...Mesala şu komut gayet işe yarar bir komut;
CASE WHEN Onay =0 THEN 'Bekliyor' WHEN Onay=1 THEN 'Onaylandı' END AS Durum 
fakat aslında bu da etkili bir çözüm değil,çünkü yüzlerce fatura satırınının içinde bu farketmek zor olabilir,bence en güzeli png dosyaları kullanmak,böylece hem görsellik sağlamış olacağız hemde kullanıcılar için kolaylık.
Bunun için size güzel bir site önerebilirim http://www.iconfinder.com/ bu adresten konuya göre,boyuta göre istediğiniz formatta,büyüklükte dosyaları bulabilirsiniz...
Ben onaylanmış bilgisi için bir check,bekliyor bilgisi için bir saat indirip root klasörümün içindeki images klasörüme kopyaladım...
Şimdi gelelim gridview içinde önce bir alan açmaya...
Hemen bir TemplateField alanı oluşturuyoruz;

  <asp:TemplateField HeaderText="Durum">
          <ItemTemplate>     
                     <center>
                 <asp:Image ID="durumImg" runat="server" ImageUrl="~/images/bekliyor.png" />
                    </center>
        </ItemTemplate>
</asp:TemplateField>
Artık daha belirgin ve görsel bir grid elde ettik,fakat şimdi ne yapacağız? Tabi ki eğer "Onay" değeri 0 ise grid içinde ilgili alanda saat ,değer 1 ise check göstereceğiz...Bunun için gridview içinde bulunan tüm satırları tek tek okutup,ve okunan fatura ile ilgili bilgiyi içeren faturaUst tablosundaki satırı bulup,o satırın "Onay" alanındaki değeri bulacağız....
Bunun için önce gridview içinde kaç satırın var olduğunu bulmalıyız ve bu çok kolay
int satirSayisi=gridview.Rows.Count; // toplam satır sayısını int veritipindeki satirSayisi değişkenine aktardık burada...
daha sonra gridview içindeki satırların hepsini bitene kadar okutmalıyız,yani for döngüsü kullanıyoruz...döngü sınırımız satirSayisi kadar olmalı...


 if (GridView1.Rows.Count > 0) //satır var mı ?
            {
                for (int i = 0; i < GridView1.Rows.Count; i++) 
                {
                    Label lblBlg = (Label)GridView1.Rows[i].FindControl("lblFatBelgeNo");
                    string belgeNo = lblBlg.Text; //faturanın belge numarası 


                        var fatUstBel = from fT in fatData.faturaUsts.Where(j => (j.belgeNo == belgeNo))
                                        select fT; // tablodaki ilgili fatura
                        foreach (var glO in fatUstBel) // elde edilen dizi içindeki değerleri bize veren döngü
                        {
                           
                            if (glO.onay != null) //onay alanı boş değilse
                            {
                                if (glO.onay.Trim() == "Onaylandı") //eğer onaylı ise
                                {
                                    Image im = (Image)GridView1.Rows[i].FindControl("durumImg");
                                    im.ImageUrl = "../images/onay.png"; 
                                }
                                if (glO.onay.Trim() == "Bekliyor") // eğer bekliyor ise
                                {
                                    Image imgs = (Image)GridView1.Rows[i].FindControl("durumImg");
                                    imgs.ImageUrl = "../images/bekliyor.png";
                                }
                            }  
                        }
       
                }
            }



24 Ağustos 2011 Çarşamba

LINQ

Her ne kadar Microsoft  bizi ara sıra çıldırtmış olsa da , eğer bir .Net Yazılımcısı iseniz Microsoft'un bu yapıyı ne kadar geliştirdiğini,geliştirmeye devam ettiğini ve işlerimizi daha da kolaylaştırdığını inkar edemeyiz.

Yine bu ardı arkası gelmeyen yeniliklerden birisi de Linq...Benim fikrimi soracak olursanız eğer, SQL .Net yazılımcıları için artık tarih olmakta....en azından benim için. :)

Peki nedir LINQ ?

Özellikle C# her ne kadar genel amaçlı bir programlama dili olsa da,C# dili hemen hemen tüm veri merkezli sistemlerde kolaylıkla kullanılabiliyor.Yeterki hali hazırda bir veritabanı olsun :) İşte LINQ daha önceleri kullanmış olduğumuz SQL yapısını kolaylaştıran,kısaltan ve dolayısı ile yazılımcıya hem zaman hem de güvenlik açısından güven sağlayan yeni bir framework....
Geyik yapmaya devam edelim,hemen bir senaryo oluşturalım...
Diyelim ki elimizde KISILER adında basit bir tablomuz var...Bu kişi tablosunun alanları;

Adı,Soyadı,Telefonu,Adresi olsun....

Eğer hala SQL kullanmak konusunda inatçı iseniz ,dört alandan içeren kısa bir kayıt için yazmamız gereken SQL cümleciği şu olacaktır :
"INSERT INTO KISILER ('Adi','Soyadi',Telefonu','Adresi') VALUES ('Adnan','Ertörer','05412847381','İzmir Konak')";

tabi ki bu cümleciği çalıştırmak için ayrıca bir bağlantı açmamız,daha sonra bir Command nesnesi oluşturmamız,sonra bu nesneye bu cümleciği tanıtmamız,çalıştırmamız ve bağlantıyı kapatmamız gerekecekti ....

Peki LINQ ile bu işlem nasıl oluşuyor

Linq,sizin oluşturduğunuz veritabanının anlık kopyasını olduğu gibi tutar ve tabi ki böylece veritabanında ki her şey birer nesneye dönüşür....

VeritabaniDataContext Dt=new VeritabaniDataContext();

KISILERS kisi=new KISILERS()
{
     Adi=Adnan,
     Soyadi=Ertörer,
     Telefon=05412847381,
     Adres=İzmir Konak
};
dt.KISILERS.InsertOnSubmit(kisi);
dt.SubmitChanges();

iste bu kadar :)   konuyu ne kadar salaş bir şekilde anlattığımın fakındayım,şu an İzmir Asansör'de kahve içmekteyim...Şu anki atmosferden bu kadar çıkıyor :)  Bir daha ki makalemde tüm ayrıntıları ile LINQ konusuna döneceğiz....Herkese kolay gele .