C# 3 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
C# 3 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Çarşamba, Temmuz 08, 2009

Asp.Net MVC Framework - Master Pages Kavramı - I

Microsoft 'un web projelerini hazırlarken bizlere mimari tasarıları daha basit ve kullanışlı bir biçimde kullanmamızı sağlayan Asp.Net MVC Framework 'ü daha önceki yazılarımızda detaylı bir biçimde tanımaya çalıştık. Peki neler yapabiliyorduk. Son kullanıcıdan gelen istekler doğrultusunda başka bir sayfaya nasıl yönlendirebileceğimizi, Controller katmanı ile veri tabanı işlemlerini nasıl işleyip görsel sayfaya ileteceğimizi, model katmanı yardımı ile veri tabanı ile haberleşmelerin çok daha basit bir şekilde yapılabileceğini, veri tabanını aktif olarak kullandığımızda nasıl bir uygulama geliştirdiğimizi ve view sayfaları nasıl kolayca oluşturabileceğimizi detaylı olarak daha önceki yazılarımızda inceledik ve neler yapabileceğimizi gördük. Ayrıca uygulamalarımızda MVC tasarımını kullandığımızda daha önceden oldukça fazla uğraştığımız işlemleri ne kadar kolaylıkla yapabildiğimizi defalarca yapmış olduğumuz pratiklerde doğrulamış olduk. Bu yazımızda ise Asp.Net sayfalarında tasarım standardı açısından sıkça kullandığımız Master Pages kavramını MVC Framework 'te kullanım yapısını detaylı olarak inceliyor olacağız.

Asp.Net uygulamaların Master Page kullanmamızın sebebini kısaca hatırlayacak olursak. Benzer tarzda tasarım şablonu kullanacak olduğumuz sayfalarda tekrardan o tasarımsal öğeleri serverdan çağırıp sayfa üzerinde yüklenmemesini beklememek için oluşturulmuş başarılı bir yapıdır. Özellikle tasarım yapısı üzerinde herhangi bir değişiklik yok ise ve sadece içerikler değişecekse çok önemli bir tercih durumundadır. Aynı Asp.Net uygulamalarında olduğu gibi MVC uygulamalarında da Master Page kavramı önemli bir yer tutmaktadır. Varsayılan olan mavi bir tasarımı olan Master Page kullanılmaktadır. Peki biz bu tasarımı değil de kendi tasarımımızı Master Page 'e taşımak istersek neler yapmamız gerekir. Gelin hep birlikte bunu incelemeye çalışalım.

Her zaman olduğu gibi ilk olarak yapmamız gereken Visual Studio 2008 SP1 geliştirme ortamında bir Asp.Net MVC Framework Web uygulaması oluşturuyoruz. Proje dosyasının içerisinden ilk olarak varsayılan olarak oluşturulan Master Page 'in yerini bulalım.



MVC tasarımını dikkate alarak araştırmalarımızı yaptığımızda görsel öğelerin view katmanında olduğunu görürüz. Master Page her yerde kullanılacak bir içerik olduğu içinde view içerisinde Shared klasörünün içerisinde yer alır.

Biz uygulamamızda bu otomatik olarak oluşturulan Master Page 'i kullanmak yerine kendimize bir tane oluşturalım. Ama ilk olarak oluşturulmuş olan Site.Master 'ı siliyoruz. Sonrasında da Add- NewItem yolunu izleyerek web sitesine yeni bir Master Page ekliyoruz.



Master Page 'i sorunsuzca projeye ekledikten sonra nasıl bir içerik oluşturulacağının düşünülmesinin zamanı gelmiştir. Basit olması açısında içeriğe göre değiştirilebilir iki sütun ekleyelim. Bu değişen içerik eklemeyi Asp.Net 'ten de alışık olduğu gibi <asp:ContentPlaceHolder> yardımı ile yapacağız. İçeriği arttırdıktan sonra temel CSS ile Master Page 'in içerisine stil özellikleri de ekliyoruz ve bu yaptığımız işlemler sonrasında elimizdeki değişikler aşağıdaki gibi olacaktır.

View\Shared\Site.Master
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
   <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>

   <style type="text/css">
      html
      {
         background-color:Gray;
      }

      .column
      {
         float:left;
         width:300px;
         border:solid 1px black;
         margin-right:10px;
         padding:5px;
         background-color:white;
         min-height:500px;
      }

   </style>
   <asp:ContentPlaceHolder ID="head" runat="server">
   </asp:ContentPlaceHolder>
</head>
<body>
   <h1>Sitem</h1>

   <div class="column">
      <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
      </asp:ContentPlaceHolder>
   </div>
   <div class="column">
      <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
      </asp:ContentPlaceHolder>
   </div>
</body>
</html>

Eklemiş olduğumuz içerik kontrollerini body 'nin içerisine <div> taglarının arasına yerleştiriyoruz. Ayrıca div taglarının sütün gibi hareket etmesi için stil özelliğine daha önceden hazırlamış olduğumuz column 'u tanımlıyoruz. Yaptığımız bu işlemler sonucunda Master Page 'in görünümü aşağıdaki gibi olacaktır.



Basit fakat bizlerin hazırlamış olduğu bir Master Page 'e sahip olduk.

Master Page 'i Kullanan View Sayfa Oluşturmak

Asp.Net uygulamalarında Master Page 'ten yararlanarak web sayfaları oluşturabilmemiz mümkündü. Bunun bize en büyük yararı oluşturmuş olduğumuz sayfalarda Master Pages üzerinde belirtmiş olduğumuz içerik kontrol alanlarının düzenlenebilmesi ve diğer taraflar üzerinde herhangi bir değişiklik yapmadan hazırlıyor olmamızdır. MVC Framework 'ten yararlanarak hazırlamış olduğumuz web sayfalarında da Master Page Asp.Net uygulamalarında olduğu gibi kullanılmaktadır.

View klasörünün içerisinde yer alan Home klasörünün üzerinde sağ tıklama sonrasında karşımıza gelen menüden Add - NewItem seçeneğine tıklayarak ekrandan MVC View Content Page i seçerek Master Page 'i kullanabileceği bir web sayfa oluşturmaya başlıyoruz.


Sayfa tipimizi seçip ekle dediğimizde hazırlamış olduğumuz Master Page 'ler den istediğimizi seçmek için bir ekran çıkacaktır.


Tamam dedikten sonra artık Master Page 'i kullanan bir web sayfası uygulamamızda oluşturulmuş olacaktır. Oluşturulan sayfanın arka plan kodları aşağıdaki gibi oluşturulmuştur.

View\Home\Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
</asp:Content>

Standart olarak projelere eklenmiş olan *.aspx sayfalardan farklı olarak HTML ve Body tagları yer almaktadır. Bu taglar Master Page de oluşturulduğu için yalnızca belirttiğimiz içerik kontrol alanları sayfada gözükmüştür ve sayfa içerisinde kullanıcılara göstermek istediğimiz içerikleri buralardan yayınlarız. Örnek olması açısında body taglarının içerisine eklemiş olduğumuz <asp:content> 'lerin içerisinde biraz değişiklik yaparak aldığımız sonuca hep birlikte çok atalım.

View\Home\Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   İlk içerik kontrol alanı
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
   İkinci içerik kontrol alanı
</asp:Content>

Yaptığımız düzenleme sonrasında ekran değişikliğimiz aşağıdaki gibi olacaktır.



Yapılmış olan değişikler sonrasında web sayfamızın içeriği istediğimiz gibi olmuştur.

Master Page yardımı ile oluşturulan view sayfanın içeriğini düzenlemek

İlk olarak düzenleme yapağımız yer sayfamızın başlığı olacaktır. Oluşturmuş olduğumuz web sayfası internet tarayıcısında açıldığında pencerenin en üst kısmında yer alan bölümü düzenleyelim. Asp.Net ten ve diğer bütün web sayfası kodlama yapılarından alışık olduğumuz üzere title bölümünde belirtmemiz yeterli olacaktır.

Sayfamızın markup kod tarafında en üstte yer alan <Page> </Page> bölümün aralığının içerisinde yer alan title özelliğini değiştirerek sayfa başlığını sorunsuzca oluşturmuş oluruz.


Yapmış olduğumuz işlemi hazırlanmış olan Master Pages ile ilişkilendirerek tekrardan yapalım. Bu durumda ilk olarak oluşturulan Master Pages içerisine koyduğumuz içerik kontrol alanlarını hatırlamamız gerekir ve bir tane head bölümünün içerisine <asp:contentplaceholder> ekledik. Alana başlık, meta ve diğer birçok kriteri ekleyebilmemiz mümkündür. Bu özellikten yararlanarak aspx sayfasının içerisinde aşağıdaki değişiklikleri uyguluyoruz.

View\Home\Index.aspx
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
   <title>Başlık buraya yazılacak</title>
   <meta name="description" content="İçindekiler buraya" />
   <meta name="keywords" content="ana arama kriterleri buraya" />

</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   İlk içerik kontrol alanı
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
   İkinci içerik kontrol alanı
</asp:Content>

Asp.Net uygulamaları ile uygulamadığımız tekniklerin birebir aynısıdır. Bu örneklerin bu kadar detaylı olarak gösterilmesinin sebebi Master Pages kavramının temel yapısının alışık olduğumuz Asp.Net Master Pages kavramından bir farkının olmadığını da göstermek amacıyladır. Yapmış olduğumuz işlemler sonrasında karşımıza gelen ekran görüntüsü aşağıdaki gibi olacaktır.



Yaptığımız işlemler sonucunda gayet başarılıyız. :)

