Toplu Güncelleştirme (VB)
tarafından Scott Mitchell
Tek bir işlemde birden çok veritabanı kaydını güncelleştirmeyi öğrenin. Kullanıcı Arabirimi Katmanı'nda her satırın düzenlenebilir olduğu bir GridView oluştururuz. Veri Erişim Katmanı'nda, tüm güncelleştirmelerin başarılı olduğundan veya tüm güncelleştirmelerin geri alındığından emin olmak için bir işlem içindeki birden çok Güncelleştirme işlemini sarmalarız.
Giriş
Önceki öğreticide, veritabanı işlemleri için destek eklemek üzere Veri Erişim Katmanı'nı genişletmeyi gördük. Veritabanı işlemleri, bir dizi veri değişikliği deyiminin tek bir atomik işlem olarak kabul edilmesini garanti eder ve bu da tüm değişikliklerin başarısız olmasını veya tümünün başarılı olmasını sağlar. Bu düşük düzey DAL işlevselliğinin önünüzden çıktığı için, toplu veri değiştirme arabirimleri oluşturmaya dikkatimizi çekmeye hazırız.
Bu öğreticide, her satırın düzenlenebilir olduğu bir GridView oluşturacağız (bkz. Şekil 1). Her satır kendi düzenleme arabiriminde işlendiğinden Düzenle, Güncelleştir ve İptal düğmelerinden oluşan bir sütuna gerek yoktur. Bunun yerine, sayfada, tıklandığında GridView satırlarını numaralandıran ve veritabanını güncelleştiren iki Ürün Güncelleştir düğmesi vardır.
Şekil 1: GridView'daki her Satır Düzenlenebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Haydi başlayalım!
Not
Batch gerçekleştirme Güncelleştirmeler öğreticisinde DataList denetimini kullanarak bir toplu düzenleme arabirimi oluşturduk. Bu öğretici, GridView kullanan bir öncekinden farklıdır ve toplu güncelleştirme bir işlem kapsamında gerçekleştirilir. Bu öğreticiyi tamamladıktan sonra önceki öğreticiye dönmenizi ve önceki öğreticide eklenen veritabanı işlemiyle ilgili işlevselliği kullanacak şekilde güncelleştirmenizi tavsiye ediyorum.
Tüm GridView Satırlarını Düzenlenebilir Hale Getirme Adımlarını İnceleme
Veri Ekleme, Güncelleştirme ve Silmeye Genel Bakış öğreticisinde açıklandığı gibi GridView, temel alınan verileri satır başına düzenlemeye yönelik yerleşik destek sunar. GridView, özelliği aracılığıyla hangi satırın düzenlenebilir olduğunu dahili olarak not ederEditIndex
. GridView veri kaynağına bağlı olduğundan, satırın dizininin değerine EditIndex
eşit olup olmadığını görmek için her satırı denetler. Öyleyse, bu satırdaki alanlar düzenleme arabirimleri kullanılarak işlenir. BoundFields için düzenleme arabirimi, özelliği BoundField s özelliği tarafından belirtilen veri alanının değerine atanmış bir TextBox'tır Text
DataField
. TemplateFields için yerine EditItemTemplate
ItemTemplate
kullanılır.
Kullanıcı bir satırın Düzenle düğmesine tıkladığında düzenleme iş akışının başladığını hatırlayın. Bu bir geri göndermeye neden olur, GridView s EditIndex
özelliğini tıklanan satır dizini olarak ayarlar ve verileri kılavuza yeniden birler. Bir satırdaki İptal düğmesine tıklandığında, geri göndermede EditIndex
, verileri kılavuza yeniden bağlamadan önce değeri -1
olarak ayarlanır. GridView satırları sıfırda dizine almaya başladığından ayarı, EditIndex
-1
GridView'u salt okunur modda görüntüleme etkisine sahiptir.
EditIndex
özelliği satır başına düzenleme için iyi çalışır, ancak toplu düzenleme için tasarlanmamıştır. GridView'un tamamını düzenlenebilir hale getirmek için her satırın düzenleme arabirimini kullanarak işlenmesini sağlamamız gerekir. Bunu yapmanın en kolay yolu, düzenlenebilir her alanın içinde tanımlanan ItemTemplate
düzenleme arabirimiyle templateField olarak uygulandığı yeri oluşturmaktır.
Sonraki birkaç adımda tamamen düzenlenebilir bir GridView oluşturacağız. 1. Adımda, GridView ve ObjectDataSource'u oluşturup BoundFields ile CheckBoxField değerlerini TemplateFields'e dönüştürerek başlayacağız. 2. ve 3. Adımlarda, düzenleme arabirimlerini TemplateField'lerden EditItemTemplate
kendi arabirimlerine ItemTemplate
taşıyacağız.
1. Adım: Ürün Bilgilerini Görüntüleme
Satırların düzenlenebilir olduğu bir GridView oluşturma konusunda endişelenmeden önce, yalnızca ürün bilgilerini görüntüleyerek başlayalım. Klasördeki BatchData
sayfayı BatchUpdate.aspx
açın ve Toolbox'tan bir GridView'ı Tasarım Aracı sürükleyin. GridView'u ID
ProductsGrid
olarak ayarlayın ve akıllı etiketinden bunu adlı ProductsDataSource
yeni bir ObjectDataSource'a bağlamayı seçin. ObjectDataSource'u, sınıfın ProductsBLL
GetProducts
yönteminden verilerini alacak şekilde yapılandırın.
Şekil 2: ObjectDataSource'ı Sınıfı Kullanacak ProductsBLL
Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 3: Yöntemini Kullanarak GetProducts
Ürün Verilerini Alma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
GridView gibi ObjectDataSource'un değişiklik özellikleri de satır başına çalışacak şekilde tasarlanmıştır. Bir kayıt kümesini güncelleştirmek için, ASP.NET sayfasının arka planda kod sınıfında verileri toplu işleyip BLL'ye geçiren bir miktar kod yazmamız gerekir. Bu nedenle, ObjectDataSource'un UPDATE, INSERT ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın. Sihirbazı tamamlamak için Son’a tıklayın.
Şekil 4: UPDATE, INSERT ve DELETE Sekmelerindeki Drop-Down Listeler (Yok) olarak ayarlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Veri Kaynağını Yapılandırma sihirbazı tamamlandıktan sonra, ObjectDataSource bildirim temelli işaretleme aşağıdaki gibi görünmelidir:
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>
Veri Kaynağını Yapılandırma sihirbazının tamamlanması, Visual Studio'un GridView'daki ürün veri alanları için BoundField ve CheckBoxField oluşturmasına da neden olur. Bu öğretici için kullanıcının yalnızca ürün adını, kategorisini, fiyatını ve kullanımdan kaldırılan durumunu görüntülemesine ve düzenlemesine izin verelim. , , CategoryName
UnitPrice
ve alanları dışında ProductName
tüm alanları kaldırın ve Discontinued
ilk üç alanın özelliklerini sırasıyla Product, Category ve Price olarak yeniden adlandırınHeaderText
. Son olarak, GridView'un akıllı etiketinde Sayfalandırmayı Etkinleştir ve Sıralamayı Etkinleştir onay kutularını işaretleyin.
Bu noktada GridView'da üç BoundField (ProductName
, CategoryName
ve UnitPrice
) ve bir CheckBoxField (Discontinued
) vardır. Bu dört alanı TemplateFields'e dönüştürmemiz ve ardından TemplateField'lerden EditItemTemplate
düzenleme arabirimini içine ItemTemplate
taşımamız gerekir.
Not
Veri Değiştirme Arabirimini Özelleştirme öğreticisinde TemplateFields oluşturma ve özelleştirmeyi keşfettik. BoundField'leri ve CheckBoxField'ı TemplateField'lere dönüştürme ve düzenleme arabirimlerini kendi arabirimlerinde tanımlama adımlarını ItemTemplate
inceleyeceğiz, ancak takılırsanız veya yenileyiciye ihtiyacınız olursa, bu önceki öğreticiye geri dönmekten çekinmeyin.
GridView'un akıllı etiketinde Sütunları Düzenle bağlantısına tıklayarak Alanlar iletişim kutusunu açın. Ardından, her alanı seçin ve Bu alanı TemplateField'e dönüştür bağlantısına tıklayın.
Şekil 5: Varolan BoundField'leri ve CheckBoxField'ı TemplateField'lara Dönüştürme
Artık her alan bir TemplateField olduğuna göre, düzenleme arabirimini s'den EditItemTemplate
s'ye taşımaya ItemTemplate
hazırız.
2. Adım: Arabirimleri OluşturmaProductName
UnitPrice
veDiscontinued
Düzenleme
ProductName
, UnitPrice
ve Discontinued
düzenleme arabirimlerinin oluşturulması bu adımın konusudur ve her arabirim TemplateField'de EditItemTemplate
zaten tanımlandığından oldukça basittir. Geçerli kategorilerin CategoryName
DropDownList'ini oluşturmamız gerektiğinden, düzenleme arabirimini oluşturmak biraz daha önemlidir. Bu CategoryName
düzenleme arabirimi 3. Adımda ele alınıyor.
TemplateField ile ProductName
başlayalım. GridView'un akıllı etiketinden Şablonları Düzenle bağlantısına tıklayın ve TemplateField'ın EditItemTemplate
öğesine gidinProductName
. TextBox'ı seçin, panoya kopyalayın ve templateField's ItemTemplate
öğesine yapıştırınProductName
. TextBox s ID
özelliğini olarak ProductName
değiştirin.
Ardından, kullanıcının her ürün adı için bir değer sağladığından emin olmak için öğesine bir RequiredFieldValidator ItemTemplate
ekleyin. ControlToValidate
özelliğini ProductName, özelliği ise ErrorMessage
Ürün adını Sağlamanız gerekir olarak ayarlayın. ve özelliği * olarak ayarlayın Text
. öğesine bu eklemeleri ItemTemplate
yaptıktan sonra ekranınız Şekil 6'ya benzer görünmelidir.
Şekil 6: ProductName
TemplateField Artık Bir TextBox ve RequiredFieldValidator Içeriyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Düzenleme arabirimi için UnitPrice
, TextBox'ı içinden EditItemTemplate
öğesine ItemTemplate
kopyalayarak başlayın. Ardından, TextBox'ın önüne bir $ yerleştirin ve özelliğini UnitPrice ve Columns
özelliğini 8 olarak ayarlayınID
.
Ayrıca, kullanıcı tarafından girilen değerin UnitPrice
ItemTemplate
0,00 TL'den büyük veya buna eşit geçerli bir para birimi değeri olduğundan emin olmak için değerlerine bir CompareValidator ekleyin. Doğrulayıcı ControlToValidate
özelliğini UnitPrice, ErrorMessage
özelliğini ise Geçerli bir para birimi değeri girmelisiniz olarak ayarlayın. Lütfen tüm para birimi simgelerini, özelliğini *, Type
özelliğini , özelliğini Currency
Operator
, özelliğini GreaterThanEqual
ve özelliğini 0 olarak atlayınValueToCompare
.Text
Şekil 7: Girilen Fiyatın Negatif Olmayan Bir Para Birimi Değeri Olduğundan Emin Olmak için CompareValidator Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Discontinued
TemplateField için içinde önceden tanımlanmış olan CheckBox'ını ItemTemplate
kullanabilirsiniz. Bunun için Süreksiz olarak, özelliğini ise olarak ayarlamanız ID
yeterlidir Enabled
True
.
3. Adım: Düzenleme ArabirimiNiCategoryName
Oluşturma
TemplateField EditItemTemplate
içindeki CategoryName
düzenleme arabirimi, veri alanının değerini CategoryName
görüntüleyen bir TextBox içerir. Bunu olası kategorileri listeleyen bir DropDownList ile değiştirmeliyiz.
Not
Veri Değiştirme Arabirimini Özelleştirme öğreticisi, bir şablonu TextBox'ın aksine DropDownList içerecek şekilde özelleştirme konusunda daha kapsamlı ve eksiksiz bir tartışma içerir. Buradaki adımlar tamamlandıktan sonra ters olarak sunulur. DropDownList kategorilerini oluşturma ve yapılandırma konusunda daha ayrıntılı bir bakış için Veri Değiştirme Arabirimini Özelleştirme öğreticisine bakın.
Bir DropDownList öğesini Araç Kutusu'ndan TemplateField'in ItemTemplate
üzerine CategoryName
sürükleyin ve bunu ID
olarak Categories
ayarlayın. Bu noktada dropdownlists veri kaynağını genellikle akıllı etiketi aracılığıyla tanımlayıp yeni bir ObjectDataSource oluştururuz. Ancak, bu işlem içinde ItemTemplate
ObjectDataSource'ı ekler ve bu da her GridView satırı için bir ObjectDataSource örneği oluşturulmasına neden olur. Bunun yerine, GridView'un TemplateFields dışında ObjectDataSource'u oluşturalım. Şablonu düzenlemeyi sonlandırın ve Araç Kutusu'ndan ObjectDataSource'un altındaki ProductsDataSource
Tasarım Aracı sürükleyin. Yeni ObjectDataSource CategoriesDataSource
adını verin ve sınıfın CategoriesBLL
GetCategories
yöntemini kullanacak şekilde yapılandırın.
Şekil 8: ObjectDataSource'ı Sınıfı Kullanacak CategoriesBLL
Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 9: Yöntemi Kullanarak GetCategories
Kategori Verilerini Alma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu ObjectDataSource yalnızca verileri almak için kullanıldığından, UPDATE ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın. Sihirbazı tamamlamak için Son’a tıklayın.
Şekil 10: UPDATE ve DELETE Sekmelerindeki Drop-Down Listeler (Yok) olarak ayarlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sihirbazı tamamladıktan sonra, CategoriesDataSource
bildirim temelli işaretleme aşağıdaki gibi görünmelidir:
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>
CategoriesDataSource
Oluşturulan ve yapılandırılan ile TemplateField'e CategoryName
ItemTemplate
dönün ve DropDownList'in akıllı etiketinden Veri Kaynağı Seç bağlantısına tıklayın. Veri Kaynağı Yapılandırma sihirbazında, CategoriesDataSource
ilk açılan listeden seçeneği belirleyin ve görüntü için ve CategoryID
değer olarak kullanılmasını seçinCategoryName
.
Şekil 11: DropDownList öğesini öğesine CategoriesDataSource
bağlama (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu noktada Categories
DropDownList tüm kategorileri listeler, ancak henüz GridView satırına bağlı ürün için uygun kategoriyi otomatik olarak seçmez. Bunu başarmak için DropDownList değerlerini SelectedValue
ürünün CategoryID
değerine ayarlamamız Categories
gerekir. DropDownList'in akıllı etiketinden DataBindings'i Düzenle bağlantısına tıklayın ve şekil 12'de gösterildiği gibi özelliği veri alanıyla CategoryID
ilişkilendirinSelectedValue
.
Şekil 12: Ürün CategoryID
Değerini DropDownList s SelectedValue
Özelliğine Bağlama
Son bir sorun daha var: Üründe bir CategoryID
değer belirtilmemişse üzerindeki veri bağlama deyimi SelectedValue
bir özel durumla sonuçlanır. Bunun nedeni DropDownList öğesinin yalnızca kategorilere yönelik öğeler içermesi ve için veritabanı değeri olan ürünler için CategoryID
bir NULL
seçenek sunmamasıdır. Bunu düzeltmek için DropDownList s AppendDataBoundItems
özelliğini olarak True
ayarlayın ve DropDownList'e yeni bir öğe ekleyin ve Value
özelliği bildirim temelli söz diziminden atlayarak. Yani DropDownList bildirim temelli söz diziminin Categories
aşağıdaki gibi göründüğünden emin olun:
<asp:DropDownList ID="Categories" runat="server" AppendDataBoundItems="True"
DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'>
<asp:ListItem Value=">-- Select One --</asp:ListItem>
</asp:DropDownList>
-- Select One -- öğesinin <asp:ListItem Value="">
özniteliğinin Value
açıkça boş bir dizeye ayarlandığını unutmayın. Bu ek DropDownList öğesinin olayı işlemek NULL
için neden gerekli olduğu ve özelliğin boş bir dizeye atanma işleminin Value
neden gerekli olduğu hakkında daha ayrıntılı bir açıklama için Veri Değişikliği Arabirimini Özelleştirme öğreticisine geri bakın.
Not
Burada belirtilmesi gereken olası bir performans ve ölçeklenebilirlik sorunu vardır. Her satırın veri kaynağı olarak öğesini CategoriesDataSource
kullanan bir DropDownList öğesi olduğundan, sınıfın CategoriesBLL
GetCategories
yöntemi sayfa ziyareti başına n kez çağrılır; burada n , GridView'daki satır sayısıdır. Bu n çağrısı, GetCategories
veritabanında n sorguya neden olabilir. Döndürülen kategoriler istek başına önbellekte önbelleğe alınarak ya da SQL önbelleğe alma bağımlılığı kullanılarak Önbelleğe Alma Katmanı aracılığıyla veya çok kısa bir zamana bağlı süre sonu kullanılarak veritabanı üzerindeki bu etki daha az olabilir.
4. Adım: Düzenleme Arabirimini Tamamlama
İlerleme durumumuzu görüntülemek için duraklatmadan GridView şablonlarında bir dizi değişiklik yaptık. İlerleme durumumuzu bir tarayıcı üzerinden görüntülemek için biraz zaman ayırın. Şekil 13'ün gösterdiği gibi, her satır hücrenin düzenleme arabirimini içeren kullanılarak ItemTemplate
işlenir.
Şekil 13: Her GridView Satırı Düzenlenebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu noktada ilgilenmemiz gereken birkaç küçük biçimlendirme sorunu vardır. İlk olarak, değerin dört ondalık ayırıcı içerdiğini UnitPrice
unutmayın. Bunu düzeltmek için TemplateField'a UnitPrice
ItemTemplate
dönün ve TextBox'ın akıllı etiketinden DataBindings'i Düzenle bağlantısına tıklayın. Ardından özelliğin Text
sayı olarak biçimlendirilmesi gerektiğini belirtin.
Şekil 14: Özelliği Sayı Olarak Biçimlendirme Text
İkinci olarak, onay kutusunu sola hizalamak yerine sütunda Discontinued
ortalayalım. GridView akıllı etiketinden Sütunları Düzenle'ye tıklayın ve sol alt köşedeki alan listesinden TemplateField'i seçin Discontinued
. Detaya gidin ItemStyle
ve Şekil 15'te gösterildiği gibi özelliği Ortala olarak ayarlayın HorizontalAlign
.
Şekil 15: Onay Kutusunu Ortalama Discontinued
Ardından, sayfaya bir ValidationSummary denetimi ekleyin ve özelliğini True
olarak ve ShowSummary
özelliğini olarak False
ayarlayınShowMessageBox
. Ayrıca tıklandığında kullanıcının değişikliklerini güncelleştirecek Düğme Web denetimlerini de ekleyin. Özellikle, biri GridView'un üstüne, diğeri de altına olmak üzere iki Düğme Web denetimi ekleyerek her iki denetim Text
özelliğini de Ürünleri Güncelleştir olarak ayarlayın.
GridView düzenleme arabirimi TemplateFields ItemTemplate
s içinde tanımlandığından EditItemTemplate
, bunlar gereksizdir ve silinebilir.
Yukarıda bahsedilen biçimlendirme değişikliklerini yaptıktan, Düğme denetimlerini ekledikten ve gereksiz EditItemTemplate
s'leri kaldırdıktan sonra sayfanızın bildirim temelli söz dizimi aşağıdaki gibi görünmelidir:
<p>
<asp:Button ID="UpdateAllProducts1" runat="server" Text="Update Products" />
</p>
<p>
<asp:GridView ID="ProductsGrid" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
AllowPaging="True" AllowSorting="True">
<Columns>
<asp:TemplateField HeaderText="Product" SortExpression="ProductName">
<ItemTemplate>
<asp:TextBox ID="ProductName" runat="server"
Text='<%# Bind("ProductName") %>'></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
ControlToValidate="ProductName"
ErrorMessage="You must provide the product's name."
runat="server">*</asp:RequiredFieldValidator>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Category"
SortExpression="CategoryName">
<ItemTemplate>
<asp:DropDownList ID="Categories" runat="server"
AppendDataBoundItems="True"
DataSourceID="CategoriesDataSource"
DataTextField="CategoryName"
DataValueField="CategoryID"
SelectedValue='<%# Bind("CategoryID") %>'>
<asp:ListItem>-- Select One --</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Price"
SortExpression="UnitPrice">
<ItemTemplate>
$<asp:TextBox ID="UnitPrice" runat="server" Columns="8"
Text='<%# Bind("UnitPrice", "{0:N}") %>'></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server"
ControlToValidate="UnitPrice"
ErrorMessage="You must enter a valid currency value.
Please omit any currency symbols."
Operator="GreaterThanEqual" Type="Currency"
ValueToCompare="0">*</asp:CompareValidator>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
<ItemTemplate>
<asp:CheckBox ID="Discontinued" runat="server"
Checked='<%# Bind("Discontinued") %>' />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
</Columns>
</asp:GridView>
</p>
<p>
<asp:Button ID="UpdateAllProducts2" runat="server" Text="Update Products" />
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>
<asp:ValidationSummary ID="ValidationSummary1" runat="server"
ShowMessageBox="True" ShowSummary="False" />
</p>
Şekil 16'da Düğme Web denetimleri eklendikten ve biçimlendirme değişiklikleri yapıldıktan sonra tarayıcı üzerinden görüntülendiğinde bu sayfa gösterilmektedir.
Şekil 16: Sayfa artık iki Güncelleştirme Ürünleri Düğmesi içeriyor (tam boyutlu görüntüyü görüntülemek için tıklayın)
5. Adım: Ürünleri Güncelleştirme
Bir kullanıcı bu sayfayı ziyaret ettiğinde değişikliklerini yapar ve ardından iki Ürünleri Güncelleştir düğmesinden birine tıklar. Bu noktada bir şekilde her satır için kullanıcı tarafından girilen değerleri bir ProductsDataTable
örneğe kaydetmemiz ve sonra bu örneği DAL UpdateWithTransaction
yöntemine geçirecek bir BLL yöntemine geçirmemiz ProductsDataTable
gerekir. Önceki UpdateWithTransaction
öğreticide oluşturduğumuz yöntemi, değişiklikler toplu işleminin atomik bir işlem olarak güncelleştirilmesini sağlar.
içinde BatchUpdate.aspx.vb
adlı BatchUpdate
bir yöntem oluşturun ve aşağıdaki kodu ekleyin:
Private Sub BatchUpdate()
' Enumerate the GridView's Rows collection and create a ProductRow
Dim productsAPI As New ProductsBLL()
Dim products As Northwind.ProductsDataTable = productsAPI.GetProducts()
For Each gvRow As GridViewRow In ProductsGrid.Rows
' Find the ProductsRow instance in products that maps to gvRow
Dim productID As Integer = _
Convert.ToInt32(ProductsGrid.DataKeys(gvRow.RowIndex).Value)
Dim product As Northwind.ProductsRow = products.FindByProductID(productID)
If product IsNot Nothing Then
' Programmatically access the form field elements in the
' current GridViewRow
Dim productName As TextBox = _
CType(gvRow.FindControl("ProductName"), TextBox)
Dim categories As DropDownList = _
CType(gvRow.FindControl("Categories"), DropDownList)
Dim unitPrice As TextBox = _
CType(gvRow.FindControl("UnitPrice"), TextBox)
Dim discontinued As CheckBox = _
CType(gvRow.FindControl("Discontinued"), CheckBox)
' Assign the user-entered values to the current ProductRow
product.ProductName = productName.Text.Trim()
If categories.SelectedIndex = 0 Then
product.SetCategoryIDNull()
Else
product.CategoryID = Convert.ToInt32(categories.SelectedValue)
End If
If unitPrice.Text.Trim().Length = 0 Then
product.SetUnitPriceNull()
Else
product.UnitPrice = Convert.ToDecimal(unitPrice.Text)
End If
product.Discontinued = discontinued.Checked
End If
Next
' Now have the BLL update the products data using a transaction
productsAPI.UpdateWithTransaction(products)
End Sub
Bu yöntem, BLL s GetProducts
yöntemine yapılan bir çağrı aracılığıyla tüm ürünleri bir ProductsDataTable
içinde geri alarak başlar. Ardından GridView koleksiyonunuRows
numaralandırırProductGrid
. Koleksiyon, Rows
GridView'da görüntülenen her satır için bir GridViewRow
örnek içerir. Sayfa başına en fazla on satır gösterdiğimiz için GridView Rows
koleksiyonunda en fazla on öğe olacaktır.
Her satır ProductID
için koleksiyonundan DataKeys
alınıp uygun ProductsRow
olan öğesinden ProductsDataTable
seçilir. Dört TemplateField giriş denetimine program aracılığıyla başvurulur ve değerleri örnek özelliklerine ProductsRow
atanır. Her GridView satırının değerleri değerini güncelleştirmek ProductsDataTable
için kullanıldıktan sonra, önceki öğreticide gördüğümüz gibi DAL UpdateWithTransaction
s yöntemine çağrı yapan BLL UpdateWithTransaction
s yöntemine geçirilir.
Bu öğretici için kullanılan toplu güncelleştirme algoritması, ürün bilgilerinin değiştirilip değiştirilmediğine bakılmaksızın GridView'daki bir satıra karşılık gelen her ProductsDataTable
satırı güncelleştirir. Bu tür kör güncelleştirmeler genellikle bir performans sorunu olmasa da, veritabanı tablosundaki değişiklikleri denetlediğinizde gereksiz kayıtlara yol açabilir. Batch gerçekleştirme Güncelleştirmeler öğreticisine geri dönerek DataList ile toplu güncelleştirme arabirimini keşfettik ve yalnızca kullanıcı tarafından değiştirilen kayıtları güncelleştiren kod ekledik. İsterseniz bu öğreticideki kodu güncelleştirmek için Batch Güncelleştirmeler Gerçekleştirme tekniklerini kullanabilirsiniz.
Not
Veri kaynağını akıllı etiketi aracılığıyla GridView'a bağlarken, Visual Studio otomatik olarak veri kaynağının birincil anahtar değerlerini GridView s DataKeyNames
özelliğine atar. 1. Adımda açıklandığı gibi GridView akıllı etiketi aracılığıyla ObjectDataSource'ı GridView'a bağlamadıysanız, koleksiyondaki DataKeys
her satırın değerine erişmek ProductID
için GridView s DataKeyNames
özelliğini ProductID olarak el ile ayarlamanız gerekir.
içinde BatchUpdate
kullanılan kod, BLL yöntemlerinde UpdateProduct
kullanılan koda benzer; temel fark, yöntemlerde UpdateProduct
mimariden yalnızca tek ProductRow
bir örneğin alınmasıdır. 'nin ProductRow
özelliklerini atayan kod, yöntemleriyle içindeki döngüdeki BatchUpdate
kod For Each
arasında UpdateProducts
aynıdır ve genel desende olduğu gibi.
Bu öğreticiyi BatchUpdate
tamamlamak için, Ürünleri Güncelleştir düğmelerine tıklandığında yönteminin çağrılmış olması gerekir. Bu iki Düğme denetiminin Click
olayları için olay işleyicileri oluşturun ve olay işleyicilerine aşağıdaki kodu ekleyin:
BatchUpdate()
ClientScript.RegisterStartupScript(Me.GetType(), "message", _
"alert('The products have been updated.');", True)
İlk olarak öğesine BatchUpdate
bir çağrı yapılır. Ardından özelliği, ClientScript
Ürünler güncelleştirildi yazan bir ileti kutusu görüntüleyen JavaScript eklemek için kullanılır.
Bu kodu test etmek için bir dakika bekleyin. Tarayıcı üzerinden ziyaret edin BatchUpdate.aspx
, bir dizi satırı düzenleyin ve Ürünleri Güncelleştir düğmelerinden birine tıklayın. Giriş doğrulama hatası olmadığını varsayarsak, Ürünler güncelleştirildi yazan bir ileti kutusu görmeniz gerekir. Güncelleştirmenin bölünmezliğini doğrulamak için, 1234,56 değerlerini engelleyen UnitPrice
bir kısıtlama gibi rastgele CHECK
bir kısıtlama eklemeyi göz önünde bulundurun. Ardından dosyasından BatchUpdate.aspx
bir dizi kaydı düzenleyerek ürünün UnitPrice
değerinden birini yasak değerine ( 1234,56) ayarladığınızdan emin olun. Bu, toplu işlem sırasında diğer değişikliklerle Birlikte Ürünleri Güncelleştir'e tıklandığında özgün değerlerine geri alınırken bir hatayla sonuçlanmalıdır.
AlternatifBatchUpdate
Yöntem
Az BatchUpdate
önce incelediğimiz yöntem BLL s GetProducts
yönteminden tüm ürünleri alır ve ardından yalnızca GridView'da görünen kayıtları güncelleştirir. GridView sayfalama kullanmıyorsa, ancak kullanıyorsa yüzlerce, binlerce veya on binlerce ürün olabilir, ancak GridView'da yalnızca on satır olabilir. Böyle bir durumda, tüm ürünleri veritabanından yalnızca 10 tanesini değiştirmek için almak idealden daha azdır.
Bu tür durumlar için bunun yerine aşağıdaki BatchUpdateAlternate
yöntemi kullanmayı göz önünde bulundurun:
Private Sub BatchUpdateAlternate()
' Enumerate the GridView's Rows collection and create a ProductRow
Dim productsAPI As New ProductsBLL()
Dim products As New Northwind.ProductsDataTable()
For Each gvRow As GridViewRow In ProductsGrid.Rows
' Create a new ProductRow instance
Dim productID As Integer = _
Convert.ToInt32(ProductsGrid.DataKeys(gvRow.RowIndex).Value)
Dim currentProductDataTable As Northwind.ProductsDataTable = _
productsAPI.GetProductByProductID(productID)
If currentProductDataTable.Rows.Count > 0 Then
Dim product As Northwind.ProductsRow = currentProductDataTable(0)
Dim productName As TextBox = _
CType(gvRow.FindControl("ProductName"), TextBox)
Dim categories As DropDownList = _
CType(gvRow.FindControl("Categories"), DropDownList)
Dim unitPrice As TextBox = _
CType(gvRow.FindControl("UnitPrice"), TextBox)
Dim discontinued As CheckBox = _
CType(gvRow.FindControl("Discontinued"), CheckBox)
' Assign the user-entered values to the current ProductRow
product.ProductName = productName.Text.Trim()
If categories.SelectedIndex = 0 Then
product.SetCategoryIDNull()
Else
product.CategoryID = Convert.ToInt32(categories.SelectedValue)
End If
If unitPrice.Text.Trim().Length = 0 Then
product.SetUnitPriceNull()
Else
product.UnitPrice = Convert.ToDecimal(unitPrice.Text)
End If
product.Discontinued = discontinued.Checked
' Import the ProductRow into the products DataTable
products.ImportRow(product)
End If
Next
' Now have the BLL update the products data using a transaction
productsAPI.UpdateProductsWithTransaction(products)
End Sub
BatchMethodAlternate
adlı products
yeni bir boş ProductsDataTable
oluşturarak başlar. Ardından GridView Rows
koleksiyonunda adım adım ilerler ve her satır için BLL s GetProductByProductID(productID)
yöntemini kullanarak belirli ürün bilgilerini alır. Alınan ProductsRow
örneğin özellikleri ile aynı şekilde BatchUpdate
güncelleştirilir, ancak satır güncelleştirildikten sonra DataTable yöntemiImportRow(DataRow)
aracılığıyla içine products
ProductsDataTable
aktarılır.
For Each
Döngü tamamlandıktan sonra GridView'daki products
her satır için bir ProductsRow
örnek içerir. Örneklerin ProductsRow
her biri öğesine eklendiğinden products
(güncelleştirilmek yerine), yöntemine ProductsTableAdapter
körü körüne UpdateWithTransaction
geçirirsek, kayıtların her birini veritabanına eklemeye çalışır. Bunun yerine, bu satırların her birinin değiştirildiğini (eklenmediğini) belirtmemiz gerekir.
Bu, BLL'ye adlı UpdateProductsWithTransaction
yeni bir yöntem eklenerek gerçekleştirilebilir. UpdateProductsWithTransaction
, aşağıda gösterildiği gibi içindeki her bir ProductsRow
örneğini Modified
ProductsDataTable
olarak ayarlar RowState
ve dal yöntemine UpdateWithTransaction
iletirProductsDataTable
.
Public Function UpdateProductsWithTransaction _
(ByVal products As Northwind.ProductsDataTable) As Integer
' Mark each product as Modified
products.AcceptChanges()
For Each product As Northwind.ProductsRow In products
product.SetModified()
Next
' Update the data via a transaction
Return UpdateWithTransaction(products)
End Function
Özet
GridView, satır başına yerleşik düzenleme özellikleri sağlar, ancak tamamen düzenlenebilir arabirimler oluşturma desteğine sahip değildir. Bu öğreticide gördüğümüz gibi, bu tür arabirimler mümkündür, ancak biraz çalışma gerektirir. Her satırın düzenlenebilir olduğu bir GridView oluşturmak için GridView alanlarını TemplateFields'e dönüştürmemiz ve s içinde ItemTemplate
düzenleme arabirimini tanımlamamız gerekir. Ayrıca, Tümünü Güncelleştir -tür Düğme Web denetimleri, GridView'dan ayrı olarak sayfaya eklenmelidir. Bu Düğmeler Click
olay işleyicilerinin GridView Rows
koleksiyonunu listelemesi, değişiklikleri içinde ProductsDataTable
depolaması ve güncelleştirilmiş bilgileri uygun BLL yöntemine geçirmesi gerekir.
Sonraki öğreticide toplu silme için bir arabirimin nasıl oluşturulacağını göreceğiz. Özellikle, her GridView satırı bir onay kutusu içerir ve Tümünü Güncelleştir tür düğmeleri yerine Seçili Satırları Sil düğmelerimiz olur.
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ışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.
Özel Teşekkürler
Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri Arasında Teresa Murphy ve David Suru vardı. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin