Toplu Güncelleştirmeler Gerçekleştirme (VB)
tarafından Scott Mitchell
Tüm öğelerinin düzenleme modunda olduğu ve sayfadaki "Tümünü Güncelleştir" düğmesine tıklayarak değerleri kaydedilebilen tam olarak düzenlenebilir bir DataList oluşturmayı öğrenin.
Giriş
Önceki öğreticide, öğe düzeyinde DataList oluşturmayı inceledik. Standart düzenlenebilir GridView gibi DataList'teki her öğe, tıklandığında öğeyi düzenlenebilir hale getiren bir Düzenle düğmesi içeriyordu. Bu öğe düzeyinde düzenleme yalnızca zaman zaman güncelleştirilen veriler için iyi çalışsa da, bazı kullanım örneği senaryoları kullanıcının birçok kaydı düzenlemesini gerektirir. Bir kullanıcının onlarca kaydı düzenlemesi gerekiyorsa ve Düzenle'ye tıklamaya, değişikliklerini yapmaya ve her biri için Güncelleştir'e tıklamaya zorlanırsa, tıklama miktarı üretkenliğini artırabilir. Böyle durumlarda, tüm öğelerinin düzenleme modunda olduğu ve değerleri sayfadaki Tümünü Güncelleştir düğmesine tıklayarak düzenlenebilen tam olarak düzenlenebilir bir DataList sağlamak daha iyi bir seçenektir (bkz. Şekil 1).
Şekil 1: Tamamen Düzenlenebilir Bir DataList'teki Her Öğe Değiştirilebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu öğreticide, kullanıcıların tamamen düzenlenebilir bir DataList kullanarak sağlayıcı adres bilgilerini güncelleştirmesini sağlamayı inceleyeceğiz.
1. Adım: DataList'in ItemTemplate öğesinde Düzenlenebilir Kullanıcı Arabirimi oluşturma
Standart, öğe düzeyinde düzenlenebilir bir DataList oluşturduğumuz önceki öğreticide iki şablon kullandık:
ItemTemplate
salt okunur kullanıcı arabirimini içeriyordu (her ürünün adını ve fiyatını görüntülemek için Etiket Web denetimleri).EditItemTemplate
düzenleme modu kullanıcı arabirimini (iki TextBox Web denetimi) içeriyordu.
DataList özelliğiEditItemIndex
, kullanılarak EditItemTemplate
nelerin DataListItem
(varsa) işlendiğini belirler. Özellikle değeri DataListItem
ItemIndex
DataList özelliğiyle EditItemIndex
eşleşen değeri kullanılarak EditItemTemplate
işlenir. Bu model, bir kerede yalnızca bir öğe düzenlenebildiğinde iyi çalışır, ancak tam olarak düzenlenebilir bir DataList oluşturulurken birbirinden ayrılır.
Tamamen düzenlenebilir bir DataList için, tüm sn'nin DataListItem
düzenlenebilir arabirim kullanılarak işlenmesini istiyoruz. Bunu yapmanın en basit yolu, içinde ItemTemplate
düzenlenebilir arabirimi tanımlamaktır. Sağlayıcı adres bilgilerini değiştirmek için düzenlenebilir arabirim, sağlayıcı adını metin olarak ve ardından adres, şehir ve ülke/bölge değerleri için TextBoxes'ı içerir.
Başlangıç olarak sayfayı BatchUpdate.aspx
açın, bir DataList denetimi ekleyin ve özelliğini olarak Suppliers
ayarlayınID
. DataList'in akıllı etiketinden adlı SuppliersDataSource
yeni bir ObjectDataSource denetimi eklemeyi tercih edin.
Şekil 2: Adlı SuppliersDataSource
Yeni Bir ObjectDataSource Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sınıfın yöntemini kullanarak SuppliersBLL
verileri almak için ObjectDataSource'ı GetSuppliers()
yapılandırın (bkz. Şekil 3). Yukarıdaki öğreticide olduğu gibi, ObjectDataSource aracılığıyla sağlayıcı bilgilerini güncelleştirmek yerine doğrudan İş Mantığı Katmanı ile çalışacağız. Bu nedenle, UPDATE sekmesinde açılan listeyi (Yok) olarak ayarlayın (bkz. Şekil 4).
Şekil 3: Yöntemini Kullanarak GetSuppliers()
Sağlayıcı Bilgilerini Alma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 4: GÜNCELLEŞTIR sekmesinde Drop-Down Listesi'ni (Yok) olarak ayarlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sihirbazı tamamladıktan sonra Visual Studio, veri kaynağı tarafından döndürülen her veri alanını bir Label Web denetiminde görüntülemek için DataList'leri ItemTemplate
otomatik olarak oluşturur. Bunun yerine düzenleme arabirimini sağlaması için bu şablonu değiştirmemiz gerekir. ItemTemplate
, DataList'in akıllı etiketindeki Şablonları Düzenle seçeneği kullanılarak veya doğrudan bildirim temelli söz dizimi aracılığıyla Tasarım Aracı özelleştirilebilir.
Sağlayıcının adını metin olarak görüntüleyen ancak sağlayıcının adresi, şehri ve ülke/bölge değerleri için TextBoxes içeren bir düzenleme arabirimi oluşturmak için biraz zaman ayırın. Bu değişiklikleri yaptıktan sonra sayfanızın bildirim temelli söz dizimi aşağıdakine benzer olmalıdır:
<asp:DataList ID="Suppliers" runat="server" DataKeyField="SupplierID"
DataSourceID="SuppliersDataSource">
<ItemTemplate>
<h4><asp:Label ID="CompanyNameLabel" runat="server"
Text='<%# Eval("CompanyName") %>' /></h4>
<table border="0">
<tr>
<td class="SupplierPropertyLabel">Address:</td>
<td class="SupplierPropertyValue">
<asp:TextBox ID="Address" runat="server"
Text='<%# Eval("Address") %>' />
</td>
</tr>
<tr>
<td class="SupplierPropertyLabel">City:</td>
<td class="SupplierPropertyValue">
<asp:TextBox ID="City" runat="server"
Text='<%# Eval("City") %>' />
</td>
</tr>
<tr>
<td class="SupplierPropertyLabel">Country:</td>
<td class="SupplierPropertyValue">
<asp:TextBox ID="Country" runat="server"
Text='<%# Eval("Country") %>' />
</td>
</tr>
</table>
<br />
</ItemTemplate>
</asp:DataList>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetSuppliers" TypeName="SuppliersBLL">
</asp:ObjectDataSource>
Not
Önceki öğreticide olduğu gibi, bu öğreticideki DataList'in görünüm durumunun etkinleştirilmiş olması gerekir.
içinde, sınıfına ItemTemplate
eklenmiş Styles.css
ve SupplierPropertyValue
ve CSS sınıflarıyla SupplierPropertyLabel
aynı stil ayarlarını ProductPropertyLabel
kullanacak şekilde yapılandırılmış olan ve ProductPropertyValue
olmak üzere iki yeni CSS sınıfı kullanıyorum.
.ProductPropertyLabel, .SupplierPropertyLabel
{
font-weight: bold;
text-align: right;
}
.ProductPropertyValue, .SupplierPropertyValue
{
padding-right: 35px;
}
Bu değişiklikleri yaptıktan sonra bu sayfayı bir tarayıcı üzerinden ziyaret edin. Şekil 5'te gösterildiği gibi, her DataList öğesi sağlayıcı adını metin olarak görüntüler ve adresi, şehri ve ülkeyi/bölgeyi görüntülemek için TextBoxes kullanır.
Şekil 5: DataList'teki her Sağlayıcı Düzenlenebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
2. Adım: Tümünü Güncelleştir Düğmesi Ekleme
Şekil 5'teki her sağlayıcının bir TextBox'ta görüntülenen adresi, şehri ve ülke/bölge alanları olsa da, şu anda Kullanılabilir Güncelleştir düğmesi yoktur. Öğe başına tamamen düzenlenebilir DataLists içeren bir Güncelleştir düğmesi yerine, sayfada genellikle tıklandığında DataList'teki tüm kayıtları güncelleştiren tek bir Tümünü Güncelleştir düğmesi bulunur. Bu öğretici için, biri sayfanın üst kısmında, diğeri altta olmak üzere iki Tümünü Güncelleştir düğmesi ekleyelim (her iki düğmeye tıklanması da aynı etkiye sahip olacaktır).
DataList'in üzerine bir Button Web denetimi ekleyerek başlayın ve özelliğini olarak UpdateAll1
ayarlayınID
. Ardından, DataList öğesinin altına ikinci Button Web denetimini ekleyin ve bu ID
denetimi olarak UpdateAll2
ayarlayın. İki Düğmenin Text
özelliklerini Tümünü Güncelleştir olarak ayarlayın. Son olarak, her iki Düğme Click
olayı için de olay işleyicileri oluşturun. Olay işleyicilerinin her birinde güncelleştirme mantığını yinelemek yerine, olay işleyicilerinin yalnızca bu üçüncü yöntemi çağırmasını sağlamak için bu mantığı üçüncü bir yöntem UpdateAllSupplierAddresses
olarak yeniden düzenleyelim.
Protected Sub UpdateAll1_Click(sender As Object, e As EventArgs) _
Handles UpdateAll1.Click
UpdateAllSupplierAddresses()
End Sub
Protected Sub UpdateAll2_Click(sender As Object, e As EventArgs) _
Handles UpdateAll2.Click
UpdateAllSupplierAddresses()
End Sub
Private Sub UpdateAllSupplierAddresses()
' TODO: Write code to update _all_ of the supplier addresses in the DataList
End Sub
Şekil 6'da Tümünü Güncelleştir düğmeleri eklendikten sonraki sayfa gösterilmektedir.
Şekil 6: Sayfaya İki Tümünü Güncelleştir Düğmesi Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
3. Adım: Tüm Sağlayıcıların Adres Bilgilerini Güncelleştirme
DataList öğelerinin tümü düzenleme arabirimini görüntülerken ve Tümünü Güncelleştir düğmelerinin eklenmesiyle, geriye kalan tek şey toplu güncelleştirmeyi gerçekleştirmek için kodu yazmaktır. Özellikle DataList öğeleri arasında döngü yapmamız ve her biri için sınıfın SuppliersBLL
UpdateSupplierAddress
yöntemini çağırmamız gerekir.
DataList'i DataListItem
makyajlayan örneklerin koleksiyonuna DataList'inItems
özelliği aracılığıyla erişilebilir. bir DataListItem
başvurusuyla, koleksiyondan DataKeys
karşılık geleni SupplierID
alabilir ve aşağıdaki kodda gösterildiği gibi içindeki ItemTemplate
TextBox Web denetimlerine program aracılığıyla başvurabiliriz:
Private Sub UpdateAllSupplierAddresses()
' Create an instance of the SuppliersBLL class
Dim suppliersAPI As New SuppliersBLL()
' Iterate through the DataList's items
For Each item As DataListItem In Suppliers.Items
' Get the supplierID from the DataKeys collection
Dim supplierID As Integer = Convert.ToInt32(Suppliers.DataKeys(item.ItemIndex))
' Read in the user-entered values
Dim address As TextBox = CType(item.FindControl("Address"), TextBox)
Dim city As TextBox = CType(item.FindControl("City"), TextBox)
Dim country As TextBox = CType(item.FindControl("Country"), TextBox)
Dim addressValue As String = Nothing, _
cityValue As String = Nothing, _
countryValue As String = Nothing
If address.Text.Trim().Length > 0 Then
addressValue = address.Text.Trim()
End If
If city.Text.Trim().Length > 0 Then
cityValue = city.Text.Trim()
End If
If country.Text.Trim().Length > 0 Then
countryValue = country.Text.Trim()
End If
' Call the SuppliersBLL class's UpdateSupplierAddress method
suppliersAPI.UpdateSupplierAddress _
(supplierID, addressValue, cityValue, countryValue)
Next
End Sub
Kullanıcı Tümünü Güncelleştir düğmelerinden birine tıkladığında, UpdateAllSupplierAddresses
yöntem DataList içindeki Suppliers
her DataListItem
biri arasında yinelenir ve sınıfın SuppliersBLL
UpdateSupplierAddress
yöntemini çağırarak ilgili değerleri geçirir. Adres, şehir veya ülke/bölge geçişleri için girilmeyen bir değer, değerinin Nothing
UpdateSupplierAddress
değeridir (boş dize yerine), temel alınan kaydın alanları için bir veritabanı NULL
elde edilir.
Not
Bir geliştirme olarak, toplu güncelleştirme gerçekleştirildikten sonra sayfaya bir onay iletisi sağlayan bir durum Etiketi Web denetimi eklemek isteyebilirsiniz.
Yalnızca Değiştirilmiş Olan Adresleri Güncelleştirme
Bu öğretici için kullanılan toplu güncelleştirme algoritması, adres bilgilerinin değiştirilip değiştirilmediğine bakılmaksızın DataList'teki her sağlayıcı için yöntemini çağırırUpdateSupplierAddress
. 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. Örneğin, bir denetim tablosuna tabloya Suppliers
tüm UPDATE
kayıtları kaydetmek için tetikleyiciler kullanırsanız, bir kullanıcı Tümünü Güncelleştir düğmesine her tıkladığınızda, kullanıcının herhangi bir değişiklik yapıp yapmadığına bakılmaksızın sistemdeki her sağlayıcı için yeni bir denetim kaydı oluşturulur.
ADO.NET DataTable ve DataAdapter sınıfları yalnızca değiştirilen, silinen ve yeni kayıtların herhangi bir veritabanı iletişimine neden olduğu toplu güncelleştirmeleri destekleyecek şekilde tasarlanmıştır. DataTable'daki her satır, satırın DataTable'a eklenip eklenmediğini, bu satırdan silindiğini, değiştirildiğini veya değişmeden kaldığını belirten bir RowState
özelliğe sahiptir. DataTable başlangıçta doldurulduğunda, tüm satırlar değiştirilmeden işaretlenir. Satır sütunlarından herhangi birinin değerinin değiştirilmesi, satırı değiştirilmiş olarak işaretler.
SuppliersBLL
sınıfında, belirtilen sağlayıcının adres bilgilerini güncelleştirmek için önce tek sağlayıcı kaydında öğesini SuppliersDataTable
okuyup ardından aşağıdaki kodu kullanarak , City
ve Country
sütun değerlerini ayarlayacağızAddress
:
Public Function UpdateSupplierAddress _
(supplierID As Integer, address As String, city As String, country As String) _
As Boolean
Dim suppliers As Northwind.SuppliersDataTable = _
Adapter.GetSupplierBySupplierID(supplierID)
If suppliers.Count = 0 Then
' no matching record found, return false
Return False
Else
Dim supplier As Northwind.SuppliersRow = suppliers(0)
If address Is Nothing Then
supplier.SetAddressNull()
Else
supplier.Address = address
End If
If city Is Nothing Then
supplier.SetCityNull()
Else
supplier.City = city
End If
If country Is Nothing Then
supplier.SetCountryNull()
Else
supplier.Country = country
End If
' Update the supplier Address-related information
Dim rowsAffected As Integer = Adapter.Update(supplier)
' Return true if precisely one row was updated, otherwise false
Return rowsAffected = 1
End If
End Function
Bu kod, değerlerin değişip değişmediğine bakılmaksızın içindeki öğesine geçirilen adres, şehir ve ülke/bölge değerlerini SuppliersRow
SuppliersDataTable
atayın. Bu değişiklikler s RowState
özelliğinin SuppliersRow
değiştirilmiş olarak işaretlenmesine neden olur. Veri Erişim Katmanı Update
yöntemi çağrıldığında, öğesinin SupplierRow
değiştirildiğini görür ve bu nedenle veritabanına bir UPDATE
komut gönderir.
Öte yandan, bu yönteme geçirilen adres, şehir ve ülke/bölge değerlerini yalnızca var olan değerlerden SuppliersRow
farklıysa atamak için kod eklediğimizi düşünün. Adresin, şehrin ve ülkenin/bölgenin mevcut veriyle aynı olması durumunda hiçbir değişiklik yapılmaz ve SupplierRow
bunlar RowState
değişmemiş olarak işaretlenir. Net sonuç, DAL Update
yöntemi çağrıldığında değiştirilmediğinden veritabanı çağrısı yapılmamasıdır SuppliersRow
.
Bu değişikliği uygulamak için, geçirilen adres, şehir ve ülke/bölge değerlerini körü körüne atayan deyimlerini aşağıdaki kodla değiştirin:
' Only assign the values to the SupplierRow's column values if they differ
If address Is Nothing AndAlso Not supplier.IsAddressNull() Then
supplier.SetAddressNull()
ElseIf (address IsNot Nothing AndAlso supplier.IsAddressNull) _
OrElse (Not supplier.IsAddressNull() AndAlso _
String.Compare(supplier.Address, address) <> 0) Then
supplier.Address = address
End If
If city Is Nothing AndAlso Not supplier.IsCityNull() Then
supplier.SetCityNull()
ElseIf (city IsNot Nothing AndAlso supplier.IsCityNull) _
OrElse (Not supplier.IsCityNull() AndAlso _
String.Compare(supplier.City, city) <> 0) Then
supplier.City = city
End If
If country Is Nothing AndAlso Not supplier.IsCountryNull() Then
supplier.SetCountryNull()
ElseIf (country IsNot Nothing AndAlso supplier.IsCountryNull) _
OrElse (Not supplier.IsCountryNull() AndAlso _
String.Compare(supplier.Country, country) <> 0) Then
supplier.Country = country
End If
Bu eklenen kodla, DAL Update
yöntemi veritabanına yalnızca adresle ilgili değerleri değiştirilmiş olan kayıtlar için bir UPDATE
deyim gönderir.
Alternatif olarak, geçirilen adres alanlarıyla veritabanı verileri arasında herhangi bir fark olup olmadığını izleyebilir ve yoksa DAL Update
yöntemine yapılan çağrıyı atlayabiliriz. Veritabanı doğrudan yöntemini kullanıyorsanız, veritabanı doğrudan yöntemi bir veritabanı çağrısının gerçekten gerekli olup olmadığını belirlemek için denetlenebilen bir SuppliersRow
örneğe RowState
geçirilmediği için bu yaklaşım iyi çalışır.
Not
UpdateSupplierAddress
Yöntem her çağrıldığında, güncelleştirilmiş kayıt hakkındaki bilgileri almak için veritabanına bir çağrı yapılır. Ardından, verilerde herhangi bir değişiklik olursa, tablo satırını güncelleştirmek için veritabanına başka bir çağrı yapılır. Bu iş akışı, sayfadaki tüm değişiklikleri BatchUpdate.aspx
içeren bir UpdateSupplierAddress
örneği kabul eden bir EmployeesDataTable
yöntem aşırı yüklemesi oluşturularak iyileştirilebilir. Ardından, tablodaki tüm kayıtları Suppliers
almak için veritabanına tek bir çağrı yapabilir. Daha sonra iki sonuç kümesinin listesi oluşturulabilir ve yalnızca değişikliklerin gerçekleştiği kayıtlar güncelleştirilebilir.
Özet
Bu öğreticide, kullanıcının birden çok sağlayıcının adres bilgilerini hızlı bir şekilde değiştirmesine olanak sağlayan, tam olarak düzenlenebilir bir DataList oluşturmayı gördük. DataList'in ItemTemplate
içindeki sağlayıcı adresi, şehir ve ülke/bölge değerleri için bir TextBox Web denetimi düzenleme arabirimi tanımlayarak başladık. Ardından DataList'in üstüne ve altına Tümünü Güncelleştir düğmelerini ekledik. Bir kullanıcı değişiklik yaptıktan ve Tümünü Güncelleştir düğmelerinden birine tıkladıktan sonra, DataListItem
s numaralandırılır ve sınıfın SuppliersBLL
UpdateSupplierAddress
yöntemine bir çağrı yapılır.
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 Zack Jones ve Ken Pespisa'ydı. 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