Aracılığıyla paylaş


GridView’a Düğme Ekleme ve Bunları Yanıtlama (VB)

tarafından Scott Mitchell

PDF'i indirin

Bu öğreticide, hem şablona hem de GridView veya DetailsView denetiminin alanlarına özel düğmelerin nasıl ekleneceğini inceleyeceğiz. Özellikle, kullanıcının tedarikçiler arasında sayfa oluşturmasına olanak tanıyan bir FormView'a sahip bir arabirim oluşturacağız.

Giriş

Birçok raporlama senaryosunda rapor verilerine salt okunur erişim olsa da, raporların görüntülenen verilere göre eylem gerçekleştirme özelliğini içermesi sık karşılaşılan bir durum değildir. Bu genellikle raporda görüntülenen her kayıtla birlikte bir Button, LinkButton veya ImageButton Web denetimi eklenmesini içerir. Bu denetim tıklandığında geri göndermeye neden olur ve bazı sunucu tarafı kodu çağırır. Verileri kayıt temelinde düzenlemek ve silmek en yaygın örnektir. Aslında, Veri Ekleme, Güncelleştirme ve Silmeye Genel Bakış öğreticisiyle başladığımızda gördüğümüz gibi, GridView, DetailsView ve FormView denetimlerinin tek bir kod satırı yazmaya gerek kalmadan bu tür işlevleri destekleyebilecek şekilde düzenlenmesi ve silinmesi çok yaygındır.

Düzenle ve Sil düğmelerine ek olarak GridView, DetailsView ve FormView denetimleri, tıklandığında bazı özel sunucu tarafı mantığı gerçekleştiren Düğmeler, LinkButton'lar veya ImageButton'lar da içerebilir. Bu öğreticide, hem şablona hem de GridView veya DetailsView denetiminin alanlarına özel düğmelerin nasıl ekleneceğini inceleyeceğiz. Özellikle, kullanıcının tedarikçiler arasında sayfa oluşturmasına olanak tanıyan bir FormView'a sahip bir arabirim oluşturacağız. Belirli bir sağlayıcı için FormView, sağlayıcı hakkındaki bilgileri düğme web denetimiyle birlikte gösterir ve tıklanırsa ilişkili tüm ürünlerini sonlandırıldı olarak işaretler. Buna ek olarak, GridView seçilen sağlayıcı tarafından sağlanan ürünleri listeler ve her satırda, tıklanması durumunda ürünün UnitPrice %10'unu yükselten veya azaltan Fiyat ve İndirim Fiyatı Düğmelerini içeren her satır listelenir (bkz. Şekil 1).

Hem FormView hem de GridView Özel Eylemler Gerçekleştiren Düğmeler içeriyor

Şekil 1: Hem FormView hem de GridView Özel Eylemler Gerçekleştiren Düğmeler İçeriyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

1. Adım: Düğme Öğreticisi Web Sayfalarını Ekleme

Özel düğmelerin nasıl ekleneceğine bakmadan önce, web sitesi projemizde bu öğretici için ihtiyacımız olacak ASP.NET sayfalarını oluşturmak için biraz zaman ayıralım. adlı CustomButtonsyeni bir klasör ekleyerek başlayın. Ardından, aşağıdaki iki ASP.NET sayfayı bu klasöre ekleyin ve her sayfayı ana sayfayla ilişkilendirdiğinizden Site.master emin olun:

  • Default.aspx
  • CustomButtons.aspx

Özel Düğmelerle İlgili Öğreticiler için ASP.NET Sayfaları Ekleme

Şekil 2: Özel Düğmelerle İlgili Öğreticiler için ASP.NET Sayfaları Ekleme

Diğer klasörlerde olduğu gibi klasöründe Default.aspx de CustomButtons kendi bölümündeki öğreticiler listelenir. Kullanıcı Denetimi'nin SectionLevelTutorialListing.ascx bu işlevi sağladığını hatırlayın. Bu nedenle, bu Kullanıcı Denetimini Default.aspx Çözüm Gezgini sayfanın Tasarım görünümüne sürükleyerek öğesine ekleyin.

SectionLevelTutorialListing.ascx Kullanıcı Denetimini Default.aspx ekleme