Bu yazımızda Asp.Net MVC Framework ile hazırlanmış olan uygulamalarda Master Pages kavramını nasıl kullanabileceğimizi ve içerik düzenlemelerini nasıl kullanabileceğimizi detaylı bir biçimde incelemeye çalıştık. Bir sonraki MVC Framework yazımızda Master Pages kavramını incelemeye devam ederken veri tabanı işlemleri ile ilişkilerine de detaylı bir biçimde değineceğiz.

Umarım yararlı olabilmiştir.
info@turhaltemizer.com

Salı, Haziran 23, 2009

Asp.Net MVC Framework - Model Kavramı

Asp.Net MVC Framework ile gelen web proje şablonunun kullanımını ve detaylarını incelemeye başladığımız serimizde üç temel katmandan sonuncusu olan model yani veri tabanındaki tablolarını nesne olarak kullanabilmemize olanak tanıyacak yapıyı incelemeyerek serimize devam ediyoruz.

MVC Framework ile uygulamalar geliştirirken eğer veri tabanı işlemlerini de kullanmak istiyorsak model katmanı içerisinde nesne modelimizi oluşturarak işlemlerimizi yapabilmemiz mümkün olacaktır. Asp.Net ile veri tabanı uygulaması geliştirmek istediğimizde ya Enterprise Library ya NHibernate ya da SqlHelper gibi connection pooling ten tutunda daha bir çok veri tabanı işlemini bünyesinde yapabilen projeleri kullanırdık. .Net Framework 3.0 'ın çıkışı ile bu işlemlerimizi LinQ to SQL ile de yapabilir duruma geldik. Zaman ilerleyip .Net 3.5 'in çıkışı ile Ado.Net Entity Framework yapısı ile tanıştık, SP1 'i ile de projelerimizde kullanmaya başladık. Genel olarak hem Linq to SQL hem de Ado.Net Entity Model O/RM modelini daha kolay ve anlaşılabilir biçimde gerçekleştirebilmemize olanak tanımaktadır.

Genel olarak MVC Framework' te model veri tabanı işlemlerimizi yapabilmemiz için gerekli olan tablo, StoreProcedure ve function gibi işlevleri nesne olarak tanımlayıp daha sonrasında controller katmanınında gerekli işlemleri yaparak kullanabilmemize olaran tanımaktadır.

Yazımızı incelerken Ado.Net Entity Data Modeli inceleyerek devam edeceğiz.

Modeli oluşturabilmek için ilk olarak bir veri tabanına ve bunun içerisinde yer alan tablolara ihtiyacımız olacaktır. Bu sebepten ötürü ilk olarak veri tabanını oluşturuyoruz. Biz şirket isimli veri tabanını oluştururak ilk adımı tamamlıyoruz. Sonrasında aşağıdaki kolonları tabloya ekliyor ve adını SirketSektor olarak belirliyoruz.



Artık veri tabanını ve tabloyu oluşturduğumuza göre MVC uygulamasını oluşturup model kavramını incelemeye başlayabiliriz.

Ado.Net Entity Data Model Oluşturulması

Ado.Net Entity Data Model daha öncede bahsettiğimiz .Net Framework 3.5 SP1 ile Visual Studio ide mize eklenmiştir. İlk olarak MVC proje şablonundan MVC web uygulamasını oluşturuyoruz. Model klasörünün üzerinde sağ tıklama yaparak yeni bir data model ekliyoruz.



Sonrasında karşımıza çıkan ekranda Generate From DataBase seçeneğini seçerek ilerle diyoruz.



Veri tabanına erişebilmemiz için gerekli bağlantı ayarlarının yapılması gereken ekrana sıra geldi. Burada veri tabanı bağlantı bilgilerimizi ekliyoruz.



Oluşturmuş olduğumuz veri tabanı tablosunu projemize model olarak eklediğimizde bize oluşturulan nesne yapısı aşağıdaki gibidir.


Veri modelini MVC Framework ile hazırlamış olduğumuz web projesine sihirbaz yardımıyla adım adım nasıl ekleyeceğimize göz attık. Eklemiş olduğumuz modeli designer ekranında isim ve benzeri özelliklerini değiştirebilmemiz mümkündür. Veri tabanını model olarak projemize ekledik ve kullanabilir bir duruma getirdik. Şimdi oluşturmuş olduğumuz modeli diğer sınıflarda da kullanabilmek için ilk olarak projemizi derliyoruz. Derledikten sonra modeli kullanmak istediğimiz controller sınıfına Model isim alanını ekliyoruz.

Entity Framework ile Veri Tabanı Kayıtlarına Select işlemi Uygulamak

Daha önceki yazılarımızdan hatırlayacağınız üzere kullanıcıların kullanacağı sayfalara ilişkin verileri controller sınıflarında hazırlardık. Index sayfasında gösterilecek veriler için Index() metodu kullanılır ve içeriği ona göre doldurulur. Controller içerisindeki metottan da otomatik view ekle dediğimizde bize bir liste mi oluşturmak istediğimizi soruyor. Bu bizim yaptığımız işlem sonucunda ToList() yardımı ile sorgumuzu tamamlayacağımızı göstermektedir.

Controller\HomeController.cs
using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;

namespace ModelInside.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        MoviesDBEntities _db;

        public HomeController()
        {
            _db = new MoviesDBEntities();
        }

        public ActionResult Index()
        {
            ViewData.Model = _db.MovieSet.ToList();
            return View();
        }
    }
}

Ado.Net Entity Framework veri modeli üzerinde oluşturulmuş olan veri tabanı objesine erişebilmek için ilk olarak değerimizi yüklüyoruz. Sonrasında _db objesine veri tabanı nesnelerine erişebilmemiz için gerekli EDML sınıfımızı tanımlıyoruz. Bu işlemler sonucunda artık projemizde veri tabanı nesnelerini kullanabilir duruma gelmiş bulunuyoruz. Bu işlemleri gerçekleştirdikten  artık tablo üzerinde işlemleri yapabiliriz. Yukarıdaki kod parçasında da görüleceği üzere index() sayfasında verilerimizi göstermek istiyoruz. Bu işlemleri daha önceden select sorguları yazarak yapmamız gerekiyordu. Fakat Linq To Sql ile artık kullanımına alıştığımız nesnesel veri tabanı öğeleri var. Bu özelliklerden MovieSet 'i kullanarak belirtilen tablo içerisinde ki bütün verileri bir List olarak döndürebilmemiz mümkündür. Bu kısa yöntemi LinqToSQL ile yazmış olsaydık nasıl bir kod parçası yazacağımıza kısaca bir göz atalım.

ViewData.Model = _db.MovieSet.ToList(); //Ado.Net Entity Framework ile
ViewData.Model = (from m in _db.MovieSet select m).ToList(); //LinqToSQL ile

LinqToSql ile yazılmış sorgunun metot olarak kullanılmış hali Ado.Net Entity Model de olan yapıdır. Basitçe hazırlamış olduğumuz index metodunun view sayfasını oluşturarak yazımıza devam edelim.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<mak53.Models.Film>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
   <h2>
       Index</h2>
   <div>
      <% foreach (var item in ViewData.Model)
      { %>
           Film Adi:
           <%= item.Film_Adi %>
           <br />
           Yonetmen:
           <%= item.Yonetmen%>
           <br />
           <%= Html.ActionLink("Edit", "Edit", new { id = item.Id })%>
           <%= Html.ActionLink("Delete", "Delete", new { id = item.Id })%>
           <hr />
       <% } %>
       <%= Html.ActionLink("Add Movie", "Create") %>
    </div>
</asp:Content>

Foreach yardımı ile sorgumuz sonucunda dönen verileri sayfamızda gösterebilmesine olanak tanınır. Index metodunu index view ı ile ilişkilendirdiğimizde karşımıza çıkan sonuç aşağıdaki gibi olacaktır.



Entity Framework ile Veri Tabanı Kayıtlarına Insert işlemi Uygulamak

Daha önceki yazılarımızda da defalarca nasıl insert işlemini gerçekleştireceğimize değinmeye çalıştık. Bu yazımız tamamen sql işlemlerine odaklı olduğu için daha farklı bir kod yazımı ile işlemlerimizi gerçekleştireceğiz. Fakat kısaca hangi metotlarda hangi işlemleri yapacağımızı kısaca tekrardan değinelim. Insert işlemlerini gerçekleştirmek için controller sınıflarındaki create metotlarını kullanmamız gerekmektedir. Form koleksiyonu olan metotta gerekli veri ekleme işlemleri yapar ve veri sonucunu create metodu içerisinde tamamlanır.

Yukarıda değindiğimiz işlemleri gerçekleştiren kod bloğu aşağıdaki gibi olacaktır.

public ActionResult Create()
{
   return View();
}

//
// POST: /Home/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
   var filmEkle = new Film();

   //Deserialize (Listeye ekliyoruz...)
   TryUpdateModel(filmEkle, new string[] {"Film_Adi", "Yonetmen"}, collection.ToValueProvider());
   if (string.IsNullOrEmpty(filmEkle.Film_Adi))
      ModelState.AddModelError("Film_Adi", "Film adini hatali girdiniz");
   if (string.IsNullOrEmpty(filmEkle.Yonetmen))
      ModelState.AddModelError("Yonetmen", "Yonetmen bilgilerini hatalı girdiniz..");
   //Bilgiler doğruysa filmi kaydediyoruz,
   if(ModelState.IsValid)
   {
      _db.AddToFilm(filmEkle);
      _db.SaveChanges();
      return RedirectToAction("index");
   }
   return View(filmEkle);
}

