Salı, Aralık 02, 2008

GridView'de DropDownList'ler ile Veri Güncelleme sorunu

Yaklaşık iki haftadır Aydın'da Adnan Menderes Üniversitesi Bilgi İşlem Dairesi Yazılım Geliştirme Ekibine Nesne tabanlı programlama eğitimi veriyorum, eğitimin içeriği tamamen üniversiteye özel olduğu için eğitimler süresince pek çok sorunu tartışma fırsatımız oluyor, sizlerle bu gün karşılaştığımız bir sorunu ve çözümünü paylaşmak istiyorum. GridView kontrolü ile Netron'da eğitimlerde kullanmış olduğumuz YazilimWorks isimli veritabanında yer alan Urun tablosundaki verileri görüntelemek ve güncellemek gibi bir hedefimiz vardı ancak her ürünün bağlı olduğu bir alt kategori ve bu alt kategorinin de bağlı olduğu bir kategori bulunmaktadır, özetle YazilimWorks'ün bahsedilen üç tablosunun diagramda görünümü aşağıdaki gibidir.Gerçekleştirmek istediğimiz işlem son derece basit; GridView görüntüleme modunda iken her şey labellarda görüntülenecek ancak herhangi bir satır edit moda geçtiğinde ürünün bağlı olduğu AltKategori ve diğer AltKategoriler DropDownList içerisinde görüntüleniyor olacak ancak ürünün dahil olduğu AltKategori DropDownList'te seçili olarak geliyor olacak, aynı şekilde seçili olan alt kategorinin bağlı olduğu Kategori de başka bir DropDownList'te görüntüleniyor olacak. Anlaşılacağı üzere işlem oldukça basit, ilk olarak GridView'i oluşturduk ardından TemplateField'lar ile istediğimiz işlemi yaptık ve ardından da SqlDataSource kontrolleri ile DropDownList'lere verileri getirip ikisi arasındaki gerekli entegrasyonu sağladık bundan sonra da Bind metodu ile DataBase'den gelen alanı direkt DropDownList'lerin SelectedValue özelliklerine bağladık. Sorunsuz olarak veriler geldi ve ardından sorunsuz olarak herhangi bir satır edit moda geçti ancak Kategori DropDownList'indeki değer değiştikten sonra AltKategori de yenilenmek istediği için ve seçili olan değerlerle Bind metodundan bağlanan değer uyuşmadığı için "Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control" şeklinde bir hata ile karşılaştık.
Sorunu şu şekilde çözdük; DataBase'den gelen verileri direkt Bind metodu ile DropDownList'lerin SelectedValue özelliklerine atamaktan vazgeçtik ve DropDownList'lerin yanına birer tane HiddenField attık, ardından da GridView'in RowEditing olayını ele aldığımız metotta aşağıdaki kodları yazıp DataBase'den ID'si gelen Kategori ve AltKategori'lerin DropDownList'lerde seçili olmasını sağladık.



CType(GridView1.Rows(e.NewEditIndex).Cells(5).FindControl("ddlKategoriID"), DropDownList).SelectedValue = CType(GridView1.Rows(e.NewEditIndex).Cells(5).FindControl("HfKategoriID"), HiddenField).Value

CType(GridView1.Rows(e.NewEditIndex).Cells(6).FindControl("ddlAltKategori"), DropDownList).DataBind()

CType(GridView1.Rows(e.NewEditIndex).Cells(6).FindControl("ddlAltKategori"), DropDownList).SelectedValue = CType(GridView1.Rows(e.NewEditIndex).Cells(6).FindControl("HfAltKategoriID"), HiddenField).Value


Kodlardan da anlaşılacağı üzere eğitimi VisualBasic.Net dili üzerinden anlatıyorum, kodlardan anlaşılacağı üzere ilk HiddenField'larda depolamış olduğumuz değerleri RowEditing olayında DropDownList'lere atıyoruz arada AltKategori DropDownList'imizin DataBind metodunu bir kez daha çalıştırdık çünkü kategoride varsayılan olarak en üstteki seçili olarak gelmekteydi ve buradaki değişim sonucunda ona bağlı olan AltKategoriler'de değişiyor olmalıdır, bunu sağladıktan sonra ise Kategori için yaptığımız işlemin aynısını bir de AltKategori için gerçekleştirdik ve uygulama sorunsuz olarak çalıştı...

1 yorum:

enes dedi ki...

kardeş eline sağlık makalen için..
aynısını detailsview içinde yaşıyorum , aynı kodları detailsview'a uyarladım fakat atladığım bişeyler olabilir.. detalsview için bi örnek varsa sevinirim .. tşk