Şekil 3: Kullanıcı Denetimini ekleme SectionLevelTutorialListing.ascxDefault.aspx (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son olarak, sayfaları dosyaya Web.sitemap girdi olarak ekleyin. Özellikle, Sayfalama ve Sıralama'nın <siteMapNode>ardından aşağıdaki işaretlemeyi ekleyin:

<siteMapNode
    title="Adding Custom Buttons"
    description="Samples of Reports that Include Buttons for Performing
                  Server-Side Actions"
    url="~/CustomButtons/Default.aspx">
    <siteMapNode
        title="Using ButtonFields and Buttons in Templates"
        description="Examines how to add custom Buttons, LinkButtons,
                      or ImageButtons as ButtonFields or within templates."
        url="~/CustomButtons/CustomButtons.aspx" />
</siteMapNode>

güncelleştirdikten Web.sitemapsonra, öğreticiler web sitesini bir tarayıcı üzerinden görüntülemek için biraz bekleyin. Soldaki menüde artık düzenleme, ekleme ve silme öğreticileri için öğeler bulunur.

Site Haritası Artık Özel Düğmeler Öğreticisi girdisini içerir

Şekil 4: Site Haritası Artık Özel Düğmeler Öğreticisi girdisini içerir

2. Adım: Tedarikçileri Listeleyen Bir FormView Ekleme

Sağlayıcıları listeleyen FormView'ı ekleyerek bu öğreticiyi kullanmaya başlayalım. Giriş bölümünde açıklandığı gibi, bu FormView kullanıcının tedarikçiler arasında sayfa oluşturmasına olanak tanır ve tedarikçi tarafından sağlanan ürünleri gridView'da gösterir. Buna ek olarak, bu FormView tıklandığında tüm tedarikçi ürünlerini sonlandırıldı olarak işaretleyen bir Düğme içerir. Özel düğmeyi FormView'a ekleme konusunda endişe etmeden önce, önce sağlayıcı bilgilerini görüntülemesi için FormView'u oluşturalım.

Klasördeki CustomButtons.aspx sayfayı CustomButtons açarak başlayın. FormView'ı Araç Kutusu'ndan Tasarımcı'ya sürükleyerek sayfaya ekleyin ve özelliğini olarak IDayarlayınSuppliers. FormView'un akıllı etiketinden adlı SuppliersDataSourceyeni bir ObjectDataSource oluşturmayı tercih edin.

SuppliersDataSource Adlı Yeni Bir ObjectDataSource Oluşturma

Şekil 5: Adlı SuppliersDataSource Yeni Bir ObjectDataSource Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu yeni ObjectDataSource'ı sınıf SuppliersBLL yönteminden GetSuppliers() sorgular olacak şekilde yapılandırın (bkz. Şekil 6). Bu FormView sağlayıcı bilgilerini güncelleştirmek için bir arabirim sağlamadığından, GÜNCELLEŞTIR sekmesindeki açılan listeden (Yok) seçeneğini belirleyin.

Veri Kaynağını SuppliersBLL Sınıfının GetSuppliers() Yöntemini kullanacak şekilde yapılandırma

Şekil 6: Veri Kaynağını Sınıf SuppliersBLL Yöntemini kullanacak GetSuppliers() şekilde yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource yapılandırıldıktan sonra Visual Studio, FormView için bir InsertItemTemplate, EditItemTemplateve ItemTemplate oluşturur. ve InsertItemTemplate öğesini EditItemTemplate kaldırın ve değerini değiştirerek ItemTemplate yalnızca sağlayıcının şirket adını ve telefon numarasını görüntülemesini sağlayın. Son olarak, akıllı etiketinden Sayfalandırmayı Etkinleştir onay kutusunu işaretleyerek (veya özelliğini AllowPagingolarak ayarlayarakTrue) FormView için disk belleği desteğini açın. Bu değişikliklerden sonra sayfanızın bildirim temelli işaretlemesi aşağıdakine benzer görünmelidir:

<asp:FormView ID="Suppliers" runat="server" DataKeyNames="SupplierID"
    DataSourceID="SuppliersDataSource" EnableViewState="False" AllowPaging="True">
    <ItemTemplate>
        <h3>
            <asp:Label ID="CompanyName" runat="server"
                Text='<%# Bind("CompanyName") %>' />
        </h3>
        <b>Phone:</b>
        <asp:Label ID="PhoneLabel" runat="server" Text='<%# Bind("Phone") %>' />
    </ItemTemplate>
</asp:FormView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLL">
</asp:ObjectDataSource>

Şekil 7'de tarayıcı üzerinden görüntülendiğinde CustomButtons.aspx sayfası gösterilmektedir.

FormView, Seçili Durumdaki Sağlayıcıdan CompanyName ve Telefon Alanlarını Listeler

Şekil 7: FormView, Seçili Durumdaki CompanyName Sağlayıcıdan ve Phone Alanlarını Listeler (Tam boyutlu görüntüyü görüntülemek için tıklayın)

3. Adım: Seçili Sağlayıcının Ürünlerini Listeleyen Bir GridView Ekleme

FormView şablonuna Tüm Ürünleri Sonlandır Düğmesini eklemeden önce, önce Seçilen sağlayıcı tarafından sağlanan ürünleri listeleyen FormView'un altına bir GridView ekleyelim. Bunu yapmak için sayfaya bir GridView ekleyin, özelliğini olarak IDayarlayın SuppliersProducts ve adlı SuppliersProductsDataSourceyeni bir ObjectDataSource ekleyin.

SuppliersProductsDataSource Adlı Yeni Bir ObjectDataSource Oluşturma

Şekil 8: Adlı SuppliersProductsDataSource Yeni Bir ObjectDataSource Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu ObjectDataSource'ı ProductsBLL sınıfı GetProductsBySupplierID(supplierID) yöntemini kullanacak şekilde yapılandırın (bkz. Şekil 9). Bu GridView, bir ürünün fiyatının ayarlanmasına izin verir ancak GridView'daki yerleşik düzenleme veya silme özelliklerini kullanmaz. Bu nedenle, ObjectDataSource'un UPDATE, INSERT ve DELETE sekmeleri için açılan listeyi (Yok) olarak ayarlayabiliriz.

Veri Kaynağını ProductsBLL Sınıfının GetProductsBySupplierID(supplierID) Yöntemini kullanacak şekilde yapılandırın

Şekil 9: Veri Kaynağını Sınıf ProductsBLL Yöntemini kullanacak GetProductsBySupplierID(supplierID) şekilde yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

GetProductsBySupplierID(supplierID) yöntemi bir giriş parametresi kabul ettiğinden, ObjectDataSource sihirbazı bu parametre değerinin kaynağını sorar. Değeri FormView'dan SupplierID geçirmek için Parametre kaynağı açılan listesini Control ve ControlID açılan listesini Suppliers (2. Adımda oluşturulan FormView kimliği) olarak ayarlayın.

supplierID Parametresinin Sağlayıcılar FormView Denetiminden Gelmesi Gerektiğini Belirtin

Şekil 10: Parametrenin supplierID FormView Denetiminden Suppliers Gelmesi Gerektiğini Belirtin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource sihirbazı tamamlandıktan sonra GridView, ürün veri alanlarının her biri için bir BoundField veya CheckBoxField içerir. Bunu CheckBoxField ile ProductName birlikte yalnızca UnitPrice ve Discontinued BoundField değerlerini gösterecek şekilde kırpalım; ayrıca, BoundField'i metni para birimi olarak biçimlendirecek şekilde biçimlendirelimUnitPrice. GridView ve SuppliersProductsDataSource ObjectDataSource bildirim temelli işaretlemeniz aşağıdaki işaretlemeye benzer görünmelidir:

<asp:GridView ID="SuppliersProducts" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="SuppliersProductsDataSource"
    EnableViewState="False" runat="server">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            SortExpression="UnitPrice" DataFormatString="{0:C}"
            HtmlEncode="False" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersProductsDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductsBySupplierID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:ControlParameter ControlID="Suppliers" Name="supplierID"
            PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Bu noktada öğreticimizde, kullanıcının üstteki FormView'dan bir sağlayıcı seçmesine ve alttaki GridView aracılığıyla bu sağlayıcı tarafından sağlanan ürünleri görüntülemesine olanak sağlayan bir ana/ayrıntılar raporu görüntülenir. Şekil 11'de, FormView'dan Tokyo Traders sağlayıcısı seçilirken bu sayfanın ekran görüntüsü gösterilmektedir.

Seçilen Tedarikçi ürünleri GridView'da görüntülenir

Şekil 11: Seçili Sağlayıcı Ürünleri GridView'da Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

4. Adım: Bir Sağlayıcı için Tüm Ürünleri Sona Erdirmek için DAL ve BLL Yöntemleri Oluşturma

FormView'a tıklandığında tedarikçinin tüm ürünlerini sonlandıran bir Düğme ekleyebilmek için önce bu eylemi gerçekleştiren DAL ve BLL'ye bir yöntem eklememiz gerekir. Özellikle, bu yöntem olarak adlandırılır DiscontinueAllProductsForSupplier(supplierID). FormView'un Düğmesi'ne tıklandığında, bu yöntemi İş Mantığı Katmanı'nda çağıracağız ve seçilen sağlayıcılardan SupplierIDgeçeriz; BLL daha sonra ilgili Veri Erişim Katmanı yöntemine çağrı yapar ve bu yöntem veritabanına belirtilen sağlayıcının ürünlerini sonlandıran bir UPDATE bildirim verir.

Önceki öğreticilerimizde yaptığımız gibi DAL yöntemini, ardından BLL yöntemini oluşturma ve son olarak ASP.NET sayfasında işlevselliği uygulama ile başlayan bir alt düzey yaklaşımı kullanacağız. Northwind.xsd Klasörde Yazılan Veri Kümesi'ni App_Code/DAL açın ve öğesine yeni bir yöntem ProductsTableAdapter ekleyin (öğesine sağ tıklayın ProductsTableAdapter ve Sorgu Ekle'yi seçin). Bunu yaptığınızda, yeni yöntemi ekleme işleminde bize yol gösteren TableAdapter Sorgu Yapılandırması sihirbazı açılır. DAL yöntemimizin geçici bir SQL deyimi kullanacağını belirterek başlayın.