Form üzerinden toplanan bilgiler ile veri doğrulaması yapıyoruz, sonrasında da gerekli tabloya veri ekleme işlemini gerçekleştirmiş oluyoruz. Veri tabanına verinin eklendiği satırlar _db_addToFilm(filmEkle) ve _db.SaveChanges() 'tır. TryUpdateModel metodu bize kullanıcılar tarafında girilen verileri kontrol etmemize olanak tanır. Validation kontrolü gibi çalışmaktadır.

Bu işlemler sonucunda otomatik olarak Create view 'ı oluşturduktan sonra projemizi derleyip çalıştırıyoruz. Herhangi bir veri girmeden kayıt yap dediğimizde aşağıdaki gibi bir sonuç alınmaktadır.



İki alan için kontrol yapmıştık ve istediğimiz sonucu aldığımızı görüyoruz. Basit bir şekilde validation kontrollü olarak insert işlemini nasıl gerçekleştireleceğine değinmeye çalıştık.

Entity Framework ile Veri Tabanı Kayıtlarına Update işlemi Uygulamak

MVC uygulamalarında güncelleme işlemlerini gerçekleştirmek için edit metotlarının kullanıldığını ve temel olarak hangi işlemleri uygulamamız gerektiğini detaylı bir biçimde incelemiştik.
Herkese mutlu günler diliyorum. Güncelleme işlemlerinde dikkat edilmesi gereken en kritik nokta tek bir kayıt üzerinde güncelleme yapılacağı için seçilen kayıta doğru sonucu getirebilmektedir.

public ActionResult Edit(int id)
{
   var filmToGuncelle = _db.Film.First(m => m.Id == id);
   ViewData.Model = filmToGuncelle;
   return View();
}

//
// POST: /Home/Edit/5

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection collection)
{
   var id = Int32.Parse(collection["id"]);
   var filmToGuncelle = _db.Film.First(m => m.Id == id);

   TryUpdateModel(filmToGuncelle, new String[] {"Film_Adi", "Yonetmen"}, collection.ToValueProvider());
      if (String.IsNullOrEmpty(filmToGuncelle.Film_Adi))
   ModelState.AddModelError("Film_Adi", "film adini hatali girdiniz");
      if (String.IsNullOrEmpty(filmToGuncelle.Yonetmen))
   ModelState.AddModelError("Yonetmen", "Yonetmen bilgilerini giriniz");

   if(ModelState.IsValid)
   {
      _db.SaveChanges();
      return RedirectToAction("index");
   }
   return View(filmToGuncelle);
}

var filmToGuncelle = _db.Film.First(m => m.Id == id); kod parçasında hangi kayıtın güncelleneceği bilgisine ulaşıyoruz. Diğer satırlarda ise yeni bir kayıt oluşturma işlemimde de olduğu gibi verileri kontrol ediyoruz ve en sonunda işlemleri doğruluyoruz.

Entity Framework ile Veri Tabanı Kayıtlarına Delete işlemi Uygulamak

Veri tabanında veri silme işleminde güncelleme işleminde olduğu gibi bir gerekli id 'ye ilişkin kayda ulaştıktan sonra entity modelinde yer alan delete metodunu kullanarak işlemi tamamlıyoruz.

public ActionResult Delete(int id)
{
   var filmToSil = _db.Film.First(m => m.Id == id);

   _db.DeleteObject(filmToSil);
   _db.SaveChanges();

   return RedirectToAction("index");
}

Veri silme işlemini başarılı bir şekilde gerçekleştirmiş bulunuyoruz. Sonuç olarak yazımızda nelere değindiğimize göz atmak gerekirse, entity data model i nasıl oluşturacağımıza, projemize nasıl ekleyeceğimize ve eklemiş olduğumuz bu data model yardımı ile select,update,insert ve delete işlemlerini incelemeye çalıştık.

Umarım yararlı olabilmiştir.

Perşembe, Haziran 18, 2009

Silverlight 2.0 – SQL İşlemleri için WCF ve Linq To SQL Kullanım

Silverlight uygulamları RIA yapısında oldukları için direk sql işlemleri ile çalışmak yerine bunları bir servis olarak oluşturup kullanmamız önerilmektedir. Bu sebepten ötürü veri tabanı işlemlerimizi yapmak için ister Linq Data Model oluşturduktan sonra WCF servisine querynin yapılacağı metota bağlyoruz. Sonrasında Silverlight projesine Web service referance olarak ekledikten sonra gerekli işlemleri yaparak istediğimiz data kontrollerine ekleyebilinmesi mümkündür.

Sırası ile yapılması aşağıdaki adımları uygularsanız sizin projenizde sorunsuz bir biçimde çalışacaktır.

  • Silverlight projesi oluşturuyoruz.
  • Oluşturulan web projesine Linq To SQL Data Model ekliyoruz.
  • Oluşturulan web projesine WCF Service ekliyoruz ve aşağıdaki kodları interface ve sınıfa ekliyoruz.

IService1.cs

using System.Collections.Generic;
using System.ServiceModel;

namespace SQLData.Web
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        List<Customer> GetCustomerGetByLastName(string lastName);
    }
}

Service1.cs

using System.Collections.Generic;
using System.Linq;

namespace SQLData.Web
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config.
    public class Service1 : IService1
    {

        #region IService1 Members

        public List<Customer> GetCustomerGetByLastName(string lastName)
        {
            var ctx = new DataClasses1DataContext();
            var matchingCustomer = from cust in ctx.Customers
                                   where cust.LastName.StartsWith(lastName)
                                   select cust;
            return matchingCustomer.ToList();
        }

        #endregion
    }
}

  • Yukarıdaki işlemleri gerçekledikten sonra webconfigte ws service content özelliğini basic olarak değiştiriyoruz.
  • Uygulamayı derliyoruz.
  • Sİlverlight uygulaması üzerine ilk olarak Silverlight.Data.Control assembly ‘ını projeye ekliyoruz. Bu işlem silverlight uygulamasında DataGrid kontrolünü kullanabilmenize olanak tanıyacaktır.
  • Silverlight uygulamasına WCF service ini referans olarak ekliyoruz.
  • Sonrasında Page.xaml ve page.xaml.cs ‘e aşağıdaki kod bloklarını ekliyoruz

Page.xaml

<UserControl x:Class="SQLData.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    Width="700" Height="300">
    <Grid x:Name="LayoutRoot" Background="White" ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>       
        <TextBlock Text="Lütfen Arayacağınız kişinin soyadını giriniz.." Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left"/>
        <TextBox x:Name="txtLastName" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Right" Width="150" Text="Lütfen arayın..."/>
        <my:DataGrid x:Name="grd" AlternatingRowBackground="Beige" AutoGenerateColumns="True" Width="700" Height="200" CanUserResizeColumns="True" Grid.Row="1"/>
        <Button x:Name="btnClick" Grid.Row="2" HorizontalAlignment="Center" Content="Ara"/>
    </Grid>
</UserControl>

Page.xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;

namespace SQLData
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(Page_Loaded);
        }

        void Page_Loaded(object sender, RoutedEventArgs e)
        {
            btnClick.Click += new RoutedEventHandler(btnClick_Click);
        }

        void btnClick_Click(object sender, RoutedEventArgs e)
        {
            ServiceReference1.Service1Client webService = new SQLData.ServiceReference1.Service1Client();
            webService.GetCustomerGetByLastNameCompleted += new EventHandler<SQLData.ServiceReference1.GetCustomerGetByLastNameCompletedEventArgs>(webService_GetCustomerGetByLastNameCompleted);
            webService.GetCustomerGetByLastNameAsync(txtLastName.Text);
        }

        void webService_GetCustomerGetByLastNameCompleted(object sender, SQLData.ServiceReference1.GetCustomerGetByLastNameCompletedEventArgs e)
        {
            grd.ItemsSource = e.Result;
        }
    }
}

Yukarıdaki işlemleri adım adım yaptıktan sonra projemizi çalıştırdığımız da sorunsuzca uygulamamız çalışacaktır. Yaptığımız işlem ise soyadını girdiğimiz kullanıcıları DataGrid kontrolünde listelemektir.

Not: Linq To Sql Data Model de SQL Server 2008 veri tabanı örneklerinden AdventureWorks_LT veri tabanından Customer tablosunu kullandık.

Herkese mutlu günler diliyorum.

Çarşamba, Haziran 17, 2009

Silverlight 2.0 – Çalışma Anında Otomatik Kontrol Eklenmesi

Silverlight web forma eklemiş olduğumuz button kontrolü yardımı ile sınırsız button kontrolü eklenmesini açıklayan XAML ve C# kodunu vereceğim. Bu örneği kullanarak diğer kontrolleri de ekleyebilmeniz mümkündür.

XAML
<UserControl x:Class="Controls.Page"
    xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <Canvas x:Name="myCanvas">
        <Button x:Name="btnIsMy" Content="Oylesine duruyor..." Canvas.Left="10" Canvas.Top="10"/>
        <Button x:Name="btnAnother" Content="Another" Canvas.Left="10" Canvas.Top="30"/>
        <CheckBox x:Name="rushOrder" Content="Rush" Canvas.Left="10" Canvas.Top="50"/>
    </Canvas>
</UserControl>

C#
using System.Windows;
using System.Windows.Controls;

namespace Controls
{
    public partial class Page
    {
        public Page()
        {
            InitializeComponent();
            btnAnother.Click += BtnAnotherClick;
        }

        private double _newButtonPosition = 100.0;

        void BtnAnotherClick(object sender, RoutedEventArgs e)
        {
            var b = new Button {Content = "Ben yaşıyorum"};
            b.SetValue(Canvas.LeftProperty, 10.0);
            b.SetValue(Canvas.TopProperty, _newButtonPosition);
            _newButtonPosition += 30.0;
            b.Width = 100;
            b.Height = 20;
            b.IsEnabled = true;
            b.Click += b_Click;
            myCanvas.Children.Add(b);
        }

