Makale Özeti

Bu dökümanın konusu Asp.Net teki Web Controllerinden Table kontrolü, bu kontrol System.Web.UI.WebControls namespace sinden Table class ından türetilmiştir. Bu kontrol datagrid kadar gelişmiş bir kontrol değildir. Ancak eski ASP programcılarının çok hoşuna gideceğini tahmin ediyorum. Asp yazarken table tagındaki td lerin tek tek rs den gelip doldurulması tarzında bir kontrol. Yani hakimiyet biraz daha sizde.

Makale

Merhabalar

Bu dökümanın konusu Asp.Net teki Web Controllerinden Table kontrolü, bu kontrol System.Web.UI.WebControls namespace sinden Table class ından türetilmiştir. Bu kontrol datagrid kadar gelişmiş bir kontrol değildir. Ancak eski ASP programcılarının çok hoşuna gideceğini tahmin ediyorum. Asp yazarken table tagındaki td lerin tek tek rs den gelip doldurulması tarzında bir kontrol. Yani hakimiyet biraz daha sizde.

 

Kontrolü kısaca tanımlamak gerekirse kontrol kendi içinde TableRow lardan oluşuyor. Bu TableRowlarda kendi içinde TableCell lerden oluşuyor. Yani HTML in table tagına çok benzer yapıda. Bu yüzden kullanılması çokda zor değil.

Şekil 1

Bu makalede ilk önce Connected ortamda Table kontrolünde verilerinizi nasıl gösterebileceğinizi, daha sonra Disconnected ortamda verilerinizi nasıl gösterebileceğinizi inceleyeceğiz. Daha sonrada biraz daha gelişmiş bir örnek yaparak bu makaleyi bitireceğim. Örneklerimde genellikle Microsoft SQL Server 2000 üstünden Northwind veritabanını kullanacağım, Table olarakda Customers i seçtim.

 

Hadi connected ortamdan başlayalım.

 

Connected ortamda Table nesnesinin doldurulması :

Biraz Ado.Net bilgisine ihtiyacınız var. Ben Ado.Net ile alakalı bölümleri geçiyorum www.yazgelistir.com bünyesindeki Ado.Net dökümanlarına bakabilirsiniz.

Yeni bir Asp.Net Web Application açın. Bir tane buton ve table nesnesini Web Formunuzun üstüne yerleştirin.

Şimdi button un Click ine aşağıdaki kodları ekleyin. En başa imports System.Data.SqlClient yazmayı unutmayın.

 

Dim conn As SqlConnection = New SqlConnection("data source=.; initial catalog=northwind; uid=sa; pwd=sa;")

conn.Open()

Dim sql As String

sql = "SELECT * FROM Customers"

Dim comm As SqlCommand = New SqlCommand(sql, conn)

Dim dr As SqlDataReader = comm.ExecuteReader

Do While dr.Read()

Dim tr As TableRow = New TableRow

For i As Integer = 0 To dr.FieldCount - 1

Dim tc As TableCell = New TableCell

tc.Text = dr(i).ToString

tr.Cells.Add(tc)

Next

Table1.Rows.Add(tr)

Loop

Table1.DataBind()

dr.Close()

conn.Close()

 

şimdi neler yaptığımızı inceleyelim.