Geçici SQL Deyimi Kullanarak DAL Yöntemi Oluşturma

Şekil 12: Geçici SQL Deyimi Kullanarak DAL Yöntemi Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ardından sihirbaz, ne tür bir sorgu oluşturulacağını sorar. Yöntemin DiscontinueAllProductsForSupplier(supplierID) veritabanı tablosunu güncelleştirmesi Products gerekeceğinden, belirtilen Discontinuedtarafından sağlanan tüm ürünler için alanı 1 olarak ayarlamamız supplierID ve verileri güncelleştiren bir sorgu oluşturmamız gerekir.

UPDATE Sorgu Türünü Seçin

Şekil 13: UPDATE Sorgu Türünü seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki sihirbaz ekranı, DataTable'da tanımlanan alanların her birini güncelleştiren TableAdapter'ın mevcut UPDATE deyimini Products sağlar. Bu sorgu metnini aşağıdaki deyimle değiştirin:

UPDATE [Products] SET
   Discontinued = 1
WHERE SupplierID = @SupplierID

Bu sorguyu girip İleri'ye tıkladıktan sonra, son sihirbaz ekranında yeni yöntemin adını kullanmak DiscontinueAllProductsForSupplieristenir. Son düğmesine tıklayarak sihirbazı tamamlayın. DataSet Designer'a döndükten sonra adlı ProductsTableAdapteriçinde DiscontinueAllProductsForSupplier(@SupplierID) yeni bir yöntem görmeniz gerekir.