        static void b_Click(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            if (btn == null) return;
            btn.Content = "Basma...";
            btn.IsEnabled = false;
        }
    }
}

Umarım yararlı olabillr. İyi çalışmalar…

Cumartesi, Ağustos 09, 2008

Sharepoint için Silverlight --> Blueprint

Çalıştığım şirketteki pozisyonum gereği belli bir süredir Sharepoint, WSS, MOSS gibi teknloljileri inceliyorum ve uygulama geliştiriyorum. Bu araştırmalarım esnasında Silverlight ile Sharepoint 'in entegreli olarak çalışabildiğine ve buna da Blueprint dendiğini gördüm.
Silverlight uygulamalarını sharepoint üzerinde çalıştırmak istediğimizde bizden hangi versiyon ile çalışmak istediğimiz hangi kod dosyası ile geliştirme yapmak istediğimiz gibi işlemleri yapmamızı istemektedir.
Kullanmak isteyenler ilk olarak bir Virtual PC indirmelidir. Daha sonra Microsoft tarafında 30 günlük deneme sürümü olarak hazırlanan ve içerisinde MOSS ve WSS kurulu olan Windows Server 2003 'ü indirmeleri gerekmektedir. Daha sonrasında ise yapacağınız uygulamalar geliştirmek olacaktır.
İyi çalışmalar...
Not: Blueprint ile ilgili daha ayrıntılı bilgi için İngilizce olarak yazılmış olan yazıda yer alan linklerden yararlanabilirsiniz...

Pazartesi, Mayıs 12, 2008

WPF - Kendi Kullanıcı Kontrolmüzün (User Control) Oluşturulması

Windows Presentation Foundation ‘ın bizlere kattığı yenilikleri ve maksimum kullanıcı deneyimini günler geçtikçe daha iyi anlamaya başladık. Bu avantajları sağlayan en önemli etmenlerden biride özelleştirilebilir kullanıcı kontrolleri olmuştur. Bizlere sunulan kullanıcı kontrollerini dilediğimiz şekilde kullanarak son kullanıcıların hoşlarına giden uygulamalar hazırlayabiliyoruz. Fakat bazı noktalarda bu kontroller işlerimizi tam anlamıyla göremeyebiliyorlar. Bu durumlarda bizlerin yapması gereken ise kendi kullanıcı kontrollerimizi oluşturmak oluyor.

Kendilerimizin hazırlamış olduğu kullanıcı kontrollerini oluştururken Visual Studio (VS) ve Expression Blend (EB) ‘den yararlanabilmemiz mümkündür. EB ile hazırlamış olduğumuz kullanıcı kontrollerine işlevliğin yanı sıra birçok güzel animasyonda ekleyebilmemiz mümkün oluyor. EB ile tasarımını bitirmiş olduğumuz kontrolleri de rahatlıkla VS üzerinden kullanabilmemiz mümkün oluyordu. Bir diğer seçeneğimiz ise hiç işin tasarım ve animasyon yanlarına girmeden VS ile de sade tasarımlar oluşturabilmemiz mümkün oluyor. İşte biz bu yazımızda kendi kullanıcı kontrollerimizi (UserControl) nasıl oluşturacağımıza değinmeye çalışıyor olacağız. Konumuzu incelerken de örnek üzerinden değinerek daha akılda kalmasına olanak tanınacaktır.

Kendi kullanıcı kontrollerimizi geliştirme gereksinime ihtiyaç duymamız birçok sebepten ötürü doğmuştur. Bunlar kontrollerin yapmak istediğimiz işlemleri yerine getiremememizden tutunda yetersiz gördüğümüz özelliklerine kadar daha birçok düşünce aklımıza gelebilir. Bu durumda yapmamız gereken kendi isteklerimizi karşılayacak olan bir kontrol geliştirmek olacaktır.

Kullanıcı kontrollerimizi geliştirmeye başlarken ilk yapmamız gereken VS ‘den bir WPF uygulaması açmak olacaktır. Daha sonra yapmamız gereken ise oluşturmuş olduğumuz uygulamaya bir kullanıcı kontrolü eklemek olacaktır. İşlemimiz için iki yol vardır. Project-->AddUserControl yolunu takip etmektir.



Diğer yol ise Project-->Add NewItem yolunu takip edip karşımıza çıkan menüden UserControl (WPF) seçeneğini seçerek oluşturabiliriz.



İki farklı UserControl ekleme yolu gördük. Bu iki seçeneğin bir birinden farklı yerlerde olmasının içerik açısından hiçbir farklılığı yoktur. Sadece kolaylık olması açısından UserControl seçeneği ek olarak ayrı bir seçenek olarak sunulmuştur.

UserControl ümüzü yukarıda bahsettiğimiz iki yöntemden biri ile ekleyerek karşımıza gelen XAML dosyayı incelemeye başlayabiliriz. Ben bu uygulama için UserControl e “KontrolTurhal” adını verdim. Sizler istediğiniz ismi verebilirsiniz.



Eklenmiş olan kullanıcı kontrolüne değinelim. Karşımıza çıkan bir XAML dosyanın UserControl olduğunu anlayabilmemizin en kolay yolu ilk tag a bakmamız olacaktır. Burada UserControl yazdığına dikkat ediniz. Bunun anlamı ise yapmış olduğumuz işlemlerin diğer XAML dosyalar ve C# kod tarafında UserControl olarak algılanacağıdır. UserControl dışında Window, Page en çok kullanılan formlardır. User Control ise bu formlarda kullanılacak olan bileşenleri hazırlamamıza olanak tanır. Yukarıdaki resimde eklemiş olduğumuz UserControl ‘ün hangi sınıfa ait olduğunu yani hangi projede kullanılacağını belirtildiği yer ise x:Class bölümüdür. Oraya dikkat ederseniz KullaniciKontrol projesinin içerisine KontrolTurhal UserControl ‘ünün oluşturulduğunu rahatlıkla görebilirsiniz.

Artık kullanıcı kontrolümüzü oluşturmaya başlayabiliriz. Kullanıcı kontrollerini oluştururken dikkat etmemiz gereken en önemli özellik kullanıcıların neleri yapacağını düşünerek hareket etmemiz olacaktır.

Kullanıcı kontrolümüzü oluşturmaya başlarken ilk olarak DockPanel alanına ilişkin özellikleri tanımlıyoruz daha sonrada bir Border element tanımlayıp ona ait özellikleri belirlemeye başlıyoruz. Belirlediğimiz bu özellikler aşağıda görülmektedir.

KontrolTurhal.xaml
<UserControl x:Class="KullaniciKontrol.KontrolTurhal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DockPanel LastChildFill="True">
<Border DockPanel.Dock="Top" CornerRadius="4,4,0,0" Width="Auto"
Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="Beige" BorderBrush="Brown" BorderThickness="1">
<TextBlock x:Name="txt_baslik" Width="Auto" Height="Auto"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></TextBlock>
</Border>
<Border DockPanel.Dock="Top" CornerRadius="0,0,4,4" Width="Auto"
Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
BorderBrush="Brown" BorderThickness="1,0,1,1" MinWidth="100px" MinHeight="100px">
<TextBlock x:Name="txt_icerik" Width="Auto" Height="Auto"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></TextBlock>
</Border>
</DockPanel>
</UserControl>

Belirmiş olduğumuz özelliklerin sonucunda kontrolümüzün aldığı ilk görüntü aşağıdaki gibi olmuştur.

Hazırlamış olduğumuz form kontrolüne dikkat ederseniz başlık ve içerik bölümlerinden oluşmakta ve bu bölümlere TextBlock yardımı ile yazı yazabilmekteyiz. Böyle bir kontrol tasarlamamızın amacı uygulamalarımızda başlık ve içerikten oluşan bu bölüm kullanacağımız zaman tek tek kontrolleri birleştirip oluşturmak yerine daha kullanışlı olması açısından böyle bir uygulama geliştirilmesine karar verilmiştir.

Şimdi içeriklerinin daha dinamik bir biçimde değiştirilebilmesi için C# kod tarafına özellikleri belirtmeye başlıyoruz. Özelliklerimiz başlıktan ve içerikten gelecek olan değerler için olacaktır. Hazırlamış olduğumuz C# kodu aşağıdaki gibidir.

KontrolTurhal.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;

namespace KullaniciKontrol
{

public partial class KontrolTurhal : UserControl
{
public KontrolTurhal()
{
InitializeComponent();
}

public string BaslikTxt
{
get {
return this.txt_baslik.Text;
}
set {
this.txt_baslik.Text = value;
}
}

public string IcerikTxt
{
get {
return this.txt_icerik.Text;
}
set {
this.txt_icerik.Text = value;
}
}
}
}

Yukarıda hazırlamış olduğumuz kod bloğunu kısaca açıklamak gerekirse, başlık ve içeriğe ilişkin özellikleri tanımladık. Ayrıca hazırlamış olduğumuz bu sınıfta dikkat edilecek olan bir nokta kullanılacağı projede kullanılabilecek olduğunun belirtilmiş olmasıdır. Bu bahsettiğimiz duruma namespace ile tanımlanmış bölümde görebilirsiniz. Ayrıca bu belirtme sayesinde XAML dosyamızda hazırladığımız kontrolü rahatlıkla kullanabileceğiz.

UserControl ümüzü bu şekilde ana uygulamamıza çağırmak istersel yapmamız gereken başlıca şey onu uygulamaya eklemek olacaktır. Bunun için ise kullanacağımız yöntem xmlns ile yapılacaktır. xmlns:… üç nokta ile belirttiğimiz yere kontrolü tanımlamımız gerekecektir. Bunun için yapmamız gerekecek User Control Custom ‘ı uccustom olarak belirtmek olacaktır. Sonrasında bizden CLR ‘ı belirtmemizi isteyecektir. Bizde elimizde bulunan isim alanlarını tanımlayarak işlemi bitirmiş olacağız. Dikkat ederseniz biraz önce bahsetmiş olduğumuz sınıftaki nameSpace ‘i kullanmış olacağız.

