Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

13 Aralık 2007 Perşembe

GridView DataTable InstantiateIn TemplateColumn Itemplate

Dinamik TemplateColumn için bir örnek(Bu kez çeviri değil)

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.
  1. 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.
  2. Sayfamızdaki GridView verilerimi gösterdiğimiz düzenlediğimiz nesnemiz olacak.İki template şablonumuz olacak GridView içinde çalışma zamanında üretilen:
    1. Birisi, sayfa ekrana gelir gelmez verileri Label lar içinde gösteren,
    2. diğeride Edit düğmesine basılması halinde TextBox içerisinde gösteren.
Şimdi DataTable nesnemizi tüm page içerisinde erişilen bilen bir değişken olarak tanımlayalım:
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.

GridView1.AutoGenerateColumns = true;
ile de dt içindeki kolonları otomatik olarak türetmesini istiyoruz.Bunu ileride yine TemplateColumn larla değiştireceğiz.

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).

2 yorum:

Ali BUDAK dedi ki...

Hocam eline sağlık örnek çok açıklayıcı. Belki bir bilgin vardır diye soruyorum: Ben kendi gridview sınıfımı yazmak istiyorum. Bu gridview'ın verilerini görüntüleyeceği tablonun ismini bir şekilde alabildim, ancak gridview içine template field'ları kod olarak nasıl ekleyebileceğimi bulamadım. template field eklesem o field'a item template ekleyemiyorum. Herhangi bir fikrin varsa ve iletirsen çok sevinirim.

Ali BUDAK dedi ki...

alibudak513@gmail.com adresim.