Yeni DAL Yöntemini DiscontinueAllProductsForSupplier Olarak Adlandırın

Şekil 14: Yeni DAL Yöntemini DiscontinueAllProductsForSupplier Adlandırın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DiscontinueAllProductsForSupplier(supplierID) Veri Erişim Katmanı'nda oluşturulan yöntemle, sonraki görevimiz İş Mantığı Katmanı'nda yöntemi oluşturmaktırDiscontinueAllProductsForSupplier(supplierID). Bunu yapmak için sınıf dosyasını açın ProductsBLL ve aşağıdakileri ekleyin:

Public Function DiscontinueAllProductsForSupplier(supplierID As Integer) As Integer
    Return Adapter.DiscontinueAllProductsForSupplier(supplierID)
End Function

Bu yöntem, sağlanan DiscontinueAllProductsForSupplier(supplierID) parametre değerini geçirerek DAL'deki yöntemine çağrırsupplierID. Belirli koşullar altında yalnızca bir tedarikçinin ürünlerinin kesilmesine izin veren herhangi bir iş kuralı varsa, bu kurallar burada, BLL'de uygulanmalıdır.

Not

sınıfındaki UpdateProduct aşırı yüklemelerden ProductsBLL farklı olarak, DiscontinueAllProductsForSupplier(supplierID) yöntem imzası özniteliğini DataObjectMethodAttribute (<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, Boolean)>) içermez. Bu, DiscontinueAllProductsForSupplier(supplierID) OBJECTDataSource'un Update sekmesindeki Veri Kaynağını Yapılandırma sihirbazı açılan listesinden yöntemini engeller. Yöntemini doğrudan ASP.NET sayfamızdaki DiscontinueAllProductsForSupplier(supplierID) bir olay işleyicisinden çağıracağımız için bu özniteliği atlamıştım.

5. Adım: FormView'a Tüm Ürünleri Sonlandır Düğmesi Ekleme

DiscontinueAllProductsForSupplier(supplierID) BLL ve DAL'deki yöntem tamamlandıktan sonra, seçilen sağlayıcı için tüm ürünleri sona erdirebilme özelliğini eklemenin son adımı, FormView s ItemTemplateöğesine bir Düğme Web denetimi eklemektir. Düğme metni, Tüm Ürünleri Sonlandır ve özellik değeri IDile tedarikçinin telefon numarasının altına böyle bir DiscontinueAllProductsForSupplier Düğme ekleyelim. Bu Düğme Web denetimini, FormView'un akıllı etiketindeki Şablonları Düzenle bağlantısına tıklayarak (bkz. Şekil 15) veya doğrudan bildirim temelli söz dizimi aracılığıyla Tasarımcı aracılığıyla ekleyebilirsiniz.

FormView'un ItemTemplate'sine Tüm Ürünleri Sonlandır Düğmesi Web Denetimi Ekleme