Not: User Control Custom olarak belirttiğimiz bölümü istediğimiz biçimde tanımlayabilmemiz mümkündür. Benim böyle bir şeyi tercih etmemim sebebi yaptığımız işlemin harici kullanıcı kontrolü hazırlamak olduğundan ötürü akılda daha kalıcı olması açısından öyle belirttim. Sizler xmlns:turhal (isim örnek amaçlıdır) biçiminde yazarak ta kullanabilirsiniz. Bu durumda aşağıda anlatacak olduğumuz işlemleri belirttiğiniz isme göre yapmanız gerekecektir.

,

Artık harici kontrollerimizi uygulamamızın ana ekranında kullanabilir duruma gelmiş durumdayız. Şimdi yapacak olduğumuz diğer kontrolleri kullanırmış gibi uygulamamıza eklememiz olacaktır. Tabii bunu yaparken dikkat etmemiz gereken bir nokta var. hazırladığımız olan kontrol bileşen paletinde değilde uygulamamız içerisinde olduğundan ötürü xmlns ile tanımlamış olduğumuz isme göre işlemlerimiz yapmamız gerekmektedir. Şimdi bunu nasıl yapacağımızı göz atalım.



Kullanıcı sınıfımızı çağırdıktan sonra kod tarafında tanımlamış olduğumuz özellikleride kullanabiliyoruz.



Intellisence sonucunda bizim tanımlamış olduğumuz özellikleri de tanımlıyoruz. Oluşturduğumuz XAML kodu aşağıdadır.

<Window x:Class="KullaniciKontrol.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uccustom="clr-namespace:KullaniciKontrol"
Title="Kullanici Kontrolleri" Width="300" Height="300">
<Grid>
<uccustom:KontrolTurhal Width="200px" Height="150px"
IcerikTxt="Icerigimizi giriyoruz."
BaslikTxt="Basligi giriyoruz.">
</uccustom:KontrolTurhal>
</Grid>
</Window>

Uygulamamızı çalıştırdığımız zaman ekran görüntümüzde aşağıdaki gibidir.



Kontrolümüzün içerikleri istediğimiz şekilde gerçekleşti. Hazırlamış olduğumuz kontrolde başlık ve içerik bir biçimde tanımlamış olduğumuz özellikleri doldurarak oluşturduğumuz tasarımın içerisinde yazdıklarımızı görmüş oluyoruz. Ayrıca özelliklerimizi Properties penceresinden de görebiliyoruz.



Kontrolümüzü kullanma ile ilgili birkaç noktaya değinmeye çalışalım. İçerik ve başlık biçiminde yazılarımızı girebildiğimizden bahsetmiştik. Diğer kontrolleri göz önüne aldığımızda kendi içerik özelliklerinin dışından varsayılan olarak taglar arasında yazılanları kullanıcı kontrolü dâhilinde gösterebilmektedir. Bunların en bariz örneği de <TextBlock> kontrolüdür. Bu kontrolde Text=”deneme” biçiminde içeriğini belirlerken aynı zamanda <TextBlock>deneme</TextBlock> şeklinde de tanımlayabiliyoruz. Fakat bizim hazırlamış olduğumuz kontrolü göz önüne alırsak IcerikTxt=”” özelliğinin içeriğine yazmış olduğumuz yazıyı buradan kaldırıp ta <uccustom:KontrolTurhal>Deneme</uccustom:KontrolTurhal> biçiminde yazdığımızda hazırlamış olduğumuz kontrolü ortadan kaldırarak sadece yazmış olduğumuz deneme yazısı formumuzda gözükecektir. Kontrolümüzde yazdığımız kodları yokmuş gibi varsayacaktır. Ana amacımız bu durumu ortadan kaldırmak olmalıdır. Fakat daha önce bu durumun nasıl gerçekleştiğine dair ekran görüntüsüne göz atalım.



Kodumuzu bu şekilde düzenlediğimizde karşımıza çıkan ekran görüntüsüne göz atalım.



Ekran görüntüsüne dikkat ederseniz biraz önce bahsettiğimiz sorun gerçekleşmiş olacaktır. Bu durumun ortadan kaldırılması için yapacağımız işlemleri incelemeye çalışalım.

Kontrol.Turhal.xaml.cs kod bölümüne tekrar dönelim. Yaptığımız işlem Markup ‘ların dışarında olduğu için Markup isim alanını çağırmamız gerekecektir.



System.Windows.Markup isim alanını sınıfımıza ekledikten sonra bu isim alanına ait olan Attribute (öz nitelik) lerinden ContentPropery ‘i kullanarak Markup kodlamada taglar dışına yazılanları IcerikTxt gibi algılanmasını sağlayacağız. Bu işlemi yaparken ContentProperty özniteliğinin özelliğine IcerikTxt ‘yi atamamız gerekecektir. Ekleyecek olduğunuz öz niteliği kullanıcı kontrolüne ait olan sınıfın hemen üstüne yazmamız gerekmektedir. Yoksa hata verecek ve yaptığımız özelliği varsayılan olarak kullanamadığını bize bildirecektir.



Bu değişiklik sonrasından uygulamamızı tekrardan derlediğimizde içerik özelliği ile karşılaştığımız sorunu halletmiş olacağız.



Şimdi de uygulamamızda başka bir noktaya göz atalım. Hazırlamış olduğumuz kontrollerde varsayılan olarak gelen ve kullanıcı kontrolüne içerik eklememize olanak tanıyan Content özelliği bulunmaktadır. Bu özelliği kullanmak istediğimiz aynı biraz önce karşılaştığımız gibi bir sorun ile karşı karşıya kalırız. Yine boş bir ekranda yalnızda Content özelliğine yazılmış olan yazı bizleri karşılamaktadır.

Bu durumdan kurtulabilmemiz için yapmamız gereken işlem ise, kullanıcı kontrolümüzü tanımladığımız sınıfa tekrardan giderek aşırı yüklenmeye korumalı bir sınıf oluşturmamız gerekmektir.

Oluşturacak olduğumuz sınıf içerik değişikliklerini koruyacağı için onContentChanged üyesini seçerek işlemlerimizi yapabiliriz.



KontrolTurhal.xaml.cs ‘a eklemiş olduğumuz korumalı sınıfa ait kod bloğu aşağıdaki gibidir.

protected override void OnContentChanged(object oldContent, object newContent)
{
if (oldContent!=null)
{
throw new NotSupportedException("Kullanmis oldugunuz kontrole iki adet içerik giremezsiniz.");
}
}

Değişikliklerimizi yapıp Content özelliğine değer girdikten sonra uygulamamızı derlediğimizde biraz önce belirttiğimiz mesaj kullanıcılara hata olarak sunulmaktadır.



Bu hata mesajını verdirterek kullanıcıya aynı görevi yapan iki özelliği kullanmasını da engellemiş oluyoruz. Daha sonra Content özelliğine yazdığımız değerleri kaldırdıktan sonra uygulamamızı derlediğimizde kontrolümüzün sorunsuzca çalıştığını göreceğiz.

Sonuç olarak bu yazımızda nelere değindiğimizi kısaca toparlamak gerekirse, ilk olarak WPF uygulamalarına bir UserControl eklemek istediğimizde bunu nasıl yapacağımıza değindik. Daha sonra Uygulamamıza eklemiş olduğumuz UserControl ‘ün XAML ve C# içeriğini nasıl oluşturabileceğimize inceledikten sonra ana uygulamamızda kontrolümüzü nasıl kullanabileceğimize değindik. Son olarak ise diğer kontroller ile kendi kontrolümüzü karşılaştırarak ne tür eksikleri olduğuna göz attıktan sonra bu eksikleri nasıl düzeltebileceğimize değindik.

Umarım yararlı olmuştur.

Yazımızda değinmiş olduğumuz uygulamanın kaynak kodlarına linkten erişebilirsiniz.

turhal.temizer@csharpnedir.com

Pazar, Nisan 20, 2008

WPF – Uygulamalara Video Kontrolleri Eklemek

2005 yılında Windows Presentation Foundation ile ilgili söylentiler ortaya atıldığında, Adobe Flash ile yapabildiğimiz bütün işlemleri ve daha fazlasını masaüstü ve web uygulamalarında yapabileceğimizden söz edilmişti. Daha sonra .Net Framework 3.0 ‘ın ilk sürümleri olarak .Net FX bizlere sunulduğundan bu söylentilerin gerçekleşebileceği düşünceleri zihnimizde canlanmaya başlamış ve özellikle masaüstü uygulamalarda devrim niteliği taşıyabileceğini düşünmeye başlamıştık. Belirli zaman geçtikten sonra WPF ‘i yalnızca masaüstü uygulamalar için kullanılacağına ve web uygulamalarının isminin de Microsoft Silverlight olacağını gözlemlemiş olduk. WPF ile de web uygulamaları yayınlamak hala mümkün olmakta ve bu tür uygulamalara da XBAP uygulamalar denilmiştir. Web tarafında Silverlight ‘ın estirdiği fırtınayı masaüstü uygulamalarında da WPF gerçekleştirmeye başlamıştı.

