Herşeyden önce GridView ın aspx ve cs sayfalarındaki durumlarını incelemenizi tavsiye ederim. Biz biraz bakalım ve esas konumuza adım adım ilerleyelim.
Öncelikle GridView sınıfından bir örneği sayfamıza sürükler
<asp:GridView ID="GridView1" runat="server" />
Tabii bu tagın arasına eklenecek çok şey var, bunlardan bir kısmı ekleyeceğim.
Örneğin: AutoGenerateColumns="false"
Ama ben GridView anlatacak değilim, size faydası dokunacak genelde gözden kaçan bir kaç şeyden bahsedeğim.
- Örneğin: DataKeyNames="ProductID"... DataKeyNames bizim için Kayıt Silme, Düzenleme işlemleri için tablomuzdaki Primary Key alanımızdır.Bu alan tablomuzda hangi satırın silineceğini veya güncelleneceğini diğer satırlarla(tablodaki kayıtlarla) karışmadan gösterecektir.
- Columns ile GridView içindeki göstermek istediğimiz tüm alanları görüntüleyeceğiz.
- TemplateField, ile kolonu eğer Edit ya da düz haliyle görüntülemek istediğimizde hangi bileşenleri kullanacaksak burada her kolon için bir TemplateField oluşturup içine ItemTemplate ve EditItemTemplate leri yerleştiriyoruz.
- ItemTemplate ile verimizi göstereceğimiz kolonumuzu hangi bileşenlerle görüntüleyeceksek bu bileşenleri içerir.
- EditItemTemplate ile verimizi editleyeceğimiz kolonumuzu hangi bileşenlerle görüntüleyeceksek bu bileşenleri içerir.
- BoundField ile de hiç template arasına almayıp label içinde görüntüleyeceğimiz alanlarımızı gösteriyoruz.
<Columns>
<asp:TemplateField HeaderText="RowIndex">
<ItemTemplate>
<asp:Label ID="lblRowIndex" runat="server" Text='<%# Bind("tel1") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="lblRowIndex" runat="server" Text='<%# Bind("tel1") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="Name" DataField="Name" />
<asp:BoundField HeaderText="ListPrice" DataField="ListPrice" />
<asp:BoundField HeaderText="SellStartDate" DataField="SellStartDate" />
</Columns>
Buraya kadar küçük bir özette yapmış olduk.Şimdi Dinamik TemplateColumn oluşturma işine bakalım.
İhtiyaçlarımız:
Bir adet DataTable (DataSource olarak kullanacağız)
Bir adet GridView
Bir adet ITemplate interface ini referans alan TemplateColumn sınıfı
Şimdi bunları neden ve nasıl biraraya getireceğiz sorularını cevaplayalım.
- DataTable sınıfından bir nesne türeteceğiz ve içine bir kaç satır veri ekleyeceğiz.Çünkü sayfamıza yerşeştirdiğimiz GridView için DataSource olacak bu tablo.
- Sayfamızdaki GridView verilerimi gösterdiğimiz düzenlediğimiz nesnemiz olacak.İki template şablonumuz olacak GridView içinde çalışma zamanında üretilen:
- Birisi, sayfa ekrana gelir gelmez verileri Label lar içinde gösteren,
- diğeride Edit düğmesine basılması halinde TextBox içerisinde gösteren.
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
DataTable dt = new DataTable();
Bir de bu DataTable içini doldurmamız gerekecek.Bunun için bir fonksiyon yazalım:
public void dtBuild()
{
DataColumn dc_1 = new DataColumn( "isim" );
DataColumn dc_2 = new DataColumn( "meslek" );
dt.Columns.Add( dc_1 );
dt.Columns.Add( dc_2 );
DataRow dr = dt.NewRow();
dr["isim"] = "Cem";
dr["meslek"] = "2";
dt.Rows.Add( dr );
DataRow dr1 = dt.NewRow();
dr1["isim"] = "Cenk";
dr1["meslek"] = "1";
dt.Rows.Add( dr1 );
DataRow dr2 = dt.NewRow();
dr2["isim"] = "Cengo";
dr2["meslek"] = "3";
dt.Rows.Add( dr2 );
}
Şimdiii, sayfamız ekrana ilk geldiğinde GridView1 nesnemizin dt ile dolması ve kolonları kendi otomatik üretsin diye, AutoGenerateColumns özelliğini TRUE yapacağız ama editlendiğinde FALSE olacak ki biz TemplateColumn özelliği ile sütunlarımızı değiştirebilelim. O halde Page_Load metodumuza bir bakalım:
protected void Page_Load( object sender, EventArgs e )
{
if ( !IsPostBack )
{
dtBuild();
GridView1.AutoGenerateColumns = true;
GridView1.DataSource = dt;
GridView1.DataBind();
}
else
{
GridView1.AutoGenerateColumns = false;
}
}
Bu da güzel oldu.Yukarıyı anlatmak gerekirse, dtBuild() fonksiyonu ile DataTable sınıfından türettiğimiz dt nesnemizin içini satırlarla dolduruyoruz.
ile de dt içindeki kolonları otomatik olarak türetmesini istiyoruz.Bunu ileride yine TemplateColumn larla değiştireceğiz.
GridView1.AutoGenerateColumns = true;
GridView1.DataSource = dt;
GridView1.DataBind();Burada GridView1 nesnemizin DataSource özelliğini dt nesnemize atıyor ve verileri göstermek için DataBind() metodunu çalıştırıyoruz.
E bu da güzel. Şimdi biz Edit lemeye(düzenlemeye geçelim).