Şekil 15: FormView'lara ItemTemplate Tüm Ürünleri Sonlandır Düğmesi Web Denetimi Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sayfayı ziyaret eden bir kullanıcı Düğme'ye tıkladığında, bir geri gönderme başlatılır ve FormView ItemCommand olayı tetiklenir. Tıklanan bu Düğmeye yanıt olarak özel kod yürütmek için bu olay için bir olay işleyicisi oluşturabiliriz. Ancak, ItemCommand FormView içinde herhangi bir Button, LinkButton veya ImageButton Web denetimi tıklatıldığında olayın tetiklendiğini anlayın. Bu, kullanıcı FormView'da ItemCommand bir sayfadan diğerine geçtiğinde olayın tetiklenmesi anlamına gelir; kullanıcı ekleme, güncelleştirme veya silmeyi destekleyen bir FormView'da Yeni, Düzenle veya Sil'e tıkladığında aynı şey olur.

Hangi düğmeye ItemCommand tıklandığından bağımsız olarak tetiklendiğinden, olay işleyicisinde Tüm Ürünleri Sonlandır Düğmesine tıklandığını veya başka bir düğme olup olmadığını belirlemek için bir yönteme ihtiyacımız vardır. Bunu başarmak için Button Web denetimi s CommandName özelliğini belirli bir tanımlayıcı değere ayarlayabiliriz. Düğmeye tıklandığında, bu CommandName değer olay işleyicisine ItemCommand geçirilir ve tüm ürünleri sonlandır düğmesinin tıklanan düğme olup olmadığını belirlememize olanak tanır. Tüm Ürünleri Sonlandır Düğmesi özelliğini CommandName DiscontinueProducts olarak ayarlayın.

Son olarak, kullanıcının seçili sağlayıcının ürünlerini gerçekten sonlandırmak istediğinden emin olmak için istemci tarafı onay iletişim kutusunu kullanalım. Silme sırasında İstemci Tarafı Onayı Ekleme öğreticisinde gördüğümüz gibi, bu işlem biraz JavaScript ile gerçekleştirilebilir. Özellikle Düğme Web denetimi s OnClientClick özelliğini olarak ayarlayın return confirm('This will mark _all_ of this supplier\'s products as discontinued. Are you certain you want to do this?');

Bu değişiklikleri yaptıktan sonra, FormView bildirim temelli söz dizimi aşağıdaki gibi görünmelidir:

<asp:FormView ID="Suppliers" runat="server" DataKeyNames="SupplierID"
    DataSourceID="SuppliersDataSource" EnableViewState="False"
    AllowPaging="True">
    <ItemTemplate>
        <h3><asp:Label ID="CompanyName" runat="server"
            Text='<%# Bind("CompanyName") %>'></asp:Label></h3>
        <b>Phone:</b>
        <asp:Label ID="PhoneLabel" runat="server" Text='<%# Bind("Phone") %>' />
        <br />
        <asp:Button ID="DiscontinueAllProductsForSupplier" runat="server"
            CommandName="DiscontinueProducts" Text="Discontinue All Products"
            OnClientClick="return confirm('This will mark _all_ of this supplier\'s
                products as discontinued. Are you certain you want to do this?');" />
    </ItemTemplate>
</asp:FormView>

Ardından, FormView ItemCommand olayı için bir olay işleyicisi oluşturun. Bu olay işleyicisinde önce Tüm Ürünleri Sonlandır Düğmesine tıklanıp tıklanmadığını belirlememiz gerekir. Bu durumda, sınıfın bir örneğini ProductsBLL oluşturmak ve seçilen FormView'u DiscontinueAllProductsForSupplier(supplierID) geçirerek yöntemini çağırmak SupplierID istiyoruz:

Protected Sub Suppliers_ItemCommand(sender As Object, e As FormViewCommandEventArgs) _
    Handles Suppliers.ItemCommand
    If e.CommandName.CompareTo("DiscontinueProducts") = 0 Then
        ' The "Discontinue All Products" Button was clicked.
        ' Invoke the ProductsBLL.DiscontinueAllProductsForSupplier(supplierID) method
        ' First, get the SupplierID selected in the FormView
        Dim supplierID As Integer = CType(Suppliers.SelectedValue, Integer)
        ' Next, create an instance of the ProductsBLL class
        Dim productInfo As New ProductsBLL()
        ' Finally, invoke the DiscontinueAllProductsForSupplier(supplierID) method
        productInfo.DiscontinueAllProductsForSupplier(supplierID)
    End If
End Sub

FormView'da SupplierID seçilen geçerli sağlayıcının öğesine FormView s SelectedValue özelliği kullanılarak erişilebileceğini unutmayın. özelliği, SelectedValue FormView'da görüntülenen kaydın ilk veri anahtarı değerini döndürür. Veri anahtarı değerlerinin çekildiği veri alanlarını gösteren FormView s DataKeyNames özelliği, ObjectDataSource 2. Adımda FormView'a SupplierID bağlanırken Visual Studio tarafından otomatik olarak olarak ayarlandı.