WPF ile gelen ve dünya da en çok kullanılan ürünler ile Windows Vista, Office System 2007 ve Windows Live Messenger 8.0 ve sonrası olmuştur. Karşımıza gelen bu ürünlerin ortak özellikleri tasarımlarının bir önceki sürümlerine oranla inanılmaz değişikler gösterebilmiş olmasıdır. Özelliklere kısaca örnek vermek gerekirse, Windows Vista ile izleyeceğimiz bir videoyu herhangi bir oynatıcı açmadan izleyebiliyor olmamızdır. Bu ve bunun gibi birçok işlemin ana özelliği uygulamalarımızda yer alan kontrolleri dinamik bir biçimde kullanabiliyor olmamızdır.



Windows Vista ile nasıl video kontrollerini kullanıldığını yukarıdaki ekran görüntüsünden bakabiliriz. Son kullanıcılar bu tür kontrolleri kullandıkça bizlerden geliştirmemizi istedikleri uygulamalarda bu tür kullanım kolaylıklarının olmasını istemektedirler. Bizlerde bu tür istekleri uygulamamızın performansını da düşünerek gerçekleştirmeye çalışırız.

Windows kontrollerinin daha iyileştirilmiş ve yeni nesil sistemler ile uyumlu olabilmesi açısından WPF ile geliştirmek bizler için her daim ayrıcalıklı bir durum olacaktır. Ayrıcalıklı durumdan kastımız, uygulamalarımızda ne kadar en son teknoloji kullanırsak son kullanıcılar tarafında o kadar coşku uyandırırız. Müşteri memnuniyetine dayalı bir dünyada yaşadığımız içinde bu bize çok daha fazlası ile katma değer olarak geri dönecektir.

Kısaca neden yeni kontrolleri kullanmamız gerektiğini ve bu kontrollerden video kontrolünün Windows Vista işletim sistemi ile nasıl gözüktüğüne göz attıktan sonra bu makalemizde değinecek olduğumuz WPF uygulamalarına Media kontrollerinin eklenmesi konusunu incelemeye başlayabiliriz.

Win32 uygulamalarımızı dijital Media kontrollerinin eklemenin iki yolu vardır. Bunlardan birincisi animasyon işlemlerini daha canlı göstermek ve video kontrollerini uygulamalarımızda kullanmak için başvurduğumuz DirectShow Api leridir. Bir diğeri ise Windows Media Player ActiveX kontrolüdür. Bu iki kontrolü de uygulamamıza gömülü bir biçimde uygulamalarımızda kullanabiliyoruz.

“Peki, bu iki kontrol varken neden WPF ‘te kullanılmakta olan kontrollerin bizlere sunulduğu” sorusunun cevabını araştırmaya çalışalım. DirectShow ile geliştiricilere Media uygulamaları için inanılmaz fazlalıkla imkânlar sağlanmaktadır. Tabii bu imkânları kullanabilmemiz için bu api hakkında geniş bir bilgi yelpazesine sahip olmamız gerekiyordu. Uygulamalarımızda yalnızca tek bir video göstermek içinde geliştiricilere bu api hakkında geniş bilgi düzeyine sahip olmalarını istemek geliştiriciler için oldukça sıkıcı bir durum oluyordu.

WPF ‘de ise DirectShow api lerinde yer alan kontrollerinin benzerlerini .Net Framework 3.0 ile birlikte gelen özellikler ile rahatlıkla gerçekleştirebilmemiz mümkündür. WPF ile gelen kontrolleri de Win32 uygulamalarında sorunsuzca kullanabiliriz.

Media oynatmak içinde Windows Media Player ActiveX kontrolüne ait özelliklere hâkim olmamız gerekmektedir. Yine geliştiricilere ekstra bir şeyler öğrenmeye zorlamak yerine WPF ile .Net Framework yapısına eklenen MediaElement kontrolü yardımı ile bu işlemleri de sorunsuzca gerçekleştirebilmemiz mümkündür. Kullandığımız bu kontrol yardımı ile videolarımızı 3D yüzeylerdeymiş gibi de kullanabilmemiz mümkündür.

Ses ve Media kontrollerini geliştiriciler kullanmak istediğinde WPF ile sunulan Media özellikleri olduğundan bahsetmiştik. Bu Media özelliklerini kullanmak istediğimizde arka planda Media Player işlemini başlatarak işlemlerimizi gerçekleştirebilmemize olanak sağlanmaktadır. WPF uygulaması açıldıktan sonra Media uygulaması olan sayfada yer alan Media dosyası yüklendikten sonra Media Player ‘ın açabileceği bir format olup olmadığını kontrol ediyor. Eğer bu formatlar dışında bir dosya açmak istiyorsak uygulama bizden codec yüklememizi istemektedir.

Media uygulamaları olan uygulamalarımızdaki dosyalar gösterilirken arka planda dosyalarımızın yüklenmesine devam edilmektedir. Bu yüklenme işlemi biz video ‘yu duraklatsak bile yüklemeye devam edecektir. Video ‘nın yüklenmesini engellemek için yapmamız gereken işlem tamamen durdurmak olacaktır. Ayrıca, ses dosyalarını çaldırabilmemiz için System.Media.SoundPlayer sınıfını da kullanabilmemiz mümkündür.

MediaElement Kontrolünün Kullanılması

Windows Presentation Foundation ile Media dosyalarını göstermenin oldukça kolay olduğundan ve bu tür işlemleri yapabilmek içinde MediaElement kontrolünün gerekli olduğundan üst paragraflarda bahsetmiştik. Bu kontrolü XAML kod tarafında ekleyebileceğimiz gibi C# veya VB.Net kod tarafında MediaElement kontrolünü aktifleştirerek kullanabilmemiz mümkündür. MediaElement kontrolünü uygulamalarımızda kullanırken ya bağımsız olarak kontrollerimizden aldığımı değeler yönetiriz ya da sistem saatinden alarak işlemlerimizi yapmamıza olanak tanıyacaktır.

Bağımsız durumda Media elementi nasıl kullanacağımıza göz atalım;

XAML
<MediaElement Source="Forza.wmv" Width="320" Height="240" LoadedBehavior="Play" />

XAML kod bloğunu uygulamamıza yazıp derlediğimiz zaman uygulamamızın içerisinde videomuzun görüntülendiğine tanık olacağız.

Not: Eğer videonuzun yolunu doğru bir şekilde belirttiğiniz halde gözükmediyse muhakkak projenizin oluştuğu klasörün altında yer alan Debug dizininin altında izlettireceğiniz videonun yer almasına dikkat ediniz.

MediaElement kontrolünün performans açısından çok daha fazla olanaklarının olduğundan ve diğer Api lere oranla işlemciyi daha az yoracağından bahsetmiştik. Şimdi bu söylemlerimizi doğrular nitelikteki ekran görüntülerini veriyoruz. Bu ekran görüntüsünde MediaElement yardımı ile oluşturduğumuz videonun yanında görev yöneticisi yer almaktadır.



MediaElement kontrolümüzü kullanarak çok basit anlamda bir uygulama geliştirdik ve bu uygulamamızı görüntüledik. Şimdi yapacağımız örnekte ise başlat, duraklat, bitir sessiz butonlarının olduğu bir örnek olacaktır. Bu örneğimizde kontrolleri XAML kod tarafında hazırlarken kontrollere verilecek olan görevleri C# kod tarafında oluşturuyor olacağız. Ayrıca kontrollerimizin kullanıcılar tarafından kullanıldığından videoyu kontrol edebilmesi için LoadBehavior özelliğine Manual ‘i atayacağız.

XAML
<Window x:Class="WpfMedia.Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Title="MediaElement Makale" Height="800" Width="600">
   <Grid>
      <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
         <MediaElement Name="MediaMakale" Source="Forza.wmv"
            LoadedBehavior="Manual" Width="320" Height="240" />
         <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
            <Button Content="Oynat" Margin="0,0,10,0"
               Padding="5" Click="mediaOynat" />
            <Button Content="Duraklat" Margin="0,0,10,0"
               Padding="5" Click="mediaDuraklat" />
            <Button x:Name="sessizButton" Content="Sessiz"
               Padding="5" Click="Sessiz" />
         </StackPanel>
      </StackPanel>
   </Grid>
</Window>

C#
susing System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WpfMedia
{
   public partial class Window1 : System.Windows.Window
   {
      public Window1()
      {
         InitializeComponent();
         mediaMakale.Volume = 100;
         mediaMakale.Play();
      }

      void mediaOynat(Object sender, EventArgs e)
      {
         mediaMakale.Play();
      }

      void mediaDuraklat(Object sender, EventArgs e)
      {
         mediaMakale.Pause();
      }

      void mediaMute(Object sender, EventArgs e)
      {
         if (mediaMakale.Volume == 100)
         {
            mediaMakale.Volume = 0;
            sessizButton.Content = "Sesli";
         }
         else
         {
            mediaMakale.Volume = 100;
            sessizButton.Content = "Sessiz";
         }
      }
   }
}



MediaElement, zaman durumuna bağlı olarak Windows Presentation Foundation ‘ta yer alan animasyon mimarisine bağlı olarak ta kullanılabiliyor. Zaman durumunu aktifleştirdiğimizde MediaElement ‘in özelliklerinden olan MediaTimeline ve MediaClock özelliklerine başlangıç ve ilerleme değerleri aktararak kullanabiliyoruz. Uygulamalarımızda başlangıç zamanı ve hangi zaman aralıkları ile ilerleyeceği ile ilgili özellikler Windows Presentation Foundation ‘da animasyon işlemlerini yaparken kullandığımız StoryBoard üyesine benzemektedir. Bu üyeyi de kullanırken belirli bir başlangıç zamanı, ilerleme zamanı ve sonlanma zamanı belirtebiliyorduk. Şimdi bu tür zamana bağlı kontrolleri kullanmak istediğimizde uygulamamızda ne tür bir kod bloğu kullanabileceğimize değinmeye çalışalım.

