Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
GridView, DetailsView veya FormView biçimini ilişkili verilere göre ayarlamak birden çok yolla gerçekleştirilebilir. Bu öğreticide DataBound ve RowDataBound olay işleyicilerinin kullanımıyla veriye bağlı biçimlendirmeyi nasıl gerçekleştirebileceğimizi inceleyeceğiz.
Giriş
GridView, DetailsView ve FormView denetimlerinin görünümü, stille ilgili birçok özellik aracılığıyla özelleştirilebilir. Özellikler arasında CssClass
, Font
, BorderWidth
, BorderStyle
, BorderColor
, Width
ve Height
gibi etmenler, işlenen kontrolün genel görünümünü dikte eder. , HeaderStyle
, RowStyle
ve diğerleri gibi AlternatingRowStyle
özellikler, aynı stil ayarlarının belirli bölümlere uygulanmasına izin verir. Benzer şekilde, bu stil ayarları alan düzeyinde uygulanabilir.
Ancak birçok senaryoda biçimlendirme gereksinimleri, görüntülenen verilerin değerine bağlıdır. Örneğin, stokta olmayan ürünlere dikkat çekmek için, ürün bilgilerini listeleyen bir rapor, ve UnitsInStock
alanları 0'a eşit olan UnitsOnOrder
ürünler için arka plan rengini sarı olarak ayarlayabilir. Daha pahalı ürünleri vurgulamak için bu ürünlerin 75,00 ABD dolarından daha pahalı olan fiyatlarını kalın yazı tipinde görüntülemek isteyebiliriz.
GridView, DetailsView veya FormView biçimini ilişkili verilere göre ayarlamak birden çok yolla gerçekleştirilebilir. Bu öğreticide, DataBound
ve RowDataBound
olay işleyicilerinin kullanımı aracılığıyla veriye bağlı biçimlendirmeyi nasıl gerçekleştirebileceğimizi inceleyeceğiz. Sonraki öğreticide alternatif bir yaklaşımı keşfedeceğiz.
DetailsView DenetimininDataBound
Olay İşleyicisini Kullanma
Veriler, bir veri kaynağı denetiminden veya programlı olarak denetimin DataSource
özelliğine veri atanıp DataBind()
yöntemi çağrıldığında, bir DetailsView bağlandığında aşağıdaki adım dizisi gerçekleşir.
- Veri Web denetiminin
DataBinding
olayı tetiklenir. - Veriler, veri Web denetimine bağlıdır.
- Veri Web denetiminin
DataBound
olayı tetiklenir.
Özel mantık, bir olay işleyicisi aracılığıyla 1. ve 3. adımlardan hemen sonra eklenebilir. Olay için DataBound
bir olay işleyicisi oluşturarak, veri Web denetimine bağlı verileri program aracılığıyla belirleyebilir ve biçimlendirmeyi gerektiği gibi ayarlayabiliriz. Bunu göstermek için bir ürünle ilgili genel bilgileri listeleyecek ancak değeri 75,00 TL'yi aşarsa UnitPrice
görüntüleyecek bir DetailsView oluşturalım.
1. Adım: Ürün Bilgilerini DetailsView'da Görüntüleme
CustomColors.aspx
sayfasını CustomFormatting
klasöründe açın, Araç Kutusu'ndan Tasarımcı'ya bir DetailsView denetimi sürükleyin, ID
özelliğini ExpensiveProductsPriceInBoldItalic
olarak ayarlayın ve ProductsBLL
sınıfının GetProducts()
yöntemini çağıran yeni bir ObjectDataSource denetimine bağlayın. Önceki öğreticilerde ayrıntılı olarak incelediğimiz için, bu işlemi gerçekleştirmeye yönelik ayrıntılı adımlar burada basitlik adına atlanmıştır.
ObjectDataSource'ı DetailsView'a bağladıktan sonra alan listesini değiştirmek için bir dakikanızı ayırın. I've opted to remove the ProductID
, SupplierID
, CategoryID
, UnitsInStock
, UnitsOnOrder
, ReorderLevel
ve Discontinued
BoundField'leri kaldırmayı seçtim ve kalan BoundField'leri yeniden adlandırdım ve yeniden biçimlendirdim.
Width
ve Height
ayarlarını da temizledim. DetailsView yalnızca tek bir kayıt görüntülediğinden, son kullanıcının tüm ürünleri görüntülemesine izin vermek için sayfalama özelliğini etkinleştirmemiz gerekir. DetailsView'un akıllı etiketindeki Sayfalandırmayı Etkinleştir onay kutusunu işaretleyerek bunu yapın.
Şekil 1: Şekil 1: DetailsView'ın Akıllı Etiketindeki Sayfalandırmayı Etkinleştir Onay Kutusunu işaretleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu değişikliklerden sonra DetailsView işaretlemesi şöyle olur:
<asp:DetailsView ID="DetailsView1" runat="server" AllowPaging="True"
AutoGenerateRows="False" DataKeyNames="ProductID"
DataSourceID="ObjectDataSource1" EnableViewState="False">
<Fields>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True" SortExpression="CategoryName" />
<asp:BoundField DataField="SupplierName" HeaderText="Supplier"
ReadOnly="True" SortExpression="SupplierName" />
<asp:BoundField DataField="QuantityPerUnit"
HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" />
<asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
HeaderText="Price"
HtmlEncode="False" SortExpression="UnitPrice" />
</Fields>
</asp:DetailsView>
Tarayıcınızda bu sayfayı test etmek için bir dakikanızı ayırın.
Şekil 2: DetailsView Denetimi Bir Kerede Bir Ürün Görüntüler (Tam boyutlu görüntüyü görüntülemek için tıklayın)
2. Adım: DataBound Olay İşleyicisindeki Verilerin Değerini Program Aracılığıyla Belirleme
Değeri 75,00 TL'yi aşan ürünlerin UnitPrice
fiyatını kalın, italik yazı tipinde görüntülemek için önce değeri programlı olarak belirleyebilmemiz UnitPrice
gerekir. DetailsView için bu işlem olay işleyicisinde DataBound
gerçekleştirilebilir. Olay işleyicisini oluşturmak için Tasarımcı'da DetailsView'a tıklayın ve özellikler penceresine gidin. Görünür değilse F4 tuşuna basın veya Görünüm menüsüne gidip Özellikler Penceresi menü seçeneğini belirleyin. Özellikler penceresinde şimşek simgesine tıklayarak DetailsView'un olaylarını listeleyin. Ardından, olaya çift tıklayın DataBound
veya oluşturmak istediğiniz olay işleyicisinin adını yazın.
Şekil 3: Bir Olay için Olay İşleyicisi DataBound
Oluşturun
Uyarı
ayrıca ASP.NET sayfasının kod bölümünden bir olay işleyicisi oluşturabilirsiniz. Burada, sayfanın en üstünde iki açılan liste bulabilirsiniz. Sol açılır listeden nesneyi seçin ve sağ açılır listeden işleyici oluşturmak istediğiniz olayı seçin. Visual Studio uygun olay işleyicisini otomatik olarak oluşturacaktır.
Bunu yaptığınızda olay işleyicisi otomatik olarak oluşturulur ve sizi eklendiği kod bölümüne götürür. Bu noktada şunu göreceksiniz:
Protected Sub ExpensiveProductsPriceInBoldItalic_DataBound _
(sender As Object, e As System.EventArgs) _
Handles ExpensiveProductsPriceInBoldItalic.DataBound
End Sub
DetailsView'a bağlı verilere özelliği aracılığıyla DataItem
erişilebilir. Kesin türde DataRow örneklerinden oluşan bir koleksiyona sahip sıkı türlenmiş bir DataTable'a denetimlerimizi bağladığımızı unutmayın. DataTable DetailsView'a bağlı olduğunda, DataTable'daki ilk DataRow DetailsView özelliğine DataItem
atanır. Özellikle, özelliğine DataItem
bir DataRowView
nesnesi atanır. Biz, gerçekte bir DataRowView
örneği olan temel DataRow nesnesine erişmek için Row
'nin ProductsRow
özelliğini kullanabiliriz. Bu ProductsRow
örneği aldıktan sonra nesnenin özellik değerlerini inceleyerek kararımızı verebiliriz.
Aşağıdaki kod, DetailsView denetimine bağlı değerin UnitPrice
75,00 TL'den büyük olup olmadığının nasıl belirleneceğini gösterir:
Protected Sub ExpensiveProductsPriceInBoldItalic_DataBound _
(sender As Object, e As System.EventArgs) _
Handles ExpensiveProductsPriceInBoldItalic.DataBound
Dim product As Northwind.ProductsRow = _
CType(CType(ExpensiveProductsPriceInBoldItalic.DataItem, _
System.Data.DataRowView).Row, Northwind.ProductsRow)
If Not product.IsUnitPriceNull() AndAlso product.UnitPrice > 75 Then
End If
End Sub
Uyarı
UnitPrice
veritabanında bir NULL
değeri olabileceğinden, NULL
'nin ProductsRow
değeriyle ilgilenip ilgilenmediğimizi kontrol ederiz, ardından UnitPrice
özelliğine erişiriz. Bu denetim önemlidir çünkü UnitPrice
değeri varken NULL
özelliğine erişmeye çalışırsak ProductsRow
nesnesi bir StrongTypingException özel durumu oluşturur.
3. Adım: DetailsView'da UnitPrice Değerini Biçimlendirme
Bu noktada DetailsView'a bağlı değerin UnitPrice
75,00 TL'yi aşan bir değere sahip olup olmadığını belirleyebiliriz, ancak DetailsView'un biçimlendirmesini buna göre program aracılığıyla nasıl ayarlayacağımızı henüz görelim. DetailsView'da bir satırın tamamının biçimlendirmesini değiştirmek için program aracılığıyla DetailsViewID.Rows(index)
kullanarak satıra erişin; belirli bir hücreyi değiştirmek için DetailsViewID.Rows(index).Cells(index)
kullanarak erişim sağlayın. Bir satıra veya hücreye bir referansımız olduktan sonra, stil ile ilgili özelliklerini ayarlayarak görünümünü değiştirebiliriz.
Bir satıra program aracılığıyla erişmek için 0'da başlayan satırın dizinini bilmeniz gerekir. tr-TR: Satır UnitPrice
, DetailsView'daki beşinci satırdır ve indeks numarası 4'tür, bu nedenle ExpensiveProductsPriceInBoldItalic.Rows(4)
kullanarak program aracılığıyla erişilebilir. Bu noktada, aşağıdaki kodu kullanarak satırın içeriğinin tamamını kalın, italik bir yazı tipinde görüntüleyebiliriz:
ExpensiveProductsPriceInBoldItalic.Rows(4).Font.Bold = True
ExpensiveProductsPriceInBoldItalic.Rows(4).Font.Italic = True
Ancak, bu hem etiketi (Fiyat) hem de değeri kalın ve italik yapar. Yalnızca kalın ve italik bir değer oluşturmak istiyorsak, bu biçimlendirmeyi satırdaki ikinci hücreye uygulamamız gerekir; bu, aşağıdakiler kullanılarak gerçekleştirilebilir:
ExpensiveProductsPriceInBoldItalic.Rows(4).Cells(1).Font.Bold = True
ExpensiveProductsPriceInBoldItalic.Rows(4).Cells(1).Font.Italic = True
Öğreticilerimiz şimdiye kadar işlenen işaretleme ve stille ilgili bilgiler arasında temiz bir ayrımı korumak için stil sayfalarını kullandığından, yukarıda gösterildiği gibi belirli stil özelliklerini ayarlamak yerine css sınıfını kullanalım.
Styles.css
Stil sayfasını açın ve aşağıdaki tanım ile adlı ExpensivePriceEmphasis
yeni bir CSS sınıfı ekleyin:
.ExpensivePriceEmphasis
{
font-weight: bold;
font-style: italic;
}
Ardından, olay işleyicisinde DataBound
hücrenin CssClass
özelliğini olarak ExpensivePriceEmphasis
ayarlayın. Aşağıdaki kod, olay işleyicisini DataBound
tamamen gösterir:
Protected Sub ExpensiveProductsPriceInBoldItalic_DataBound _
(sender As Object, e As System.EventArgs) _
Handles ExpensiveProductsPriceInBoldItalic.DataBound
Dim product As Northwind.ProductsRow = _
CType(CType(ExpensiveProductsPriceInBoldItalic.DataItem, _
System.Data.DataRowView).Row, Northwind.ProductsRow)
If Not product.IsUnitPriceNull() AndAlso product.UnitPrice > 75 Then
ExpensiveProductsPriceInBoldItalic.Rows(4).Cells(1).CssClass = _
"ExpensivePriceEmphasis"
End If
End Sub
Fiyatı 75,00 TL'den düşük olan Chai görüntülenirken fiyat normal bir yazı tipinde görüntülenir (bkz. Şekil 4). Ancak, fiyatı 97,00 ABD doları olan Mishi Kobe Niku görüntülenirken, fiyat kalın, italik bir yazı tipiyle görüntülenir (bkz. Şekil 5).
Şekil 4: 75,00 TL'den Küçük Fiyatlar Normal Yazı Tipinde Görüntüleniyor (Tam boyutlu resmi görüntülemek için tıklayın)
Şekil 5: Pahalı Ürünlerin Fiyatları Kalın, İtalik Yazı Tipinde Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
FormView DenetimininDataBound
Olay İşleyicisini Kullanma
Bir FormView'a bağlı temel alınan verileri belirleme adımları DetailsView için bir olay işleyicisi oluşturma DataBound
, özelliği denetime bağlı uygun nesne türüne atama DataItem
ve nasıl devam edileceğini belirleme adımlarıyla aynıdır. Bununla birlikte, FormView ve DetailsView, kullanıcı arabiriminin görünümünün nasıl güncelleştirildiğinden farklıdır.
FormView herhangi bir BoundField içermez, bu nedenle Rows
koleksiyonuna sahip değildir. Bunun yerine, FormView statik HTML, Web denetimleri ve veri bağlama söz diziminin bir karışımını içerebilen şablonlardan oluşur. FormView stilinin ayarlanması genellikle FormView şablonlarındaki bir veya daha fazla Web denetiminin stilini ayarlamayı içerir.
Bunu göstermek için, önceki örnekteki gibi ürünleri listelemek için bir FormView kullanalım, ancak bu kez yalnızca ürün adını ve stoktaki birimleri görüntüleyelim. Stok miktarı 10 veya daha az ise, stoktaki birimler kırmızı yazı tipiyle gösterilsin.
4. Adım: Ürün Bilgilerini FormView'da Görüntüleme
DetailsView sayfasındaki CustomColors.aspx
öğesinin altına bir FormView ekleyin ve ID
özelliğini LowStockedProductsInRed
olarak ayarlayın. FormView'ı önceki adımda oluşturulan ObjectDataSource denetimine bağlayın. Bu, FormView için bir ItemTemplate
, EditItemTemplate
ve InsertItemTemplate
oluşturur.
EditItemTemplate
ve InsertItemTemplate
kaldırın ve ItemTemplate
öğesini yalnızca ProductName
ve UnitsInStock
değerlerini içerecek şekilde, her birini uygun şekilde adlandırılmış Etiket denetimlerine yerleştirerek basitleştirin. Önceki örnekteki DetailsView'da olduğu gibi, FormView'un akıllı etiketindeki Sayfalandırmayı Etkinleştir onay kutusunu da işaretleyin.
Bu düzenlemelerden sonra FormView'unuzun işaretlemesi aşağıdakine benzer görünmelidir:
<asp:FormView ID="LowStockedProductsInRed" runat="server"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"
AllowPaging="True" EnableViewState="False">
<ItemTemplate>
<b>Product:</b>
<asp:Label ID="ProductNameLabel" runat="server"
Text='<%# Bind("ProductName") %>'>
</asp:Label><br />
<b>Units In Stock:</b>
<asp:Label ID="UnitsInStockLabel" runat="server"
Text='<%# Bind("UnitsInStock") %>'>
</asp:Label>
</ItemTemplate>
</asp:FormView>
ItemTemplate
öğesinin neleri içerdiğini unutmayın.
-
Statik HTML olarak "
<br />
" ve "<b>
" öğeleriyle birlikte "Product:" ve "Units In Stock:" metinlerini ayarlayın. -
Web iki etiket denetimini,
ProductNameLabel
veUnitsInStockLabel
kontrol eder. -
Veri bağlama söz dizimi, bu alanlardaki
<%# Bind("ProductName") %>
ve<%# Bind("UnitsInStock") %>
söz dizimini, Etiket denetimlerininText
özelliklerine değerlerini atamak için kullanır.
5. Adım: DataBound Olay İşleyicisindeki Verilerin Değerini Program Aracılığıyla Belirleme
FormView'un işaretlemesi tamamlandıktan sonra, bir sonraki adım değerin UnitsInStock
10'dan küçük mü yoksa 10'a eşit mi olduğunu program aracılığıyla belirlemektir. Bu, DetailsView ile olduğu gibi FormView ile tam olarak aynı şekilde gerçekleştirilir. FormView'un DataBound
olayı için bir olay işleyicisi oluşturarak başlayın.
Şekil 6: Olay İşleyicisi DataBound
Oluşturma
Olay işleyicisinde FormView'un DataItem
özelliğini bir ProductsRow
örneğe yayınlayın ve değerin UnitsInPrice
kırmızı yazı tipinde görüntülememiz gerekip gerekmediğini belirleyin.
Protected Sub LowStockedProductsInRed_DataBound _
(sender As Object, e As System.EventArgs) _
Handles LowStockedProductsInRed.DataBound
Dim product As Northwind.ProductsRow = _
CType(CType(LowStockedProductsInRed.DataItem, System.Data.DataRowView).Row, _
Northwind.ProductsRow)
If Not product.IsUnitsInStockNull() AndAlso product.UnitsInStock <= 10 Then
Dim unitsInStock As Label = _
CType(LowStockedProductsInRed.FindControl("UnitsInStockLabel"), Label)
If unitsInStock IsNot Nothing Then
End If
End If
End Sub
6. Adım: FormView'un ItemTemplate öğesindeki UnitsInStockLabel Etiket Denetimini Biçimlendirme
Son adım, değer 10 veya daha küçükse görüntülenen UnitsInStock
değeri kırmızı yazı tipinde biçimlendirmektir. Bunu başarmak için, UnitsInStockLabel
içindeki ItemTemplate
kontrolüne program aracılığıyla erişip, metnin kırmızı olarak görüntülenmesi için stil özelliklerini ayarlamamız gerekir. Şablondaki bir Web denetimine erişmek için FindControl("controlID")
yöntemini şu şekilde kullanın:
Dim someName As WebControlType = _
CType(FormViewID.FindControl("controlID"), WebControlType)
Örneğimizde değeri ID
olan UnitsInStockLabel
bir Etiket denetimine erişmek istediğimiz için şunları kullanacağız:
Dim unitsInStock As Label = _
CType(LowStockedProductsInRed.FindControl("UnitsInStockLabel"), Label)
Web denetimine programlı olarak referans aldığımızda, gerektiği gibi stille ilgili özelliklerini değiştirebiliriz. Önceki örnekte olduğu gibi, Styles.css
içinde LowUnitsInStockEmphasis
adlı bir CSS sınıfı oluşturdum. Bu stili Etiket Web denetimine uygulamak için özelliğini uygun şekilde ayarlayın CssClass
.
Protected Sub LowStockedProductsInRed_DataBound _
(sender As Object, e As System.EventArgs) _
Handles LowStockedProductsInRed.DataBound
Dim product As Northwind.ProductsRow = _
CType(CType(LowStockedProductsInRed.DataItem, System.Data.DataRowView).Row, _
Northwind.ProductsRow)
If Not product.IsUnitsInStockNull() AndAlso product.UnitsInStock <= 10 Then
Dim unitsInStock As Label = _
CType(LowStockedProductsInRed.FindControl("UnitsInStockLabel"), Label)
If unitsInStock IsNot Nothing Then
unitsInStock.CssClass = "LowUnitsInStockEmphasis"
End If
End If
End Sub
Uyarı
Şablonu kullanarak program aracılığıyla Web denetimine FindControl("controlID")
erişmek ve stille ilgili özelliklerini ayarlamak için kullanılan söz dizimi, DetailsView veya GridView denetimlerinde TemplateFields kullanılırken de kullanılabilir. Sonraki öğreticimizde TemplateFields'i inceleyeceğiz.
Şekil 7'de değeri 10'dan büyük olan UnitsInStock
bir ürün görüntülenirken FormView gösterilirken, Şekil 8'deki ürünün değeri 10'dan küçüktür.
Şekil 7: Stokta Yeterince Büyük Birimlere Sahip Ürünler için Özel Biçimlendirme Uygulanmaz (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 8: Stok Numarasındaki Birimler, 10 veya Daha Az Değerli Ürünler için Kırmızı Renkte Gösterilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
GridView'unRowDataBound
Olayıyla Biçimlendirme
Daha önce DetailsView ve FormView denetimlerinin veri bağlama sırasında ilerletilen adım dizisini inceledik. Şimdi bu adımları bir kez daha yenileyici olarak inceleyelim.
- Veri Web denetiminin
DataBinding
olayı tetiklenir. - Veriler, veri Web denetimine bağlıdır.
- Veri Web denetiminin
DataBound
olayı tetiklenir.
Bu üç basit adım, yalnızca tek bir kayıt görüntüledikleri için DetailsView ve FormView için yeterlidir. Ona bağlı tüm kayıtları görüntüleyen GridView için (yalnızca ilk kayıt değil), 2. adım biraz daha önemlidir.
2. adımda GridView veri kaynağını numaralandırır ve her kayıt için bir GridViewRow
örnek oluşturur ve geçerli kaydı buna bağlar. GridView'a eklenen her GridViewRow
olay için iki olay oluşturulur:
-
RowCreated
oluşturulduktan sonraGridViewRow
tetiklenir -
RowDataBound
geçerli kayıt öğesiGridViewRow
ile bağlandığında tetiklenir.
Ardından GridView için veri bağlama aşağıdaki adım dizisiyle daha doğru bir şekilde açıklanmıştır:
GridView'in
DataBinding
olayı tetiklenir.Veriler GridView'a bağlıdır.
Veri kaynağındaki her kayıt için
-
GridViewRow
Nesne oluşturma - Olayı tetikle
RowCreated
- Kaydı
GridViewRow
öğesine bağlayın - Olayı tetikle
RowDataBound
-
GridViewRow
öğesiniRows
koleksiyonuna ekle
-
GridView'in
DataBound
olayı tetiklenir.
GridView'un tek tek kayıtlarının biçimini özelleştirmek için olay için RowDataBound
bir olay işleyicisi oluşturmamız gerekir. Bunu göstermek için sayfaya CustomColors.aspx
her ürünün adını, kategorisini ve fiyatını listeleyen bir GridView ekleyelim ve fiyatı sarı arka plan rengiyle 10,00 TL'den düşük olan ürünleri vurgulayalım.
7. Adım: GridView'da Ürün Bilgilerini Görüntüleme
Önceki örnekten FormView'in altına bir GridView ekleyin ve ID
özelliğini HighlightCheapProducts
olarak ayarlayın. Sayfadaki tüm ürünleri döndüren bir ObjectDataSource'larımız olduğundan GridView'ı buna bağlayın. Son olarak, GridView'un BoundField değerlerini yalnızca ürünlerin adlarını, kategorilerini ve fiyatlarını içerecek şekilde düzenleyin. Bu düzenlemelerden sonra GridView'un işaretlemesi şöyle görünmelidir:
<asp:GridView ID="HighlightCheapProducts" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"
EnableViewState="False" runat="server">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True" SortExpression="CategoryName" />
<asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
HeaderText="Price"
HtmlEncode="False" SortExpression="UnitPrice" />
</Columns>
</asp:GridView>
Şekil 9'da tarayıcı üzerinden görüntülendiğinde bu noktaya kadar olan ilerlememiz gösterilmektedir.
Şekil 9: GridView Her Ürünün Adını, Kategorisini ve Fiyatını Listeler (Tam boyutlu görüntüyü görüntülemek için tıklayın)
8. Adım: Program Aracılığıyla RowDataBound Olay İşleyicisindeki Verilerin Değerini Belirleme
GridView'e ProductsDataTable
bağlı olduğunda, ProductsRow
örnekleri numaralandırılır ve her ProductsRow
için bir GridViewRow
oluşturulur.
GridViewRow
's DataItem
özelliği belirli ProductRow
öğesine atanır, ardından GridView'un RowDataBound
olay işleyicisi tetiklenir. GridView'a UnitPrice
bağlı her ürünün değerini belirlemek için GridView'un RowDataBound
olayı için bir olay işleyicisi oluşturmamız gerekir. Bu olay işleyicisinde geçerli UnitPrice
için GridViewRow
değerini inceleyebiliriz ve bu satır için biçimlendirme kararı verebiliriz.
Bu olay işleyicisi, FormView ve DetailsView ile aynı adım serisi kullanılarak oluşturulabilir.
Şekil 10: GridView Olayı için Olay İşleyicisi RowDataBound
Oluşturma
Olay işleyicisinin bu şekilde oluşturulması, aşağıdaki kodun ASP.NET sayfasının kod bölümüne otomatik olarak eklenmesine neden olur:
Protected Sub HighlightCheapProducts_RowDataBound _
(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles HighlightCheapProducts.RowDataBound
End Sub
Olay tetiklendiği zaman, olay işleyicisine ikinci parametre olarak RowDataBound
adlı bir özelliği olan GridViewRowEventArgs
türünde bir nesne iletilir. Bu özellik, henüz veriye bağlanmış olan GridViewRow
öğesine bir başvuru döndürür.
ProductsRow
'a bağlı GridViewRow
örneğine erişmek için DataItem
özelliğini şu şekilde kullanırız:
Protected Sub HighlightCheapProducts_RowDataBound _
(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles HighlightCheapProducts.RowDataBound
Dim product As Northwind.ProductsRow = _
CType(CType(e.Row.DataItem, System.Data.DataRowView).Row, Northwind.ProductsRow)
If Not product.IsUnitPriceNull() AndAlso product.UnitPrice < 10 Then
End If
End Sub
Olay işleyicisi ile RowDataBound
çalışırken GridView'un farklı satır türlerinden oluştuğunu ve bu olayın tüm satır türleri için tetiklendiğini unutmayın. Bir GridViewRow
'nin türü, RowType
özelliği tarafından belirlenebilir ve olası değerlerden birine sahip olabilir.
-
DataRow
GridView'ın kayıtlarından bir kayda bağlı bir satırDataSource
-
EmptyDataRow
GridView boşsa görüntülenen satırDataSource
-
Footer
alt bilgi satırı; GridView'ınShowFooter
özelliğiTrue
olarak ayarlanmışsa gösterilir -
Header
üst bilgi satırı; GridView'un ShowHeader özelliğinin (varsayılan) olarak ayarlıTrue
olup olmadığını gösterir -
Pager
sayfalama uygulayan GridView'lar için, sayfalama arabirimini görüntüleyen satır -
Separator
GridView için kullanılmaz, ancak DataList ve Repeater denetimlerininRowType
özellikleri tarafından kullanılır. Bu iki veri Web denetimini sonraki öğreticilerde ele alacağız.
EmptyDataRow
, Header
, Footer
ve Pager
satırları bir DataSource
kayıtla ilişkili olmadığından, her zaman özellikleri Nothing
için değeri DataItem
olur. Bu nedenle, bir GridViewRow
ile uğraştığımızdan emin olmamız gerekir, geçerli DataItem
'nin DataRow
özelliğiyle çalışmaya başlamadan önce. Bu, GridViewRow
'nin RowType
özelliği aşağıdaki gibi kontrol edilerek gerçekleştirilebilir.
Protected Sub HighlightCheapProducts_RowDataBound _
(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles HighlightCheapProducts.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim product As Northwind.ProductsRow = _
CType(CType(e.Row.DataItem, System.Data.DataRowView).Row, Northwind.ProductsRow)
If Not product.IsUnitPriceNull() AndAlso product.UnitPrice < 10 Then
End If
End If
End Sub
9. Adım: BirimFiyat Değeri 10,00 TL'den Küçük olduğunda Satır Sarısını Vurgulama
Son adım, söz konusu satırın değeri $10.00'dan küçükse, GridViewRow
öğesini program aracılığıyla vurgulamaktır. GridView'in satırlarına veya hücrelerine erişme söz dizimi, tüm satıra erişmek için GridViewID.Rows(index)
, belirli bir hücreye erişmek için GridViewID.Rows(index).Cells(index)
DetailsView ile aynıdır. Ancak, RowDataBound
olay işleyicisi tetiklendiğinde, veriye bağlanmış GridViewRow
henüz GridView'ın Rows
koleksiyonuna eklenmemiştir. Bu nedenle, GridViewRow
geçerli örneğe Satırlar koleksiyonunu kullanarak RowDataBound
olay işleyici içinden erişemezsiniz.
GridViewID.Rows(index)
yerine, GridViewRow
olay işleyicisinde geçerli RowDataBound
örneğine e.Row
kullanarak başvurabiliriz. Yani, geçerli GridViewRow
örneğini vurgulamak için olay işleyicisinden RowDataBound
kullanırız:
e.Row.BackColor = System.Drawing.Color.Yellow
GridViewRow
'nin BackColor
özelliğini doğrudan ayarlamak yerine, CSS sınıflarını kullanmaya devam edelim. Arka plan rengini sarıya ayarlayan adlı AffordablePriceEmphasis
bir CSS sınıfı oluşturdum. Tamamlanan RowDataBound
olay işleyicisi aşağıdaki gibidir:
Protected Sub HighlightCheapProducts_RowDataBound _
(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles HighlightCheapProducts.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim product As Northwind.ProductsRow = _
CType(CType(e.Row.DataItem, System.Data.DataRowView).Row, Northwind.ProductsRow)
If Not product.IsUnitPriceNull() AndAlso product.UnitPrice < 10 Then
e.Row.CssClass = "AffordablePriceEmphasis"
End If
End If
End Sub
Şekil 11: En Uygun Fiyatlı Ürünler Sarı Vurgulanmış (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Özet
Bu öğreticide denetime bağlı verileri temel alarak GridView, DetailsView ve FormView'un nasıl biçimlendirilir olduğunu gördük. Bu amacı gerçekleştirmek için, DataBound
veya RowDataBound
olayları için bir olay işleyicisi oluşturduk. Burada, temel alınan veriler gerekirse bir biçimlendirme değişikliği ile birlikte incelendi. Detaylara ya da FormView'e bağlı verilere erişmek için, DataItem
özelliğini olay işleyicisinde kullanırız; GridView'de ise, her DataBound
örneğinin GridViewRow
özelliği, olay işleyicisindeki DataItem
yer alan ve o satıra bağlı verileri içerir.
Veri Web denetiminin biçimlendirmesini program aracılığıyla ayarlama söz dizimi, Web denetimine ve biçimlendirilecek verilerin nasıl görüntülendiğine bağlıdır. DetailsView ve GridView denetimleri için satırlara ve hücrelere sıralı bir dizin tarafından erişilebilir. Şablonları kullanan FormView'da, FindControl("controlID")
yöntemi genellikle şablon içindeki bir Web denetimini bulmak için kullanılır.
Sonraki öğreticide GridView ve DetailsView ile şablonların nasıl kullanılacağına bakacağız. Ayrıca, temel alınan verilere göre biçimlendirmeyi özelleştirmek için başka bir teknik göreceğiz.
Mutlu Programlama!
Yazar Hakkında
Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.
Özel Teşekkürler
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin baş inceleyicileri: E.R. Gilmore, Dennis Patterson ve Dan Jagers. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.