Olay işleyicisi ItemCommand oluşturulduğunda, sayfayı test etmek için biraz bekleyin. Cooperativa de Quesos 'Las Cabras' sağlayıcısına göz atın (benim için FormView'daki beşinci tedarikçi). Bu tedarikçi Queso Cabrales ve Queso Manchego La Pastora olmak üzere her ikisi de sonlandırılmayan iki ürün sağlar.

Cooperativa de Quesos 'Las Cabras'ın işlerinden çıktığını ve bu nedenle ürünlerinin durdurulduğunu düşünün. Tüm Ürünleri Sonlandır düğmesine tıklayın. Bu, istemci tarafı onay iletişim kutusunu görüntüler (bkz. Şekil 16).

Cooperativa de Quesos Las Cabras İki Aktif Ürün Tedarik Ediyor

Şekil 16: Cooperativa de Quesos Las Cabras İki Aktif Ürün Tedarik Ediyor (Tam boyutlu görüntüyü görüntülemek için tıklayınız)

İstemci tarafı onay iletişim kutusunda Tamam'a tıklarsanız, form gönderimi devam eder ve FormView ItemCommand olayının tetiklendiği bir geri gönderme işlemine neden olur. Daha sonra oluşturduğumuz olay işleyicisi, yöntemini çağırarak DiscontinueAllProductsForSupplier(supplierID) ve hem Queso Cabrales hem de Queso Manchego La Pastora ürünlerini sonlandırarak yürütür.

GridView görünüm durumunu devre dışı bırakmışsanız, GridView her geri göndermede temel alınan veri deposuna yeniden bağlanıyor demektir ve bu nedenle bu iki ürünün artık kullanımdan kaldırıldığını yansıtacak şekilde hemen güncelleştirilir (bkz. Şekil 17). Ancak GridView'da görünüm durumunu devre dışı bırakmıyorsanız, bu değişikliği yaptıktan sonra verileri GridView'a el ile yeniden bağlamanız gerekir. Bunu başarmak için, yöntemini çağırdıktan hemen sonra GridView yöntemine DataBind() bir çağrı yapmanız yeterlidir DiscontinueAllProductsForSupplier(supplierID) .

Tüm Ürünleri Sonlandır düğmesine tıkladıktan sonra, Tedarikçinin Ürünleri Uygun Şekilde Güncelleştirilir

Şekil 17: Tüm Ürünleri Sonlandır Düğmesine Tıkladıktan sonra Tedarikçinin Ürünleri Uygun Şekilde Güncelleştirilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

6. Adım: Bir Ürünün Fiyatını Ayarlamak için İş Mantığı Katmanında UpdateProduct Aşırı Yüklemesi Oluşturma

FormView'daki Tüm Ürünleri Sonlandır Düğmesinde olduğu gibi, GridView'da bir ürünün fiyatını artırmaya ve azaltmaya yönelik düğmeler eklemek için önce uygun Veri Erişim Katmanı ve İş Mantığı Katmanı yöntemlerini eklememiz gerekir. DAL'de tek bir ürün satırını güncelleştiren bir yöntemimiz olduğundan, BLL'de yöntem için UpdateProduct yeni bir aşırı yükleme oluşturarak bu işlevi sağlayabiliriz.

Geçmişteki UpdateProduct aşırı yüklemelerimiz, ürün alanlarının bir bileşimini skaler giriş değerleri olarak aldı ve belirtilen ürün için yalnızca bu alanları güncelleştirdi. Bu aşırı yükleme için bu standarttan biraz farklı olacağız ve bunun yerine ürünün ProductID ve değerinin ayarlandığı UnitPrice yüzdeyi (yeniyi geçirmenin aksine, kendi kendini ayarlamış UnitPrice ) geçireceğiz. Bu yaklaşım, ASP.NET sayfası arka planda kod sınıfında yazmamız gereken kodu basitleştirir, çünkü geçerli ürünün UnitPricedeğerini belirlemekle uğraşmamız gerekmez.

UpdateProduct Bu öğreticinin aşırı yüklemesi aşağıda gösterilmiştir:

Public Function UpdateProduct _
    (unitPriceAdjustmentPercentage As Decimal, productID As Integer) As Boolean
    Dim products As Northwind.ProductsDataTable = Adapter.GetProductByProductID(productID)
    If products.Count = 0 Then
        ' no matching record found, return false
        Return False
    End If
    Dim product As Northwind.ProductsRow = products(0)
    ' Adjust the UnitPrice by the specified percentage (if it's not NULL)
    If Not product.IsUnitPriceNull() Then
        product.UnitPrice *= unitPriceAdjustmentPercentage
    End If
    ' Update the product record
    Dim rowsAffected As Integer = Adapter.Update(product)
    ' Return true if precisely one row was updated, otherwise false
    Return rowsAffected = 1
End Function