XAML
<MediaElement Name="mediaMakale" Width="320" Height="240" />
   <Grid.Triggers>
      <EventTrigger RoutedEvent="Grid.Loaded">
         <EventTrigger.Actions>
            <BeginStoryboard>
               <Storyboard Storyboard.TargetName="mediaMakale">
                  <MediaTimeline Source="Forza.wmv"
                     BeginTime="00:00:00" Duration="00:05:00" />
               </Storyboard>
            </BeginStoryboard>
         </EventTrigger.Actions>
      </EventTrigger>
   </Grid.Triggers>

Uygulamalarımızda MediaTimeline özelliğini kullanmak yerine MediaElement kontrolünü kullanmak ileride gerçekleşebilecek sorunları ortadan kaldırmak açısından çok daha yararlı olacaktır. Çünkü MediaTimeline ile uygulamalarımızı çalıştırmak istediğimizde arkada MediaElement kontrolü oluşturulmak istenecek ve istek sonrasından belirli zaman aralıklarında önbelleğe alacaktır. Sürekli çağırılan video dosyaları uygulamalarımızı web tabanlı yaptığımız durumlarda performans kaybına uğrayabilmekte ya da Windows tabanlı olarak geliştirdiğimiz uygulamalarda çok büyük dosyalı uygulamaları göstermek istediğimizde hatalar verebilecektir. Fakat aklımıza başka bir soru takılabilir. “O da çok büyük boyutlu bir videoyu birden önbelleğe aldırarak oynat dediğimizde performans kaybı yaşamayacak mıyız?” olacaktır. İşte bu sorunu engellememiz için MediaElement kontrolü içerisinde video dosyalarımızı oynatıyoruz. MediaElement kontrolünün Media dosyalarını çalıştırma mantığı minimum sistem zorlaması ile maksimum performans alabilmektedir. Diğer durumlarda biz yönetmeye çalışırsak, WPF öncesi durumlarda olduğu gibi oldukça zprlanabilir ve işlemlerimizi yaparken büyük sorunlar yaşabiliriz.

MediaPlayer Sınıfının Kullanılması

MediaElement kontrolünün özelliklerinde çok fonksiyonlu özellikler yani, yeniden oynatma, çalma listesi gibi özellikler yer almamaktadır. MediaElement üzerinde yer alan kontrollerimize daha çok fonksiyonellik kazandırmak istediğimizde MediaPlayer sınıfını kullanabiliriz. MediaElement ile video ve benzeri Media dosyaları oynatmak istediğimizde arka planda Media Player işleminin başlatıldığından ve bu işlemler üzerinden videomuzu oynattığından bahsetmiştik. İşte bu sebepten ötürü uygulamalarımızda MediaPlayer sınıfını kullanmak performans kaybı yerine son kullanıcıya sunacağımız birçok özelliği kolaylıkla sunabilme olanağı tanımaktadır.

MediaPlayer sınıfını kullanmamız için uygulamamızda System.Windows.Media isim alanının kullanılıyor olmasına dikkat etmemiz gerekmektedir. Şimdi ise C# ile Media Player sınıfını nasıl kullanabileceğimize ilişkin bir örnek vereceğiz.

C#
MediaPlayer mp = new MediaPlayer();
   Try {
      mp.Open(new Uri("mediaMakale.wmv"));
      }
     catch(Exception ex) {
    MessageBox.Show(ex.Message);
}

Media Player sınıfı ile kullanabildiğimiz özellikler ve üyeler MediaElement kontrolünün içerisinde kullanılabilmektedir. MediaElement ve Media Player uyumu ile gerçekleştirdiğimiz uygulamalarda yalnızca HD videoların gösterilmesinde sorunlar çıkmaktadır. Bu sorunlarda sistem özelliklerimizden olduğu düşünülmektedir. Çünkü ekran kartı iyi bir sistem ile uygulamamızı çalıştırdığımızda herhangi bir sorun ile karşılaşmazken, daha düşük özellikleri sistemlerde denediğimizde hatalar verebilmektedir. Media Player sınıfı videolarımızı çalıştırırken VideoDrawing sınıfı yardımı ile bu işlemleri yapmaktadır. 3D yüzeylerde de video izlemek istediğimizde Media Player sınıfı yine VideoDrawing sınıfı yardımı ile kolaylıkla video dosyalarını gösterebilmektedir.

Media Player sınıfında MediaElement kontrolünde olduğu gibi direk yolu gösterebilmek yerine uri özelliği ile yolunu uygulamamızın içerisindeki yolunu belirtiyoruz.

WPF Kontrollerinde Gömülü Videoların Kullanımı

MediaElement kontrolü System.Windows.UIElement sınıfından miraslanarak oluşturulmaktadır. Miraslamadan ötürü bir kontrolü başka bir kontrolün içerisinde de kullanabilmemize olanak tanınmıştır. Bizde bu özelliği test edebilmek için Button kontrolünün içerisinden MediaElement kontrolünü çalıştırmayı deneyeceğiz. Bunun için XAML kod tarafına aşağıdaki kodları ekliyoruz.

XAML
<Button Name="videoButton" Click="videoButton_Click"
   Width="320" Height="240">
   <MediaElement Name="forzaVid" Source="Forza.wmv"
       LoadedBehavior="Play" Width="320" Height="240" />
</Button>



Bu uygulamamızı derlediğimiz anda video oynamaya başlamaktadır. Bunun sebebi LoadedBehavior özelliğine Play değerini atmamızdan kaynaklanmaktadır. Eğer ki biz uygulama başlar başlamaz değil de Butona tıklandığı zaman videoyu başlatmak istersek Button_onClick özelliğine MediaElement ‘e vermiş olduğumuz isim ile forzaVid.Play(); kodunu eklememiz yeterli olacaktır. Bu değişiklik sonrasında uygulamamız butona tıklandığı anda, buton içerisinde video gösteren bir hal almış olacaktır. Bu tür ince detaylar son kullanıcılara sunulacak olan uygulama kullanım zevkini maksimuma çıkaracağı kaçınılmaz bir gerçektir.

Islak Zemin Yansıması Teknikleri

Uygulamalarımızda suda ya da camda karşılaştığımız yansıma işlemlerini yapmaya çalışırken fazlaca zaman kaybına uğrardık. WPF ile bu işlemleri yapmak istediğimizde ise VisualBrush üyesine MediaElement ‘i bağlamamız yeterli olacaktır. Daha sonrasında ise, VisualBrush içerisinden yapacağımız ince detaylar ile yansıma işlemini gerçekleştirebiliriz.

Yansıma işlemlerini nasıl yaptığımız konusunda kafanızda herhangi bir soru işareti oluşursa daha önceki WPF makalelerimizi okuyabilirsiniz.

Şimdi ise ıslak zemin yansıma efektine benzeyen uygulamamızı yapmamıza yarayacak olan kodlarımızı verelim.

XAML
<Window x:Class="WpfMedia.Window3"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Title="WPF Makale" Height="340" Width="350">
      <Grid x:Name="Grid">
         <StackPanel VerticalAlignment="Center">
            <MediaElement Name="Vid" Source="Forza.wmv"
               LoadedBehavior="Play" Width="320" Height="240" />
            <Rectangle Width="320" Height="240">
               <Rectangle.Fill>
                  <VisualBrush Visual="{Binding ElementName=Vid}" />
               </Rectangle.Fill>
               <Rectangle.OpacityMask>
                  <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                     <GradientStop Color="#AA000000" Offset="1" />
                     <GradientStop Color="#00000000" Offset="0" />
                  </LinearGradientBrush>
               </Rectangle.OpacityMask>
            <Rectangle.RenderTransform>
         <TransformGroup>
         <ScaleTransform ScaleY="-1" />
         <TranslateTransform Y="242" />
      </TransformGroup>
   </Rectangle.RenderTransform>
</Rectangle>
</StackPanel>
</Grid>
</Window>



Bu uygulamamızı da basitçe yapmış oluyoruz.

Uyumlu Ses Dosyalarının WPF Uygulamalarına Eklenmesi

WPF uygulamalarımıza MediaElement kontrolü yardımı ile birçok video ekledik ve eklediğimiz bu videoları form kontrollerinin içerisine bile ekleyebildik. Fakat dijital dünya sadece görüntüden ibaret değildir. Birde bu dünyada sesler yer almaktadır. Şimdi de ses dosyalarını nasıl WPF uygulamalarımıza ekleyebileceğimize değineceğiz.

Ses dosyalarımızı uygulamalarımızda kullanabilmemiz için System.Windows.Media isim alanı altında tanımlı olan sound Player sınıfını kullanacağız. Bu sınıfta Media Player ile çalabildiğimiz ses dosyalarımızı WPF uygulamalarımız da çalabilmemiz mümkündür. Ayrıca Media Player için varsayılan ses formatı olan WAV ‘ı da sorunsuzca çalıştırabilmektedir.

SoundPlayer sınıfını kullanırken bu sınıfın metotlarından olan SoundPlayer.Play(); metodu yardımı ile de ses dosyalarını yürütebilmemiz mümkündür. Tabii yürütebilme özelliği ile birlikte duraklatma ve sonlandırma metotları da yer almaktadır.

Şimdi uygulamalarımızda SoundPlayer özelliğini kullanabileceğimiz örnek için gerekli olan kod parçacığına göz atalım.

XAML
<EventTrigger RoutedEvent="Button.MouseEnter" SourceName="Button">
   <EventTrigger.Actions>
      <SoundPlayerAction Source="ses/lake.wav"/>
   </EventTrigger.Actions>
</EventTrigger>

Uygulamamızı derlediğimizde ses dosyamız sorunsuz bir biçimde çalacaktır.

