Aracılığıyla paylaş


Toplu Ekleme (C#)

tarafından Scott Mitchell

PDF'i indirin

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.

Toplu Ekleme Arabirimi

Ş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 DisplayInterfaceayarlayın. Panel Tasarımcıya eklenirken ve HeightWidth özellikleri sırasıyla 50px ve 125px olarak ayarlanır. Özellikler penceresinden bu özellik değerlerini temizleyin.

Araç Kutusundan Tasarımcıya Panel Sürükleme

Ş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ı ProductsDataSourceyeni 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.

ProductsBLL Sınıfının GetProducts Yönteminden Döndürülen Verileri Görüntüleme

Ş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)

UPDATE, INSERT ve DELETE Sekmelerindeki Drop-Down Listelerini (Yok) olarak ayarlayı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 falseolarak 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.

GridView Ürünleri Listeler ve Sıralama ile Sayfalama Özellikleri Sunar

Ş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.

Ekleme Arabirimi Dört Sütunlu Seven-Row Bir Tablodan Oluşur

Ş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ı SuppliersDataSourceyeni 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.

ObjectDataSource'ı SuppliersBLL Sınıfının GetSuppliers Yöntemini Kullanacak Şekilde Yapılandırma

Ş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.

CompanyName Veri Alanını Görüntüleme ve Değer Olarak SupplierID Kullanma

Ş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ı CategoriesDataSourceyeni 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.

Üst Bilgi Satırı Artık Sağlayıcılar ve Kategoriler DropDownLists'i içeriyor

Ş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.

Ekleme Arabirimi Artık Ürün Adları ve Fiyatları için TextBoxes Içeriyor

Ş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.

StatusLabel Denetimini İki Panel Denetiminin Üzerine Yerleştirin

Ş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.

Ürün Sevkiyatını İşle düğmesine tıkladıktan sonra Ekleme Arabirimi görüntülenir

Ş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 ProductsDataTableProductsRow örnek oluşturup ekleyerek gerçekleştirilebilir. ProductsRow eklendikten sonra, ProductsBLL'ü geçirerek sınıfın UpdateWithTransactionProductsDataTable 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).

Birim Fiyat Girilirken Ürün Adı Gerekiyor

Şekil 13: Birim Fiyat Girilirken Ürün Adı Gerekiyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Tedarikçi Mayumi için Üç Yeni Sebze Eklendi

Ş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)

Yeni Ürünler GridView'un Son Sayfasında Bulunabilir

Ş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.