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
Tek bir işleme birden çok veritabanı kaydı eklemeyi öğrenin. Kullanıcı Arabirimi Katmanı'nda, kullanıcının birden çok yeni kayıt girmesini sağlamak için GridView'ı genişletiriz. Veri Erişim Katmanı'nda, bir işlem içinde birden fazla ekleme işlemini sarmalarız, böylece tüm eklemeler ya başarılı olur ya da geri alınır.
Giriş
Toplu Güncelleştirme öğreticisinde, birden çok kaydın düzenlenebilir olduğu bir arabirim sunmak için GridView denetimini özelleştirmeyi inceledik. Sayfayı ziyaret eden kullanıcı bir dizi değişiklik yapabilir ve ardından tek bir düğme tıklamasıyla toplu güncelleştirme gerçekleştirebilir. Kullanıcıların tek seferde sık sık birçok kaydı güncelleştirdiği durumlarda, böyle bir arabirim, Veri Ekleme, Güncelleştirme ve Silmeye Genel Bakış öğreticisinde ilk kez keşfedilen varsayılan satır başına düzenleme özellikleriyle karşılaştırıldığında sayısız tıklamayı ve klavyeden fareye bağlam geçişini kaydedebilir.
Bu kavram, kayıt eklenirken de uygulanabilir. Burada Northwind Traders'da genellikle belirli bir kategori için bir dizi ürün içeren tedarikçilerden gönderiler aldığımızı düşünün. Örneğin, Tokyo Traders'dan altı farklı çay ve kahve ürününün sevkiyatını alacağız. Bir kullanıcı detailsView denetimi aracılığıyla altı ürünü birer birer girerse, aynı değerlerin birçoğunun tekrar tekrar seçilmesi gerekir: aynı kategoriyi (İçecekler), aynı tedarikçiyi (Tokyo Traders), aynı sona erdirilen değeri (False) ve sipariş değeri (0) üzerinde aynı birimleri seçmesi gerekir. Bu yinelenen veri girişi yalnızca zaman almakla kalmaz, hatalara da açıktır.
Küçük bir çalışmayla, kullanıcının sağlayıcıyı ve kategoriyi bir kez seçmesini, bir dizi ürün adını ve birim fiyatı girmesini ve ardından yeni ürünleri veritabanına eklemek için bir düğmeye tıklamasını sağlayan bir toplu ekleme arabirimi oluşturabiliriz (bkz. Şekil 1). Her ürün eklendikçe, ProductName
ve UnitPrice
veri alanlarına TextBoxes'a girilen değerler atanırken CategoryID
, ve SupplierID
değerleri formun en üstündeki DropDownLists'ten değerlere atanır.
Discontinued
ve UnitsOnOrder
değerleri sırasıyla false
ve 0 sabit kodlanmış değerlerine ayarlanır.
Şekil 1: Toplu Ekleme Arabirimi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu öğreticide, Şekil 1'de gösterilen toplu ekleme arabirimini uygulayan bir sayfa oluşturacağız. Önceki iki öğreticide olduğu gibi, eklemeleri bölünmezlik sağlamak için bir işlem kapsamına alacağız. Haydi başlayalım!
1. Adım: Görüntü Arabirimi Oluşturma
Bu kılavuz, iki bölgeye ayrılmış tek bir sayfadan oluşur: görüntüleme bölgesi ve ekleme bölgesi. Bu adımda oluşturacağımız görüntü arabirimi, GridView'daki ürünleri gösterir ve Ürün Sevkiyatını İşle başlıklı bir düğme içerir. Bu düğmeye tıklandığında, görüntü arabirimi Şekil 1'de gösterilen ekleme arabirimiyle değiştirilir. Görüntü arabirimi, Sevkiyattan Ürün Ekle veya İptal et düğmelerine tıklandıktan sonra geri döner. 2. Adımda ekleme arabirimini oluşturacağız.
Bir kerede yalnızca biri görünür olmak üzere iki arabirimi olan bir sayfa oluştururken, her arabirim genellikle diğer denetimler için kapsayıcı görevi gören bir Panel Web denetimine yerleştirilir. Bu nedenle, sayfamızda her arabirim için bir tane olmak üzere iki Panel denetimi olacaktır.
Öncelikle, BatchInsert.aspx
klasöründeki BatchData
sayfasını açın ve Araç Kutusu'ndan Tasarımcı'ya bir Panel sürükleyin (Şekil 2'ye bakın). Panel s ID
özelliğini olarak DisplayInterface
ayarlayın. Panel Tasarımcıya eklenirken ve Height
Width
özellikleri sırasıyla 50px ve 125px olarak ayarlanır. Özellikler penceresinden bu özellik değerlerini temizleyin.
Şekil 2: Araç Kutusundan Bir Paneli Tasarımcıya Sürükleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ardından, Düğme ve GridView denetimini Panel'e sürükleyin. Button ID
özelliğini ProcessShipment
ve Text
özelliğini Ürün Sevkiyatını İşleme olarak ayarlayın. GridView s ID
özelliğini ProductsGrid
akıllı etiketinden ve olarak ayarlayın, bunu adlı ProductsDataSource
yeni bir ObjectDataSource'a bağlayın. ObjectDataSource'u verilerini ProductsBLL
sınıfının GetProducts
yönteminden çekecek şekilde yapılandırın. Bu GridView yalnızca verileri görüntülemek için kullanıldığından, UPDATE, INSERT ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın. Veri Kaynağını Yapılandırma sihirbazını tamamlamak için Son'a tıklayın.
Şekil 3: Sınıf ProductsBLL
'in GetProducts
Yönteminden Döndürülen Verileri Görüntüleme (Tam boyutlu görüntüyü görmek için tıklayın)
Şekil 4: UPDATE, INSERT ve DELETE Sekmelerindeki Drop-Down Listelerini (Yok) olarak ayarlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
ObjectDataSource sihirbazını tamamladıktan sonra Visual Studio, ürün veri alanları için BoundFields ve CheckBoxField ekler.
ProductName
ve CategoryName
, SupplierName
, UnitPrice
, Discontinued
alanları dışındaki tüm alanları kaldırın. Estetik özelleştirmeler yapmaktan çekinmeyin. Alanı para birimi değeri olarak biçimlendirmeye UnitPrice
karar verdim, alanları yeniden sıraladım ve alan HeaderText
değerlerinin birkaçını yeniden adlandırdım. Ayrıca GridView akıllı etiketindeki Sayfalama etkinleştir ve Sıralamayı Etkinleştir onay kutularını işaretleyerek GridView'ı sayfalama ve sıralama desteği içerecek şekilde yapılandırın.
Panel, Button, GridView ve ObjectDataSource denetimlerini ekledikten ve GridView alanlarını özelleştirdikten sonra sayfanızın bildirim temelli işaretlemesi aşağıdakine benzer görünmelidir:
<asp:Panel ID="DisplayInterface" runat="server">
<p>
<asp:Button ID="ProcessShipment" runat="server"
Text="Process Product Shipment" />
</p>
<asp:GridView ID="ProductsGrid" runat="server" AllowPaging="True"
AllowSorting="True" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource">
<Columns>
<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="UnitPrice" DataFormatString="{0:c}"
HeaderText="Price" HtmlEncode="False"
SortExpression="UnitPrice">
<ItemStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued">
<ItemStyle HorizontalAlign="Center" />
</asp:CheckBoxField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>
</asp:Panel>
Düğme ve GridView işaretlemesinin açılış ve kapanış <asp:Panel>
etiketlerinin içinde göründüğünü unutmayın. Bu denetimler Panel içinde DisplayInterface
olduğundan, Panel s Visible
özelliğini false
olarak ayarlayarak bunları gizleyebiliriz. 3. adım, bir arabirimi diğerini gizlerken göstermek için bir düğmeye tıklamaya yanıt olarak Panel'in Visible
özelliğini program aracılığıyla değiştirmeye odaklanır.
İlerleme durumumuzu bir tarayıcı üzerinden görüntülemek için biraz zaman ayırın. Şekil 5'te gösterildiği gibi, GridView üzerinde ürünleri bir kerede on kez listeleyen bir Ürün Sevkiyatını İşle düğmesini görmeniz gerekir.
Şekil 5: GridView Ürünleri ve Teklifleri Sıralama ve Sayfalama Özelliklerini Listeler (Tam boyutlu görüntüyü görüntülemek için tıklayın)
2. Adım: Ekleme ArabirimiNi Oluşturma
Görüntüleme arabirimi tamamlandıktan sonra ekleme arabirimini oluşturmaya hazırız. Bu öğreticide, tek bir sağlayıcı ve kategori değeri isteyen ve ardından kullanıcının en fazla beş ürün adı ve birim fiyat değeri girmesine izin veren bir ekleme arabirimi oluşturalım. Bu arabirimle, kullanıcı aynı kategoriyi ve tedarikçiyi paylaşan ancak benzersiz ürün adları ve fiyatları olan beş yeni ürüne bir tane ekleyebilir.
Araç Kutusundan Tasarımcı'ya bir Panel sürükleyip mevcut DisplayInterface
Panelin altına yerleştirerek başlayın. Bu yeni eklenen Panel'in ID
özelliğini InsertingInterface
olarak ve Visible
özelliğini false
olarak ayarlayın. 3. Adımda Panel InsertingInterface
özelliğini Visible
olarak ayarlayan true
kod ekleyeceğiz. Ayrıca Panel s Height
ve Width
özellik değerlerini temizleyin.
Ardından, Şekil 1'de gösterilen ekleme arabirimini oluşturmamız gerekir. Bu arabirim çeşitli HTML teknikleri aracılığıyla oluşturulabilir, ancak oldukça basit bir tane kullanacağız: dört sütunlu, yedi satırlı bir tablo.
Uyarı
HTML <table>
öğeleri için işaretleme girerken Kaynak görünümünü kullanmayı tercih ediyorum. Visual Studio'da, Tasarımcı aracılığıyla <table>
öğeleri eklemek için araçlar olsa da Tasarımcı, style
ayarlarını işaretlemeye istenmeyen bir şekilde eklemek için çok istekli görünüyor. İşaretlemeyi <table>
oluşturduktan sonra genellikle Tasarımcı'ya dönüp Web denetimlerini ekleyip özelliklerini ayarliyorum. Önceden belirlenmiş sütunlar ve satırlar içeren tablolar oluştururken Tablo Web denetimi yerine statik HTML kullanmayı tercih ediyorum çünkü Tablo Web denetimine yerleştirilen web denetimlerine yalnızca desen kullanılarak FindControl("controlID")
erişilebilir. Bununla birlikte, Tablo Web denetimi program aracılığıyla oluşturulabildiğinden, dinamik olarak boyutlandırılmış tablolar (satırları veya sütunları bazı veritabanı veya kullanıcı tarafından belirtilen ölçütleri temel alan tablolar) için Tablo Web denetimlerini kullanıyorum.
Panel etiketlerinin <asp:Panel>
içine aşağıdaki işaretlemeyi InsertingInterface
girin:
<table class="DataWebControlStyle" cellspacing="0">
<tr class="BatchInsertHeaderRow">
<td class="BatchInsertLabel">Supplier:</td>
<td></td>
<td class="BatchInsertLabel">Category:</td>
<td></td>
</tr>
<tr class="BatchInsertRow">
<td class="BatchInsertLabel">Product:</td>
<td></td>
<td class="BatchInsertLabel">Price:</td>
<td></td>
</tr>
<tr class="BatchInsertAlternatingRow">
<td class="BatchInsertLabel">Product:</td>
<td></td>
<td class="BatchInsertLabel">Price:</td>
<td></td>
</tr>
<tr class="BatchInsertRow">
<td class="BatchInsertLabel">Product:</td>
<td></td>
<td class="BatchInsertLabel">Price:</td>
<td></td>
</tr>
<tr class="BatchInsertAlternatingRow">
<td class="BatchInsertLabel">Product:</td>
<td></td>
<td class="BatchInsertLabel">Price:</td>
<td></td>
</tr>
<tr class="BatchInsertRow">
<td class="BatchInsertLabel">Product:</td>
<td></td>
<td class="BatchInsertLabel">Price:</td>
<td></td>
</tr>
<tr class="BatchInsertFooterRow">
<td colspan="4">
</td>
</tr>
</table>
Bu <table>
işaretleme henüz herhangi bir Web denetimi içermiyor, bunları hemen ekleyeceğiz. Her <tr>
öğenin belirli bir CSS sınıf ayarı içerdiğini unutmayın: BatchInsertHeaderRow
tedarikçi ve kategori DropDownList'lerinin gideceği üst bilgi satırı için; BatchInsertFooterRow
sevkiyattan ürün ekleme ve iptal düğmelerinin gideceği alt bilgi satırı için; ve ürün ve birim fiyatı TextBox denetimlerini içerecek satırlar için değişen BatchInsertRow
ve BatchInsertAlternatingRow
değerler. Bu öğreticilerde Styles.css
dosyasında kullandığımız GridView ve DetailsView denetimlerine benzer bir görünüm kazandırmak için ekleme arayüzünde ilgili CSS sınıflarını oluşturdum. Bu CSS sınıfları aşağıda gösterilmiştir.
/*** Styles for ~/BatchData/BatchInsert.aspx tutorial ***/
.BatchInsertLabel
{
font-weight: bold;
text-align: right;
}
.BatchInsertHeaderRow td
{
color: White;
background-color: #900;
padding: 11px;
}
.BatchInsertFooterRow td
{
text-align: center;
padding-top: 5px;
}
.BatchInsertRow
{
}
.BatchInsertAlternatingRow
{
background-color: #fcc;
}
Bu işaretleme girildiğinde Tasarım görünümüne dönün. Bu <table>
, Şekil 6'da gösterildiği gibi Tasarımcı'da dört sütunlu, yedi satırlık bir tablo olarak gösterilmelidir.
Şekil 6: Ekleme Arabirimi Dört Sütunlu Seven-Row Bir Tablodan Oluşur (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Artık Ekleme arabirimine Web denetimlerini eklemeye hazırız. Araç Kutusu'ndaki iki DropDownLists öğesini tablodaki uygun hücrelere sürükleyin. Biri sağlayıcı için, diğeri de kategori için.
Sağlayıcı DropDownList'in ID
özelliğini olarak Suppliers
ayarlayın ve adlı SuppliersDataSource
yeni bir ObjectDataSource'a bağlayın. Yeni ObjectDataSource'u, verilerini SuppliersBLL
sınıfı ve GetSuppliers
yöntemi aracılığıyla alacak şekilde yapılandırın ve UPDATE sekmesinin açılır listesini (Yok) olarak ayarlayın. Sihirbazı tamamlamak için Son'a tıklayın.
Şekil 7: ObjectDataSource'un SuppliersBLL
Sınıf Yöntemini Kullanacak Şekilde Yapılandırılması GetSuppliers
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
DropDownList öğesinin Suppliers
veri alanını görüntülemesini sağlayın ve CompanyName
veri alanını SupplierID
değerleri olarak kullanın.
Şekil 8: Veri Alanını Görüntüleme CompanyName
ve Değer Olarak Kullanma SupplierID
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
İkinci DropDownList Categories
adını verin ve adlı CategoriesDataSource
yeni bir ObjectDataSource'a bağlayın.
CategoriesDataSource
ObjectDataSource'u CategoriesBLL
sınıfının GetCategories
yöntemini kullanacak şekilde yapılandırın; UPDATE ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın ve sihirbazı tamamlamak üzere Bitir'e tıklayın. Son olarak, DropDownList öğesinin CategoryName
veri alanını görüntülemesini ve CategoryID
öğesini değer olarak kullanmasını sağlayın.
Bu iki DropDownList eklendikten ve uygun şekilde yapılandırılmış ObjectDataSources'a bağlandıktan sonra, ekranınız Şekil 9'a benzer görünmelidir.
Şekil 9: Üst Bilgi Satırı şimdi Suppliers
ve Categories
DropDownLists'i içeriyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şimdi her yeni ürünün adını ve fiyatını toplamak için TextBoxes oluşturmamız gerekiyor. Beş ürün adı ve fiyat satırının her biri için Bir TextBox denetimini Araç Kutusu'ndan Tasarımcı'ya sürükleyin.
ID
TextBox özelliklerini ProductName1
, UnitPrice1
, ProductName2
, UnitPrice2
, ProductName3
, UnitPrice3
ve benzerlerini ayarlayın.
Her birim fiyatı TextBox'una bir CompareValidator ekleyin ve ControlToValidate
özelliğini uygun olan ID
olarak ayarlayın. Ayrıca Operator
özelliğini GreaterThanEqual
olarak ayarlayın, ValueToCompare
sıfıra ve Type
özelliğini Currency
olarak ayarlayın. Bu ayarlar, bir fiyat girildiğinde CompareValidator'ın sıfırdan büyük veya sıfıra eşit geçerli bir para birimi değeri olduğundan emin olmasını sağlar.
Text
özelliğini * olarak ayarlayın ve ErrorMessage
Fiyat sıfırdan büyük veya sıfıra eşit olmalıdır. Ayrıca, lütfen para birimi simgelerini atlayın.
Uyarı
Veritabanı tablosundaki alan ProductName
değerlere izin Products
vermese NULL
de, ekleme arabirimi herhangi bir RequiredFieldValidator denetimi içermez. Bunun nedeni, kullanıcının en fazla beş ürün girmesine izin vermek istememizdir. Örneğin, kullanıcı ilk üç satır için ürün adını ve birim fiyatı sağlayacaksa ve son iki satırı boş bıraksaydı, sisteme yalnızca üç yeni ürün eklerdik.
ProductName
Ancak gerekli olduğundan, birim fiyat girildiğinde ilgili ürün adı değerinin sağlandığından emin olmak için programlı olarak denetlememiz gerekir. Bu denetimi 4. Adımda ele alacağız.
Kullanıcı girişini doğrularken, değer bir para birimi simgesi içeriyorsa CompareValidator geçersiz verileri bildirir. Kullanıcıya fiyatı girerken para birimi simgesini atlaması talimatı vermek için her birim fiyat TextBox'ının önüne görsel bir ipucu olarak bir $ ekleyin.
Son olarak, Panel'e bir ValidationSummary denetimi ekleyin ve InsertingInterface
özelliğini ShowMessageBox
, true
özelliğini ve ShowSummary
özelliğini false
ayarlayın. Bu ayarlarla, kullanıcı geçersiz bir birim fiyat değeri girerse, sorunlu TextBox denetimlerinin yanında bir yıldız işareti görünür ve ValidationSummary daha önce belirttiğimiz hata iletisini gösteren bir istemci tarafı ileti kutusu görüntüler.
Bu noktada, ekranınız Şekil 10'a benzer görünmelidir.
Şekil 10: Ekleme Arabirimi Artık Ürün Adları ve Fiyatları için TextBoxes Içeriyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Daha sonra alt bilgi satırına Sevkiyat ve İptal'ten Ürün Ekle düğmelerini eklemeliyiz. Araç Kutusu'ndan iki Düğme denetimini ekleme arabiriminin alt bilgisine sürükleyin ve Düğmelerin ID
özelliklerini AddProducts
ve CancelButton
özelliklerini sırasıyla Sevkiyattan Ürün Ekle ve İptal olarak ayarlayın. Ayrıca, CancelButton
denetim s CausesValidation
özelliğini false
olarak ayarlayın.
Son olarak, iki arabirim için durum iletilerini görüntüleyen bir Etiket Web denetimi eklememiz gerekir. Örneğin, kullanıcı yeni bir ürün sevkiyatını başarıyla eklediğinde görüntüleme arabirimine dönmek ve bir onay iletisi görüntülemek istiyoruz. Ancak, kullanıcı yeni bir ürün için bir fiyat belirler ancak ürün adını girmezse, ProductName
alanı gerektiğinden bir uyarı mesajı göstermemiz gerekir. Bu iletinin her iki arabirimde de görüntülenmesi gerektiğinden, bu iletiyi Paneller'in dışında sayfanın en üstüne yerleştirin.
Bir Etiket Web denetimini Araç Kutusu'ndan Tasarımcı'da sayfanın en üstüne sürükleyin.
ID
özelliğini StatusLabel
olarak ayarlayın, Text
özelliğini temizleyin ve Visible
ile EnableViewState
özelliklerini false
olarak ayarlayın. Önceki öğreticilerde gördüğümüz gibi, EnableViewState
özelliğini false
olarak ayarlamak, Etiketler'in özellik değerlerini program aracılığıyla değiştirmemizi ve bir sonraki geri göndermede otomatik olarak varsayılan değerlerine geri dönmelerini sağlar. Bu, sonraki geri göndermede kaybolan bazı kullanıcı eylemlerine yanıt olarak durum iletisi gösterme kodunu basitleştirir. Son olarak, StatusLabel
içinde tanımlanan ve metni büyük, italik, kalın, kırmızı bir yazı tipinde gösteren CSS sınıfının adı olan CssClass
kontrolünün Styles.css
özelliğini Uyarı olarak ayarlayın.
Şekil 11'de, Etiket eklendikten ve yapılandırıldıktan sonra Visual Studio Tasarımcısı gösterilmektedir.
Şekil 11: Denetimi İki Panel Denetiminin Üzerine Yerleştirin StatusLabel
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
3. Adım: Görüntü ve Ekleme Arabirimleri Arasında Geçiş Yapma
Bu noktada görüntüleme ve ekleme arabirimlerimiz için işaretlemeyi tamamladık, ancak yine de iki görev kaldı:
- Görüntü arasında geçiş yapma ve arabirimleri ekleme
- Gönderideki ürünleri veritabanına ekleme
Şu anda görüntü arabirimi görünür durumdadır ancak ekleme arabirimi gizlenir. Bunun nedeni, DisplayInterface
Panel s özelliğinin Visible
(varsayılan değer) olarak ayarlanmış olması, true
Panel s özelliğinin ise InsertingInterface
olarak ayarlanmış olmasıdır. İki arabirim arasında geçiş yapmak için her denetimin Visible
özellik değerini değiştirmemiz yeterlidir.
Ürün Sevkiyatını İşle düğmesine tıklandığında görüntü arabiriminden ekleme arabirimine geçmek istiyoruz. Bu nedenle, bu Button Click
olayı için aşağıdaki kodu içeren bir olay işleyicisi oluşturun:
protected void ProcessShipment_Click(object sender, EventArgs e)
{
DisplayInterface.Visible = false;
InsertingInterface.Visible = true;
}
Bu kod, DisplayInterface
Paneli gizler ve InsertingInterface
Panelini gösterir.
Ardından ekleme arabiriminde Sevkiyattan Ürün Ekle ve İptal Düğmesi denetimleri için olay işleyicileri oluşturun. Bu Düğmelerden herhangi biri tıklandığında, görüntü arabirimine geri dönmemiz gerekir. Her iki Düğme denetimi için olay işleyicileri oluşturarak, kısa süre içinde ekleyeceğimiz Click
yöntemini çağırmalarını sağlayın. Paneli gizlemeye InsertingInterface
ve Panel'i DisplayInterface
göstermeye ek olarak, yöntemin ReturnToDisplayInterface
Web denetimlerini düzenleme öncesi durumlarına döndürmesi gerekir. Bu, DropDownLists SelectedIndex
özelliklerini 0 olarak ayarlamayı Text
ve TextBox denetimlerinin özelliklerini temizlemeyi içerir.
Uyarı
Görüntüleme arabirimine dönmeden önce denetimleri düzenleme öncesi durumlarına döndürmediğimizde neler olabileceğini göz önünde bulundurun. Kullanıcı Ürün Sevkiyatını İşle düğmesine tıklayabilir, sevkiyattan ürünleri girebilir ve ardından Sevkiyattan Ürün Ekle'ye tıklayabilir. Bu, ürünleri ekler ve kullanıcıyı görüntü arabirimine döndürür. Bu noktada kullanıcı başka bir sevkiyat eklemek isteyebilir. Ürün Sevkiyatını İşle düğmesine tıkladıktan sonra ekleme arabirimine geri dönerler, ancak DropDownList seçimleri ve TextBox değerleri önceki değerleriyle doldurulmaya devam eder.
protected void AddProducts_Click(object sender, EventArgs e)
{
// TODO: Save the products
// Revert to the display interface
ReturnToDisplayInterface();
}
protected void CancelButton_Click(object sender, EventArgs e)
{
// Revert to the display interface
ReturnToDisplayInterface();
}
const int firstControlID = 1;
const int lastControlID = 5;
private void ReturnToDisplayInterface()
{
// Reset the control values in the inserting interface
Suppliers.SelectedIndex = 0;
Categories.SelectedIndex = 0;
for (int i = firstControlID; i <= lastControlID; i++)
{
((TextBox)InsertingInterface.FindControl("ProductName" + i.ToString())).Text =
string.Empty;
((TextBox)InsertingInterface.FindControl("UnitPrice" + i.ToString())).Text =
string.Empty;
}
DisplayInterface.Visible = true;
InsertingInterface.Visible = false;
}
Her iki olay işleyicisi de Click
yöntemini basitçe çağırır, ancak 4. Adımda Sevkiyat Ürün Ekleme ReturnToDisplayInterface
olay işleyicisine geri dönerek ürünleri kaydetmek için kod ekleyeceğiz.
ReturnToDisplayInterface
DropDownLists'i ilk seçeneklerine döndürerek Suppliers
ve Categories
başlar. İki sabit firstControlID
ve lastControlID
, ekleme arabiriminde ürün adı ve birim fiyatı TextBox'larının adını belirlemek için kullanılan başlangıç ve bitiş denetim dizini değerlerini işaretler ve, TextBox denetimlerinin for
özelliklerini boş bir dizeye döndüren Text
döngüsünün sınırları içinde kullanılır. Son olarak Paneller Visible
özellikleri sıfırlanır, böylece ekleme arabirimi gizlenir ve görüntü arabirimi gösterilir.
Bu sayfayı tarayıcıda test etmek için biraz bekleyin. Sayfayı ilk kez ziyaret ettiğinizde, Şekil 5'te gösterildiği gibi görüntüleme arabirimini görmeniz gerekir. Ürün Sevkiyatını İşle düğmesine tıklayın. Sayfa yeniden yüklenecektir ve ardından Şekil 12'de gösterildiği gibi ekleme arabirimini görmelisiniz. Sevkiyattan Ürün Ekle veya İptal et düğmelerine tıklanması sizi görüntü arabirimine döndürür.
Uyarı
Ekleme arabirimini incelerken, birim fiyatı için olan TextBox'larda CompareValidators'ı deneyin. Geçersiz para birimi değerlerine veya sıfırdan küçük bir değere sahip fiyatlara sahip Sevkiyattan Ürün Ekle düğmesine tıklandığında istemci tarafı ileti kutusu uyarısı görmeniz gerekir.
Şekil 12: Ürün Sevkiyatını İşleme Düğmesine Tıkladıktan Sonra Ekleme Arabirimi Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
4. Adım: Ürünleri Ekleme
Bu öğreticide kalan tek şey, Ürünleri Sevkiyat Düğmesi'nden Click
Ürün Ekle olay işleyicisindeki veritabanına kaydetmektir. Bu, sağlanan ürün adlarının her biri için bir ProductsDataTable
ProductsRow
örnek oluşturup ekleyerek gerçekleştirilebilir.
ProductsRow
eklendikten sonra, ProductsBLL
'ü geçirerek sınıfın UpdateWithTransaction
ProductsDataTable
yöntemine bir çağrı yapacağız. Hatırlayın ki, UpdateWithTransaction
yöntemi Bir İşlem İçinde Veritabanı Değişikliklerini Sarmalama öğreticisinde oluşturulmuştu ve ProductsDataTable
'yi ProductsTableAdapter
'nın UpdateWithTransaction
yöntemine geçirir. Buradan bir ADO.NET işlemi başlatılır ve TableAdapter, DataTable'da eklenen her INSERT
için veritabanına bir ProductsRow
komutu gönderir. Tüm ürünlerin hatasız eklendiğini varsayarsak işlem işlenir, aksi takdirde geri alınır.
Sevkiyat Düğmesi'nden Click
Ürün Ekle olay işleyicisinin kodunun da bir hata denetimi gerçekleştirmesi gerekir. Ekleme arabiriminde Zorunlu Alan Doğrulayıcılar kullanılmadığından, bir kullanıcı ürün adını atlayarak ürün için fiyat girebilir. Ürün adı gerekli olduğundan, böyle bir koşul ortaya çıkarsa kullanıcıyı uyarmamız ve eklemelere devam etmemesi gerekir. Olay işleyici kodunun tamamı Click
şunlardır:
protected void AddProducts_Click(object sender, EventArgs e)
{
// Make sure that the UnitPrice CompareValidators report valid data...
if (!Page.IsValid)
return;
// Add new ProductsRows to a ProductsDataTable...
Northwind.ProductsDataTable products = new Northwind.ProductsDataTable();
for (int i = firstControlID; i <= lastControlID; i++)
{
// Read in the values for the product name and unit price
string productName = ((TextBox)InsertingInterface.FindControl
("ProductName" + i.ToString())).Text.Trim();
string unitPrice = ((TextBox)InsertingInterface.FindControl
("UnitPrice" + i.ToString())).Text.Trim();
// Ensure that if unitPrice has a value, so does productName
if (unitPrice.Length > 0 && productName.Length == 0)
{
// Display a warning and exit this event handler
StatusLabel.Text = "If you provide a unit price you must also " +
"include the name of the product.";
StatusLabel.Visible = true;
return;
}
// Only add the product if a product name value is provided
if (productName.Length > 0)
{
// Add a new ProductsRow to the ProductsDataTable
Northwind.ProductsRow newProduct = products.NewProductsRow();
// Assign the values from the web page
newProduct.ProductName = productName;
newProduct.SupplierID = Convert.ToInt32(Suppliers.SelectedValue);
newProduct.CategoryID = Convert.ToInt32(Categories.SelectedValue);
if (unitPrice.Length > 0)
newProduct.UnitPrice = Convert.ToDecimal(unitPrice);
// Add any "default" values
newProduct.Discontinued = false;
newProduct.UnitsOnOrder = 0;
products.AddProductsRow(newProduct);
}
}
// If we reach here, see if there were any products added
if (products.Count > 0)
{
// Add the new products to the database using a transaction
ProductsBLL productsAPI = new ProductsBLL();
productsAPI.UpdateWithTransaction(products);
// Rebind the data to the grid so that the products just added are displayed
ProductsGrid.DataBind();
// Display a confirmation (don't use the Warning CSS class, though)
StatusLabel.CssClass = string.Empty;
StatusLabel.Text = string.Format(
"{0} products from supplier {1} have been added and filed under " +
"category {2}.", products.Count, Suppliers.SelectedItem.Text,
Categories.SelectedItem.Text);
StatusLabel.Visible = true;
// Revert to the display interface
ReturnToDisplayInterface();
}
else
{
// No products supplied!
StatusLabel.Text = "No products were added. Please enter the product " +
"names and unit prices in the textboxes.";
StatusLabel.Visible = true;
}
}
Olay işleyicisi, Page.IsValid
özelliğinin true
değerini döndürdüğünden emin olarak başlar. döndürürse false
, bu, bir veya birden fazla CompareValidator'ın geçersiz verileri bildirdiği anlamına gelir; böyle bir durumda girilen ürünleri eklemeyi denemeyiz aksi takdirde kullanıcı tarafından girilen birim fiyat değerini ProductsRow
etiketinin s UnitPrice
özelliğine atamaya çalıştığımızda bir istisna ortaya çıkar.
Ardından yeni ProductsDataTable
bir örnek oluşturulur (products
). Döngü for
ürün adı ve birim fiyatı TextBox’ları arasında yineleme yapmak için kullanılır ve Text
özellikleri yerel değişkenler productName
ve unitPrice
içerisine okunur. Kullanıcı birim fiyatı için bir değer girdiyse ancak ilgili ürün adı için girmediyse, StatusLabel
Birim fiyat sağlarsanız ürünün adını da eklemeniz gerekir iletisini görüntüler ve ardından olay işleyiciden çıkılır.
Bir ürün adı sağlanmışsa, ProductsRow
s ProductsDataTable
yöntemi kullanılarak yeni bir NewProductsRow
örneği oluşturulur. Bu yeni ProductsRow
örneğinin ProductName
özelliği, geçerli ürün adı olan metin kutusuna ayarlanırken, SupplierID
ve CategoryID
özellikleri ekleme arabiriminin üst kısmındaki açılır listelerin SelectedValue
özelliklerine atanır. Kullanıcı ürünün fiyatı için bir değer girdiyse, bu değer örnek özelliğine ProductsRow
atanır; aksi takdirde özellik atanmamış olarak bırakılır ve bu da veritabanında için UnitPrice
bir NULL
değerle sonuçlanır.UnitPrice
Son olarak, Discontinued
ve UnitsOnOrder
özellikleri sırasıyla sabit kodlanmış değerlere false
ve 0'a atanır.
Özellikler ProductsRow
örneğine atandıktan sonra, ProductsDataTable
öğesine eklenir.
Döngü tamamlandığında for
, herhangi bir ürünün eklenip eklenmediğini denetleriz. Sonuçta kullanıcı, ürün adlarını veya fiyatlarını girmeden önce Sevkiyattan Ürün Ekle'ye tıklaymış olabilir.
ProductsDataTable
içinde en az bir ürün varsa, ProductsBLL
sınıfının UpdateWithTransaction
yöntemi çağrılır. Ardından veriler GridView'a ProductsGrid
geri bağlanır, böylece yeni eklenen ürünler görüntü arabiriminde görünür.
StatusLabel
, bir onay iletisi görüntüleyecek şekilde güncelleştirilir ve ReturnToDisplayInterface
ekleme arabirimini gizleyerek ve görüntüleme arabirimini göstererek çağrılır.
Hiçbir ürün girilmemişse, ekleme arabirimi görüntülenmeye devam eder ancak Ürün eklenmediğini belirten ileti görüntülenir. Lütfen ürün adlarını girin ve metin kutularına birim fiyatları girin.
Şekil s 13, 14 ve 15'te ekleme ve görüntüleme arabirimleri uygulamada gösterilir. Şekil 13'te, kullanıcı karşılık gelen ürün adı olmadan birim fiyat değeri girmiştir. Şekil 14'te üç yeni ürün başarıyla eklendikten sonra görüntü arabirimi gösterilirken, Şekil 15'te yeni eklenen ürünlerden ikisi GridView'da gösterilir (üçüncüsü önceki sayfadadır).
Şekil 13: Birim Fiyat Girilirken Ürün Adı Gerekiyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 14: Tedarikçi Mayumi'ler için Üç Yeni Sebze Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 15: Yeni Ürünler GridView'un Son Sayfasında Bulunabilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Uyarı
Bu öğreticide kullanılan toplu ekleme mantığı, eklemeleri işlem kapsamında sarmalar. Bunu doğrulamak için, bilerek veritabanı düzeyinde bir hataya neden olun. Örneğin, yeni ProductsRow
örneğinin CategoryID
özelliğini DropDownList'teki seçili değere atamak yerine, Categories
gibi bir değere atayın. Burada i
döngü dizinleyicisidir ve 1 ile 5 arasında değerlere sahiptir. Bu nedenle, toplu olarak iki veya daha fazla ürün eklerken ilk ürünün geçerli bir CategoryID
değeri (5) olur, ancak sonraki ürünler tablodaki CategoryID
değerlerle eşleşmeyen CategoryID
değerlerine sahip Categories
olur. Sonuç olarak, ilk INSERT
başarıya ulaşacakken, sonrakiler yabancı anahtar kısıtlaması ihlali nedeniyle başarısız olacaktır. Toplu ekleme işlemi atomik olduğundan, ilk toplu ekleme geri alınır ve veritabanı, işlemin başlamasından önceki durumuna döner.
Özet
Bu ve önceki iki öğreticide, toplu verileri güncelleştirmeye, silmeye ve eklemeye olanak tanıyan arabirimler oluşturduk. Bunların tümü, İşlem öğreticisi içindeki Veritabanı Değişikliklerini Sarmalama'daki Veri Erişim Katmanı'na eklediğimiz işlem desteğini kullandı. Belirli senaryolarda, bu tür toplu işleme kullanıcı arabirimleri tıklama, geri gönderme ve klavyeden fareye bağlam anahtarlarının sayısını azaltarak ve temel alınan verilerin bütünlüğünü koruyarak son kullanıcı verimliliğini büyük ölçüde artırır.
Bu ders, toplu verilerle çalışma konusundaki incelememizi tamamlıyor. Sonraki öğretici kümesinde TableAdapter yöntemlerinde saklı yordamları kullanma, DAL'de bağlantı ve komut düzeyi ayarlarını yapılandırma, bağlantı dizelerini şifreleme ve daha fazlası dahil olmak üzere çeşitli gelişmiş Veri Erişim Katmanı senaryoları incelenir!
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 öncü gözden geçirenleri Hilton Giesenow ve Søren Jacob Lauritsen oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.