Tam Sürümünü Görmek İçin : Gridview-Olmayan Kayıtı güncelleme ???
ofaruk_k
30/11/2007, 22:20
Merhaba arkadaşlar,
Ms-Sql Server 2005'de 3 tablom var. Basit olarak şu şekilde:
------
ogrenci
ogr_no...adi...soyadi
dersler
ders_id...ders_adi
notlar
not_id...ders_id...ogr_no...y1...y2...y3
------
Ben de view oluşturarak, tüm dersleri öğrenciye ilişkilendirerek, bir öğrenciye ait tüm notları gösteriyorum. Fakat bu view sadece notları girilen dersleri değil, notları girilmemiş dersleri de gösteriyor.(ki ben de bunu istiyorum)
Delphi'de ki Grid nesnesinde notlar üzerinde değişiklik yapınca bu otomatik olarak veritabanına aktarılıyordu. Ayrıca eğer daha önce hiçbir notu girilmemiş bir ders üzerinde (yani aslında notlar tablosunda bu derse ait bir kayıt yok, fakat view üzerinde görünüyor)veri girişi yapabiliyordum. (Galiba delphi arkaplanda,böyle bir kayıt olmadığı için,önce insert edip sonra edit moduna geçiyordu)
Aynı view'i Asp.Net te Gridview nesnesine yansıttım. Notları değiştirmek için de Gridview'in kendi Düzenle işlemini kullanıyorum(SELECT kısmında View; UPDATE kısmında sadece NOTLAR tablosu var).Daha önce notlar tablosunda olan bir kayıt üzerinde başarıyla düzenleme yapabiliyorum.
Fakat view'i tüm derslerle gösterdiğim için,aslında notlar tablosunda bulunmayan bir kayıt üzerinde değişiklik yapamıyorum. Düzenle diyorum, düzenle moduna geçiyor;Güncelle diyorum fakat güncellemiyor(çünkü ben oraya sadece UPDATE kodunu girdim ama güncelleyecek mevcut bir kayıt yok)
Sorum biraz acayip oldu, farkındayım. Bilmem anlatabildim mi derdimi.
Bu durum karşısında Gridview'de Olmayan bir kayıta nasıl giriş yapabiliriz?
RowEditing,RowUpdating... olayına kod mu yazmak gerekir?
Bu olaylardan birine kod yazacaksak Gridview'de düzenleme anında çıkan TextBox'lara nasıl ulaşabilirim ???
Gridview e kod yazman gerekecektir diye tahmin ediyorum.
(Diğer türlüsü çok kısa ve pratik olur, oluyorsa da öğrenmek isterim aslında)
Gridview e kod yazma durumunda, (düzenle) komutuyle edit template veya bound field için alanın tipine göre bir düzenleyici gelecektir.
Kaydet dediğinde ise istersen rowediting, vs. gibi olaylarla yakalayabilirsin, ancak benim tercihim, zamanında bana writeline ın tavsiye ettiği metot:
OnRowCommand diye bir olay var. Bu olaydan tüm gridview satır komutları geçer.
e.CommandName i bir switch (veya vb.net kullanıyorsan Select Case) içinden geçirerek, hangi komutun verildiğine göre işlem yapabilirsin.
Gelelim kontrolleri nasıl yakalayacağına;
((TextBox)e.Row.Cells[0].FindControl["textbox"]).Text ile ilk hücredeki textbox id li metin kutusunun text özelliğini alabilirsin.
ANCAK
Dikkat etmen gereken tek bir nokta vardır ki, eğer data-bound kontrollerin içinden bir kontrolü FindControl ile yakalayıp değerini alıyorsan, muhakkak
IsPostBack kontrolüyle DataBind() metodunu çağırman gerekir. Yoksa Page_Load olayına yazdığın masum DataBind() çağrısı, gider RowCommand olayından önce çalışır ve senin almak istediğin veriyi "resetler".
Umarım yeterince açıklayıcı oldu. Kolay gele.
ofaruk_k
30/11/2007, 23:24
Kafamdaki tüm soruları yanıtladınız :) Page_Load olayında DataBind() olayı yok, daha doğrusu Page_Load olayındaki tüm kodlar if (!Page.IsPostBack) koşuluyla çalışıyor. Sanırım bu konuda problem çıkartmaz. En iisi ben uygulamaya koyulayım :)
Çok çok Teşekkürler.
Kolay Gelsin...
ofaruk_k
01/12/2007, 23:57
Dediğiniz yöntemi uyguladım, manuel değerler verdim, sorunsuz çalıştı. Fakat TextBox değerlerine malesef ulaşamadım. e.Row'da için
'System.Web.UI.WebControls.GridViewUpdateEventArgs ' bir 'Row' tanımı içermiyor
hatası veriyor. Birkaç şey denedim ama bi türlü TextBox değerini elde edemedim :(
OnRowCommand
içinde
e.CommandName=="Update"
durumu için
GridViewRowEventArgs örneği ile çalışacaksın.
Böylece e.Row.Cells[x].FindControl ile ulaşabileceksin.
Kolay gele.
ofaruk_k
03/12/2007, 17:00
Malesef e.Row tanınmıyor.OnRowCommand'da
if (e.CommandName=="Update")
{
e.CommandArgument;
e.CommandName;
e.CommandSource;
e.Equals;
e.GetHashCode;
e.GetType;
e.ToString;
}
yalnızca bu seçeneklere ulaşabiliyorum :(
writeLine
03/12/2007, 17:52
Gridview değilde datalist kullanmalısın.
Ahhhhhhhhhh!
Bu hatayı nasıl yaptım, evet OnRowCommand da yok böyle bir tanım. Bunun yerine şu yapılabilir: Satır ve sütunların kesiştiği noktalar (hücrelerdeki) CommandArgument='<%# Eval("ogrenci_no")%>;<%# Eval("ders_id")%>'
olarak verilir ve kod arka planında basit bir Split ile CommandArgument ayıklanır. Ancak eğer olmayan bir ders ise id side olmayacağından 0 (Sıfır) aktarılması ve kod arka planında 0 geldiğinde yeni kayıt eklenmesi sağlanmalıdır.
Vakit kaybettirdiğim için çok üzgünüm.
ofaruk_k
03/12/2007, 18:55
Ahhhhhhhhhh!
Bu hatayı nasıl yaptım, evet OnRowCommand da yok böyle bir tanım. Bunun yerine şu yapılabilir: Satır ve sütunların kesiştiği noktalar (hücrelerdeki) CommandArgument='<%# Eval("ogrenci_no")%>;<%# Eval("ders_id")%>'
olarak verilir ve kod arka planında basit bir Split ile CommandArgument ayıklanır. Ancak eğer olmayan bir ders ise id side olmayacağından 0 (Sıfır) aktarılması ve kod arka planında 0 geldiğinde yeni kayıt eklenmesi sağlanmalıdır.
Vakit kaybettirdiğim için çok üzgünüm.
Ne demek efendim, asıl bu kadar vaktinizi ayırdığınız için çok çok teşekkür ederim.
Zaten ben try catch içinde ilk olarak yeni bir kayıt ekliyorum. Catch blogu içinde de
GridView7.DataKeys[e.RowIndex].Values["ders_id"].ToString()
ifadesiyle önceden eklenmiş kaydın id'sini alıyorum ve
update yapmaya çalışıyordum.Fakat bu kodu OnRowUpdating içine yazdım.OnRowUpdating içerisinde Insert işlemini yapıyor fakat UPDATE işlemini yapmıyor malesef.Hatta direk manuel bir update kodu yazdım ama olmadı. Sebebini anlamadım.
TextBoxlarada şu şekilde ulaşıyordum:
TableCell cell = GridView7.Rows[e.RowIndex].Cells[2];
TextBox y1 = cell.Controls[1] as TextBox;
OnRowCommand'dada e.Rowindex olmadığı için ne TextBox'lara ne de eklenmiş kaydın id'sine ulaşabildim.
Dediğiniz şekilde sanırım veritabanından gelen verileri okuyabiliyoruz. Şu an tek sorun TextBox ve Datakeys'e ulaşabilmek.
@writeLine,
Fakat dediğiniz şekilde kayıtlar alt alta sıralanıyo. Ben ise ders isimlerinin sol tarafta yukarıda aşağı sıralanmasını, ve yazılılıların (y1,y2,y3...) yukarıda soldan sağa sıralanmasını istiyorum.
Şimdi bana göre izlenmesi gereken en doğru strateji şu :
TextBox y1 = (TextBox)GridView7.Rows[e.RowIndex].Cells[2].FindControl("Yazili1");
Bir de dediğim parametreleri aktarabilmek için şöyle gizli (görünmeyecek) bir textbox daha yapalım:
<asp:TextBox ID="Gizli1" runat="server"
Text='<%# Eval("ogrenci_no") + ";" + Eval("ders_no") + ";" + Eval("yazili_no")%>' Visible="false"/>
Aynı textbox un değerini aldığımız yerde tıpkı o textbox un değerini aldığımız gibi bunu da FindControl ile bulalım, içindeki değeri alalım. Hangi derse hangi öğrenciye hangi yazılıya not girdiğimizi Split ile bölüp, 0. eleman 1. eleman 2. eleman diye bulabiliriz.
Not: Eğer hangi hücrede durduğuna göre kaçıncı yazılı olduğu belli oluyorsa onu sabit bir değer olarak elle de yazabiliriz tabii.
Kolay gelsin.
ofaruk_k
03/12/2007, 19:55
Peki bu textBox'u nerede oluşturacağız? Ayrıca Textbox'u oluşturduktan sonra [e.RowIndex]tanımı çalışacak mı? Bu arada Her not ayrı ayrı hücreler.
En güzeli durumu simüle eden miniminnacık bir örnek yazmak sanırım. Elimizde kaç eksen değer var? öğrenci_numarası, ders, ve yazili notu ve biz yazili notunu mu girmek istiyoruz?
Örnek bir çizelgeyi şu şekilde: oluşturabilir misin.
+--------------------------+
| |
+--------------------------+
İpucu : notepad de oluşturup CODE taglarının arasına yapıştırınca kolay oluyor.
ofaruk_k
03/12/2007, 22:00
notlar tablosu bu:
not_id(*)...ders_id(*)...ogr_no(*)...y1...y2...y3
1................1...............123............10 ...20...30
2................1...............555............50 ...75...85
3................2...............123............95 ...68...45
.
.
.
fakat Gridview şu şekilde:
(123 nolu öğrenciye ait notlar)
ders_adi(**)...y1...y2...y3
mat................10...20...30
fzk.................95...68...45
.
.
.
*: primary key
**: ders tablosundan çekiliyor
Update işlemi için;
Öncelikle Insert uygulayacağım:
sadece y1,y2,y3 Hücrelerindeki TextBox değerlerini ve ilgili satırın(e.rowindex) datakeys'inden ders_id'yi çekmem lazım.
(ogr_no'yu başka yerden çekiyorum.)
Eğer Insert'te hata verirse Update uygulayacağım:
not_id'yi çekip y1,y2,y3 hücrelerindeki textbox değerleriyle güncellemem lazım.
(ders_id ve ogr_no'yu güncellemeye gerek yok)
Adım adım aklımdan geçenleri yazayım o zaman:
İlk önce Notların düzenlendiği ve yeni notların girildiği gridview in RowDataBound olayını düzenlemek ile işe başlayacağız.
Tüm notların düzenlendiği ve girildiği hücrelerde bir adet not düzenleme ve girme textbox ı bir adet de hidden field bulunur.
RowDataBound da üç farklı hücredeki hidden field için;
* öğrenci numarası
* ders adı
* o dersin kaçıncı yazılısı olduğu belirtilecek.
(noktalı virgül ile ayrılabilir, virgül ile ayrılabilir veya üç farklı hidden field a bile yazılabilir)
İKİNCİ ADIM
Biz bu gridview in içinde veya hücrelerin içinde gezerken bize 4 adet bilgi gelecek. Üçü eksen bilgiler yani hangi öğrencinin hangi dersin hangi yazılısına not girdiğimiz veya düzenleyeceğimiz ile ilgili dördüncüsü de girilen nottur.
DİKKAT EDİLMESİ GEREKEN NOKTA
Bu dört adet parametreyi öyle bir metoda vereceğiz ki önce UPDATE yapmaya çalışacak eğer verilen eksen değerler ile uyumlu bir kayıt bulamazsa INSERT ile ilgili öğrenciye dair notu kaydedebileceği alanı oluşturup kayıt yapacak.
(Direkt kod yazacaktım ama böyle daha iyi olur diye düşündüm son anda)
Forum Yazılımı : vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.