Bu aşırı yükleme, DAL s GetProductByProductID(productID) yöntemi aracılığıyla belirtilen ürün hakkındaki bilgileri alır. Ardından ürüne UnitPrice bir veritabanı NULL değeri atanıp atanmadığını denetler. Eğer öyleyse, fiyat değişmeden bırakılır. Ancak değer olmayanNULLUnitPrice bir değer varsa, yöntemi ürünün UnitPrice değerini belirtilen yüzdeye (unitPriceAdjustmentPercent ) göre güncelleştirir.

7. Adım: GridView'a Artır ve Azalt Düğmelerini Ekleme

GridView (ve DetailsView) bir alan koleksiyonundan oluşur. BoundFields, CheckBoxFields ve TemplateField'lere ek olarak, ASP.NET, adından da anlaşılacağı gibi, her satır için Button, LinkButton veya ImageButton içeren bir sütun olarak işlenen ButtonField'ı içerir. FormView'a benzer şekilde, GridView sayfalama düğmeleri, Düzenle veya Sil düğmeleri, sıralama düğmeleri vb. içindeki herhangi bir düğmeye tıklanması geri göndermeye neden olur ve GridView RowCommand olayını tetikler.

ButtonField, Belirtilen değeri Düğmeler CommandName özelliklerinin her birine atayan bir CommandName özelliğe sahiptir. FormView'da olduğu gibi, CommandName değer olay işleyicisi tarafından RowCommand hangi düğmeye tıklandığını belirlemek için kullanılır.

GridView'a biri Price +%10 düğme metni, diğeri ise Price -%10 şeklinde olmak üzere iki yeni ButtonField ekleyelim. Bu ButtonField'leri eklemek için GridView akıllı etiketindeki Sütunları Düzenle bağlantısına tıklayın, sol üstteki listeden ButtonField alan türünü seçin ve Ekle düğmesine tıklayın.

GridView'a İki Düğme Alanı Ekleme

Şekil 18: GridView'a İki Düğme Alanı Ekleme

İki ButtonField öğesini ilk iki GridView alanı olarak görünecek şekilde taşıyın. Ardından, bu iki ButtonField öğesinin özelliklerini sırasıyla Price +%10 ve Price -%10 olarak, Text özellikleri ise IncreasePrice ve DecreasePrice olarak ayarlayınCommandName. Varsayılan olarak, ButtonField düğme sütununu LinkButtons olarak işler. Ancak bu, ButtonField özelliği ButtonTypearacılığıyla değiştirilebilir. Bu iki ButtonField'ın normal basma düğmeleri olarak işlenmesini sağlar; bu nedenle özelliğini olarak ButtonTypeayarlayınButton. Şekil 19'da, bu değişiklikler yapıldıktan sonra Alanlar iletişim kutusu gösterilir; aşağıda GridView bildirim temelli işaretlemesi yer alır.

ButtonFields Metin, CommandName ve ButtonType Özelliklerini Yapılandırma

Şekil 19: ButtonFields Text, CommandNameve ButtonType Özelliklerini Yapılandırma

<asp:GridView ID="SuppliersProducts" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="SuppliersProductsDataSource"
    EnableViewState="False">
    <Columns>
        <asp:ButtonField ButtonType="Button" CommandName="IncreasePrice"
            Text="Price +10%" />
        <asp:ButtonField ButtonType="Button" CommandName="DecreasePrice"
            Text="Price -10%" />
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            SortExpression="UnitPrice" DataFormatString="{0:C}"
            HtmlEncode="False" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>

Bu ButtonField'ler oluşturulduktan sonra, son adım GridView RowCommand olayı için bir olay işleyicisi oluşturmaktır. Price +%10 veya Price -%10 düğmeleri tıklandığı için tetiklenen bu olay işleyicisi, düğmesine tıklanan satır için öğesini belirlemeli ProductID ve ardından sınıfın ProductsBLLUpdateProduct yöntemini çağırarak ile birlikte uygun UnitPrice yüzde ayarlamasını geçirmesi ProductIDgerekir. Aşağıdaki kod şu görevleri gerçekleştirir:

Protected Sub SuppliersProducts_RowCommand _
    (sender As Object, e As GridViewCommandEventArgs) _
        Handles SuppliersProducts.RowCommand
    If e.CommandName.CompareTo("IncreasePrice") = 0 OrElse _
       e.CommandName.CompareTo("DecreasePrice") = 0 Then
        ' The Increase Price or Decrease Price Button has been clicked
        ' Determine the ID of the product whose price was adjusted
        Dim productID As Integer = Convert.ToInt32( _
            SuppliersProducts.DataKeys(Convert.ToInt32(e.CommandArgument)).Value)
        ' Determine how much to adjust the price
        Dim percentageAdjust As Decimal
        If e.CommandName.CompareTo("IncreasePrice") = 0 Then
            percentageAdjust = 1.1
        Else
            percentageAdjust = 0.9
        End If
        ' Adjust the price
        Dim productInfo As New ProductsBLL()
        productInfo.UpdateProduct(percentageAdjust, productID)
    End If