Bu yazımızda nelere değindiğimizi toparlamak gerekirse, ilk olarak WPF ile geliştirilmiş ve günümüzde en çok kullanılan uygulamalara değindik ve bu uygulamalardan Windows Vista ‘da MediaElement kontrolünü nerede kullanıldığına göz attık. Sonrasında ise MediaElement kontrolü kullanılarak yapılmış farklı uygulamaları incelemeye çalıştık.

Sonuç olarak en temel anlamda MediaElement kontrolünü kullanarak video dosyalarını nasıl kullanabileceğimize incelemeye çalıştık.

Umarım yararlı olmuştur.

Yazımızda değinmiş olduğumuz uygulamanın kaynak kodlarına linkten erişebilirsiniz.

turhal.temizer@csharpnedir.com

Pazartesi, Mart 17, 2008

Bilsayayarımda kurulu olan Yazılımlar

Bu aralar bilgisayarınızı kullnırken hangi programları yüklüyorsunuz diye sorular almaya başladım. O yüzden buradan bilgisayarımda kurulu olan yazılımların listesi veriyorum. Ayrıca bilgisayara kurulmadan çalışan Java editörü Eclipse ve bu editörü kullanırken server olarak kullandığım apache-tomcat listede gözükmemektedir.

  • 2007 Microsoft Office Suite Service Pack 1 (SP1)
  • ADO.NET Entity Framework 1.0 (Pre-Release Version)
  • Adobe AIR
  • Adobe Anchor Service CS3
  • Adobe Asset Services CS3
  • Adobe Bridge CS3
  • Adobe Bridge Start Meeting
  • Adobe Camera Raw 4.0
  • Adobe CMaps
  • Adobe Default Language CS3
  • Adobe Device Central CS3
  • Adobe Dreamweaver CS3
  • Adobe ExtendScript Toolkit 2
  • Adobe Extension Manager CS3
  • Adobe Flash Player ActiveX
  • Adobe Flash Player Plugin
  • Adobe Help Viewer CS3
  • Adobe PDF Library Files
  • Adobe Setup
  • Adobe Type Support
  • Adobe Update Manager CS3
  • Adobe Version Cue CS3 Client
  • ATK0100 ACPI UTILITY
  • avast! Antivirus
  • Bilisim Sözlügü 1.0 b140
  • BisonCam, USB2.0
  • CCleaner (remove only)
  • Crystal Reports Basic for Visual Studio 2008
  • Dassault Systemes Software Prerequisites x86
  • FlashGet 1.9.6.1073
  • Foxit Reader
  • GDR 3054 for SQL Server Database Services 2005 ENU (KB934458)
  • GDR 3054 for SQL Server Reporting Services 2005 ENU (KB934458)
  • GDR 3054 for SQL Server Tools and Workstation Components 2005 ENU (KB934458)
  • Highlight Viewer (Windows Live Toolbar)
  • Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB946344)
  • Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB946581)
  • Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB947173)
  • iTunes
  • K-Lite Mega Codec Pack 1.25
  • Map Button (Windows Live Toolbar)
  • MATLAB Family of Products Release 14
  • Microsoft .NET Compact Framework 2.0 SP2
  • Microsoft .NET Compact Framework 3.5
  • Microsoft .NET Framework 3.5
  • Microsoft ASP.NET 3.5 Extensions CTP
  • Microsoft ASP.NET Futures (July 2007)
  • Microsoft ASP.NET MVC Preview 2
  • Microsoft Device Emulator version 3.0 - ENU
  • Microsoft Document Explorer 2008
  • Microsoft Document Explorer 2008 (6001.18000.367)
  • Microsoft Expression Blend 2 December Preview
  • Microsoft Expression Blend 2.5 March 2008 Preview
  • Microsoft Expression Design SP1
  • Microsoft Expression Web
  • Microsoft Expression Web MUI (English)
  • Microsoft Expression Web Service Pack 1 (SP1)
  • Microsoft Office 2003 Web Components
  • Microsoft Office Access MUI (English) 2007
  • Microsoft Office Access Setup Metadata MUI (English) 2007
  • Microsoft Office Enterprise 2007
  • Microsoft Office Excel MUI (English) 2007
  • Microsoft Office Groove MUI (English) 2007
  • Microsoft Office Groove Setup Metadata MUI (English) 2007
  • Microsoft Office InfoPath MUI (English) 2007
  • Microsoft Office OneNote MUI (English) 2007
  • Microsoft Office Outlook MUI (English) 2007
  • Microsoft Office PowerPoint MUI (English) 2007
  • Microsoft Office Professional Edition 2003
  • Microsoft Office Proof (English) 2007
  • Microsoft Office Proof (French) 2007
  • Microsoft Office Proof (Spanish) 2007
  • Microsoft Office Proofing (English) 2007
  • Microsoft Office Publisher MUI (English) 2007
  • Microsoft Office Shared MUI (English) 2007
  • Microsoft Office Shared Setup Metadata MUI (English) 2007
  • Microsoft Office Visio 2007 Service Pack 1 (SP1)
  • Microsoft Office Visio MUI (English) 2007
  • Microsoft Office Visio Professional 2007
  • Microsoft Office Visual Web Developer 2007
  • Microsoft Office Visual Web Developer MUI (English) 2007
  • Microsoft Office Word MUI (English) 2007
  • Microsoft Silverlight
  • Microsoft Silverlight 2.0 SDK Beta1
  • Microsoft Silverlight Tools Beta 1 for Visual Studio 2008
  • Microsoft SQL Server 2005
  • Microsoft SQL Server 2005 Backward compatibility
  • Microsoft SQL Server 2005 Compact Edition [ENU]
  • Microsoft SQL Server 2005 Reporting Services
  • Microsoft SQL Server 2005 Tools
  • Microsoft SQL Server 2008
  • Microsoft SQL Server 2008 Tools
  • Microsoft SQL Server Compact 3.5 Design Tools ENU
  • Microsoft SQL Server Compact 3.5 ENU
  • Microsoft SQL Server Compact 3.5 for Devices ENU
  • Microsoft SQL Server Database Publishing Wizard 1.2
  • Microsoft SQL Server Native Client
  • Microsoft SQL Server Setup Support Files (English)
  • Microsoft SQL Server VSS Writer
  • Microsoft VC Redist 2008 (6001.18000.367)
  • Microsoft Visual C++ 2008 Redistributable - x86 9.0.21022
  • Microsoft Visual C++ Compilers 2008 Standard Edition - enu - x86
  • Microsoft Visual Studio 2005 Tools for Office Runtime
  • Microsoft Visual Studio 2005 Web Deployment Projects
  • Microsoft Visual Studio 2008 Performance Collection Tools - ENU
  • Microsoft Visual Studio Team System 2008 Team Suite - ENU
  • Microsoft Visual Studio Web Authoring Component
  • Microsoft Windows SDK .NET Framework Tools
  • Microsoft Windows SDK for Visual Studio 2008 .NET Framework Tools
  • Microsoft Windows SDK for Visual Studio 2008 SDK Reference Assemblies and IntelliSense
  • Microsoft Windows SDK for Visual Studio 2008 Tools
  • Microsoft Windows SDK for Windows Server 2008 (6001.18000.367)
  • Microsoft Windows SDK for Windows Server 2008 .NET Documentation (6001.18000.367)
  • Microsoft Windows SDK for Windows Server 2008 Common Utilities (6001.18000.367)
  • Microsoft Windows SDK for Windows Server 2008 Headers and Libraries (6001.18000.367)
  • Microsoft Windows SDK for Windows Server 2008 Samples (6001.18000.367)
  • Microsoft Windows SDK for Windows Server 2008 Utilities for Win32 Development (6001.18000.367)
  • Microsoft Windows SDK for Windows Server 2008 Win32 Documentation (6001.18000.367)
  • Microsoft Windows SDK Intellisense and Reference Assemblies (6001.18000.367)
  • Microsoft Windows SDK MDAC Headers and Libraries (6001.18000.367)
  • Microsoft Windows SDK Net Fx Interop Headers And Libraries (6001.18000.367)
  • Mozilla Firefox (2.0.0.12)
  • MSDN Library for Visual Studio 2008 - ENU
  • New York Times - Times Reader
  • Paint.NET v3.22
  • Picasa 2
  • QuickTime
  • Realtek AC'97 Audio
  • Security Update for Excel 2007 (KB946974)
  • Security Update for Office 2007 (KB947801)
  • Security Update for Outlook 2007 (KB946983)
  • Smart Menus (Windows Live Toolbar)
  • Update for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB949325)
  • Update for Outlook 2007 Junk Email Filter (kb947945)
  • VC Runtimes MSI
  • Virtual Earth 3D (Beta)
  • Visual Studio 2005 Tools for Office Second Edition Runtime
  • Visual Studio Tools for the Office system 3.0 Runtime
  • Winamp
  • Windows Live Favorites for Windows Live Toolbar
  • Windows Live installer
  • Windows Live Messenger
  • Windows Live Sign-in Assistant
  • Windows Live Toolbar Extension (Windows Live Toolbar)
  • Windows Live Tools for Microsoft Visual Studio CTP
  • Windows Live Writer
  • Windows Mobile 5.0 SDK R2 for Pocket PC
  • Windows Mobile 5.0 SDK R2 for Smartphone
  • Windows Mobile 6.0 SDK Standart for Pocket PC
  • Windows Mobile 7.0 alpha SDK
  • Windows SDK Intellidocs
  • WinRAR archiver
  • Yurtici Kargo - 1
  • Yurtici Kargo - 2

Çok karmaşık bir liste gibi gözüksede genel yoğunluğu Visual Studio, MS Office oluşturmaktadır.