ilk önce conn nesnesi ile connection kuruyorum. Bir sql değişkeni tanımlayıp buna customers tablosundaki bütün veriler doldur diyorum. Bir adım sonra tanımladığım dr değişkeni SqlDataReader türünden işte burada yazdığım SQL cümleciği çalışığ SQL deki verilerin aynısını forward only olan DataReader içine dolduruyor. Daha sonra dr.Read() metodu ile tek tek en baştan başalayarak bütün satırları okuyorum. Burada tanımladığım tr değişkeninin içine TableCell leri tek tek ekleyeğim. Daha sonraki for bölümünde ise i değişkenim 0 dan başlayıp dr daki sütünların sayısının bir eksiğine kadar dönecek (dr.FieldCount bana sütün sayısının verir ancak sütünlar 0 dan başladığı için bana sayısının bir eksiği gereklidir.) For`un içinde tanımladığım tc değişkeni TableCell türünden tc nin text property sine görüntülenmesini istediğim değeri eşitliyorum (dr(i) o sırada hangi satırın üstündeyse onun sütün numarasını parametre alır. Ve sütünlar deminde dediğim gibi 0 dan başlayarak numaralandırılır.) dr(i) ye .ToString eklediğime dikkat edin. Böylece gelen verilerin metine dönüştürülmesini sağlıyor. Eğer bunu kullanmazsanız hatalarla karşılaşabilirsiniz (“.” Yı koyduğunuzda ToString gelmiyor olabilir elle yazarsanız problem kalmaz.). Daha sonraki en önemli bölümlerden bir tanesi for un hemen yukarısında tanımladığım TableRow a bu TableCell lerin tek tek eklenmesidir. (bknz. Şekil 1) next ten hemen sonrada bu TableCelleri eklenmiş olan TableRow un table nesnemize eklenmesi işlemi kaldı. Onuda ekliyoruz. Böylelikle dr daki SQL den gelen tablonun birebir aynısını oluşturuyoruz.

En son bölümdeki dr.close ve conn.close ise işlerimiz bitince bu nesnelerin kapatılması anlamına geliyor. Geri kalanı Garbage Collector ın işi :)

Şimdi Disconnected ortama bakalım.

 

Disconnected ortamda Table nesnesinin doldurulması :

Aslında arasındaki tek fark verinin başka yerde olması, bundan dolayı veriye ulaşma yöntemimiz değişiyor. Aynı formu kullanabilirsiniz önceki kodları comment edin ve yeni kodları yazın. (System.Data.SqlClient ı import etmeyi unutmayın)

 

Dim conn As SqlConnection = New SqlConnection("data source=.; initial catalog=northwind; uid=sa; pwd=sa;")

Dim da As SqlDataAdapter

Dim ds As DataSet = New DataSet

Dim sql As String

sql = "SELECT *  FROM Customers"

da = New SqlDataAdapter(sql, conn)

da.Fill(ds)

For i As Integer = 0 To ds.Tables(0).Rows.Count - 1

Dim tr As TableRow = New TableRow

For j As Integer = 0 To ds.Tables(0).Columns.Count - 1

Dim tc As TableCell = New TableCell

tc.Text = ds.Tables(0).Rows(i)(j).ToString

tr.Cells.Add(tc)

Next

Table1.Rows.Add(tr)

Next

 

Gördüğünüz gibi yapılan iş aslında çokda farklı değil. Tek fark şimdi iki tane for next döngümüz var. İlki satırlar arasında gezmemiz için, ikincisi ise sütünların arasında gezmemiz için. Mantık yine aynı ilk önce TableRow u oluşturup içine TableCell leri ekliyoruz daha sonra bu TableRow u Table kontrolümüze ekliyoruz.

 

Şimdi ise biraz daha gelişmiş bir örnek yapalım. Bazı kontroller ekleyelip buna göre işlemler yapalım.

Koddaki SQL cümleciğini aşağıdaki ile değiştirin.

sql = "SELECT EmployeeId, FirstName, LastName FROM Employees"

ve ikinci Next ten sonra Table1.Rows.Add bölümünden önce aşağıdaki kodları yerleştirin.

 

Dim tc1 As TableCell = New TableCell

Dim tc2 As TableCell = New TableCell

Dim tb As TextBox = New TextBox

Dim lb As Label = New Label

tb.Text = ds.Tables(0).Rows(i)(1) & " " & ds.Tables(0).Rows(i)(2)

lb.Text = ds.Tables(0).Rows(i)(0) & ". icin"

tc1.Controls.Add(tb)

tc2.Controls.Add(lb)

tr.Cells.Add(tc1)

tr.Cells.Add(tc2)

 

Yukarıda yaptığımız şey bu Table nesnesinin son iki sütünuna WebControl eklemek. Bu kontrollerden ilki bir Textbox, ikincisi ise bir Label. İlk önce bu yeni iki TableCell imi tanımlıyorum. Daha sonra bu kontrollerimi oluşturuyorum. Bu kontrollerimin Text property sine görüntülenmesini istediğim yazıyı ekliyorum ve daha sonra bu kontrollerimi tek tek daha önce tanımladığım TableCell lere ekliyorum. Ve son olarakta bu yeni TableCelleri TableRow uma ekliyorum. Aslında bizim DataGrid imizde bu mantıktan çok farklı değil.

Son olarakda görsellikle ilgili bir şeyler yapalım. Aşağıdaki kodları for next döngülerinin içine tc nin tanımladıktan hemen sonrasına yerleştirin

tc.BorderColor = Color.LightBlue

tc.BorderWidth = Unit.Pixel(2)

Bu kodlar TableCell lerin kenarlıklarını (border) açıkmavi yapar ve kenarlıkların kalınlığını 2 pixel e ayarlar.

 

Table ın TableRow un ve TableCell in daha çok fazla propertysi var. Bunları inceleyerek bulabilirsiniz.

 

Bu makalede bu kadar. Herhangi bir sorunda bana mail yollayabilirsiniz.

 

Levent Cenk Çağlar

cenk.caglar@bilgeadam.com