End Sub

Fiyat +%10 veya Fiyat -%10 düğmesine tıklanan satırı belirlemek ProductID için GridView koleksiyonuna DataKeys başvurmamız gerekir. Bu koleksiyon, her GridView satırı için özelliğinde DataKeyNames belirtilen alanların değerlerini tutar. ObjectDataSource GridView'a bağlanırken GridView s DataKeyNames özelliği Visual Studio tarafından ProductID olarak ayarlandığından, DataKeys(rowIndex).Value belirtilen ProductID için öğesini sağlar.

ButtonField, parametresinde düğmesine tıklanan satırın rowIndex'inie.CommandArgument otomatik olarak geçirir. Bu nedenle, Fiyat +%10 veya Fiyat -%10 düğmesine tıklanan satırı belirlemek ProductID için şunu kullanırız: Convert.ToInt32(SuppliersProducts.DataKeys(Convert.ToInt32(e.CommandArgument)).Value).

Tüm Ürünleri Sonlandır düğmesinde olduğu gibi, GridView'un görünüm durumunu devre dışı bırakmışsanız GridView her geri göndermede temel alınan veri deposuna yeniden bağlanıyor demektir ve bu nedenle düğmelerden herhangi biri tıklandığında oluşan fiyat değişikliğini yansıtacak şekilde hemen güncelleştirilir. Ancak GridView'da görünüm durumunu devre dışı bırakmıyorsanız, bu değişikliği yaptıktan sonra verileri GridView'a el ile yeniden bağlamanız gerekir. Bunu başarmak için, yöntemini çağırdıktan hemen sonra GridView yöntemine DataBind() bir çağrı yapmanız yeterlidir UpdateProduct .

Şekil 20'de Büyükanne Kelly'nin Ev Sahibi tarafından sağlanan ürünler görüntülenirken sayfa gösterilmektedir. Şekil 21'de Büyükannenin Boysenberry Spread'i için Fiyat +%10 düğmesi iki kez tıklandıktan sonra elde edilen sonuçlar ve Northwoods Kızılcık Sosu için bir kez Fiyat -%10 düğmesi gösterilmiştir.

GridView Fiyat +%10 ve Fiyat -%10 düğmelerini içerir

Şekil 20: GridView Fiyat +%10 ve Fiyat -%10 Düğmelerini içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Birinci ve Üçüncü Ürünün Fiyatları Fiyat +%10 ve Fiyat -%10 Düğmeleriyle Güncelleştirildi

Şekil 21: Birinci ve Üçüncü Ürünün Fiyatları Fiyat +%10 ve Fiyat -%10 Düğmeleriyle Güncelleştirildi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

GridView 'da (ve DetailsView) TemplateField'lerine Düğmeler, BağlantıDüğmesi veya ImageButton'lar da eklenebilir. BoundField'da olduğu gibi, tıklandığında bu Düğmeler bir geri göndermeye neden olur ve GridView'un RowCommand olayını başlatır. Ancak, Bir TemplateField'e düğme eklerken, ButtonFields kullanılırken olduğu gibi Düğme s CommandArgument otomatik olarak satırın dizinine ayarlanmaz. Olay işleyicisinde tıklanan RowCommand düğmenin satır dizinini belirlemeniz gerekiyorsa, Button özelliğini CommandArgument TemplateField içindeki bildirim temelli söz diziminde aşağıdaki gibi bir kod kullanarak el ile ayarlamanız gerekir:
<asp:Button runat="server" ... CommandArgument='<%# CType(Container, GridViewRow).RowIndex %>' />.

Özet

GridView, DetailsView ve FormView denetimlerinin tümü Düğmeler, LinkButton'lar veya ImageButton'lar içerebilir. Bu tür düğmeler tıklandığında bir geri göndermeye ItemCommand neden olur ve Olayı FormView ve DetailsView denetimlerinde ve RowCommand GridView'daki olayda tetikler. Bu veri Web denetimleri, kayıtları silme veya düzenleme gibi komutla ilgili yaygın eylemleri işlemek için yerleşik işlevlere sahiptir. Ancak, tıklandığında kendi özel kodumuzu yürüterek yanıt veren düğmeleri de kullanabiliriz.

Bunu başarmak için veya ItemCommand olayı için bir olay işleyicisi RowCommand oluşturmamız gerekir. Bu olay işleyicisinde önce gelen CommandName değeri denetleyeceğiz ve hangi düğmeye tıklandığını belirleyip uygun özel eylemi gerçekleştireceğiz. Bu öğreticide, belirli bir tedarikçiye ait tüm ürünleri sonlandırmak veya belirli bir ürünün fiyatını %10 artırmak veya azaltmak için düğmelerin ve ButtonField'lerin nasıl kullanılacağını gördük.

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.