Toplu Ekleme (C#)Batch Inserting (C#)

Scott Mitchell tarafındanby Scott Mitchell

Kodu indirin veya PDF 'yi indirinDownload Code or Download PDF

Tek bir işlemde birden çok veritabanı kaydını eklemeyi öğrenin.Learn how to insert multiple database records in a single operation. Kullanıcı arabirimi katmanında, GridView 'un, kullanıcının birden çok yeni kayıt girmelerini sağlayacak şekilde genişlettik.In the User Interface Layer we extend the GridView to allow the user to enter multiple new records. Veri erişim katmanında, tüm eklemelerin başarılı veya Tüm eklemelerin geri alındığından emin olmak için bir işlem içindeki birden fazla ekleme işlemini sardık.In the Data Access Layer we wrap the multiple Insert operations within a transaction to ensure that all insertions succeed or all insertions are rolled back.

GirişIntroduction

Toplu güncelleştirme öğreticisinde, GridView denetimini birden çok kaydın düzenlenebildiği bir arabirimi sunacak şekilde özelleştirmeye baktık.In the Batch Updating tutorial we looked at customizing the GridView control to present an interface where multiple records were editable. Sayfayı ziyaret eden Kullanıcı bir dizi değişiklik yapabilir ve sonra tek bir düğme tıklamış olarak toplu güncelleştirme gerçekleştirebilir.The user visiting the page could make a series of changes and then, with a single button click, perform a batch update. Kullanıcıların çok sayıda kaydı tek bir noktada güncelleştirdikleri durumlar için, böyle bir arabirim, veri öğreticisini ekleme, güncelleştirme ve silmeye genel bakış konusunda ilk olarak araştırılan varsayılan satır başına Düzenle özelliklerine kıyasla sayaçsız tıklama ve klavyeden fare bağlam anahtarlarını kaydedebilir.For situations where users commonly update many records in one go, such an interface can save countless clicks and keyboard-to-mouse context switches when compared to the default per-row editing features that were first explored back in the An Overview of Inserting, Updating, and Deleting Data tutorial.

Bu kavram, kayıt eklerken de uygulanabilir.This concept can also be applied when adding records. Burada, Northwind Traders 'da belirli bir kategori için bir dizi ürün içeren tedarikçilerle genellikle sevkiyatlar aldığımızda düşünün.Imagine that here at Northwind Traders we commonly receive shipments from suppliers that contain a number of products for a particular category. Örnek olarak, Tokyo Traders ' den farklı çay ve kahve ürünlerinin bir sevkiyatını alabiliriz.As an example, we might receive a shipment of six different tea and coffee products from Tokyo Traders. Bir Kullanıcı her seferinde bir DetailsView denetimi aracılığıyla altı ürüne girerse, aynı değer sayısını tekrar tekrar seçmek gerekir: aynı kategoriyi (Içecek), aynı tedarikçiyi (Tokyo Traders), aynı Discontinued değerini ( False) ve sipariş değeri (0) üzerinde aynı birimleri.If a user enters the six products one at a time through a DetailsView control, they will have to choose many of the same values over and over again: they will need to choose the same category (Beverages), the same supplier (Tokyo Traders), the same discontinued value (False), and the same units on order value (0). Bu yinelenen veri girişi yalnızca zaman alabilir, ancak hatalara açıktır.This repetitive data entry is not only time consuming, but is prone to errors.

Az iş sayesinde, kullanıcının tedarikçiden ve kategoriye bir kez seçmesini sağlayan bir toplu iş ekleme arabirimi oluşturabilir, bir dizi ürün adı ve birim fiyatı girebilir ve sonra yeni ürünleri veritabanına eklemek için bir düğmeye tıklayabilirsiniz (bkz. Şekil 1).With a little work we can create a batch inserting interface that enables the user to choose the supplier and category once, enter a series of product names and unit prices, and then click a button to add the new products to the database (see Figure 1). Her ürün eklendikçe ProductName ve UnitPrice veri alanlarına metin kutularına girilen değerler atanır, ancak CategoryID ve SupplierID değerleri, formun en üstündeki DropDownLists değerleri olarak atanır.As each product is added, its ProductName and UnitPrice data fields are assigned the values entered in the TextBoxes, while its CategoryID and SupplierID values are assigned the values from the DropDownLists at the top fo the form. Discontinued ve UnitsOnOrder değerleri sırasıyla false ve 0 ' ın sabit kodlanmış değerlerine ayarlanır.The Discontinued and UnitsOnOrder values are set to the hard-coded values of false and 0, respectively.

Batch ekleme arabirimini The Batch Inserting Interface

Şekil 1: toplu ekleme arabirimi (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 1: The Batch Inserting Interface (Click to view full-size image)

Bu öğreticide Şekil 1 ' de gösterilen Batch ekleme arabirimini uygulayan bir sayfa oluşturacağız.In this tutorial we will create a page that implements the batch inserting interface shown in Figure 1. Önceki iki öğreticilerde olduğu gibi, bir işlemin kapsamındaki eklemeleri, Atomicity sağlamak için kaydıracağız.As with the previous two tutorials, we will wrap the insertions within the scope of a transaction to ensure atomicity. Haydi başlayın!Let s get started!

1. Adım: görüntüleme arabirimi oluşturmaStep 1: Creating the Display Interface

Bu öğretici, iki bölgeye bölünen tek bir sayfadan oluşur: bir görüntüleme bölgesi ve ekleme bölgesi.This tutorial will consist of a single page that is divided into two regions: a display region and an inserting region. Bu adımda oluşturacağımız görüntüleme arabirimi, bir GridView 'daki ürünleri gösterir ve Işlem ürün sevkiyatı başlıklı bir düğme içerir.The display interface, which we'll create in this step, shows the products in a GridView and includes a button titled Process Product Shipment. Bu düğmeye tıklandığında, görüntüleme arabirimi, Şekil 1 ' de gösterilen ekleme arabirimiyle değiştirilmiştir.When this button is clicked, the display interface is replaced with the inserting interface, which is shown in Figure 1. Görüntüleme arabirimi, Sevkiyat veya Iptal düğmelerinden ürün Ekle ' ye tıkladıktan sonra döndürülür.The display interface returns after the Add Products from Shipment or Cancel buttons are clicked. 2. adımda ekleme arabirimini oluşturacağız.We'll create the inserting interface in Step 2.

İki arabirime sahip bir sayfa oluştururken, tek seferde yalnızca biri görünebilir, her arabirim genellikle diğer denetimler için bir kapsayıcı görevi gören panel Web denetimiiçine yerleştirilir.When creating a page that has two interfaces, only one of which is visible at a time, each interface typically is placed within a Panel Web control, which serves as a container for other controls. Bu nedenle sayfamız her bir arabirim için iki panel denetimine sahip olacaktır.Therefore, our page will have two Panel controls one for each interface.

BatchData klasöründeki BatchInsert.aspx sayfasını açıp araç kutusu 'ndaki bir paneli tasarımcı üzerine sürükleyin (bkz. Şekil 2).Start by opening the BatchInsert.aspx page in the BatchData folder and drag a Panel from the Toolbox onto the Designer (see Figure 2). Panel s ID özelliğini DisplayInterfaceolarak ayarlayın.Set the Panel s ID property to DisplayInterface. Paneli tasarımcıya eklerken, Height ve Width özellikleri sırasıyla 50px ve 125px olarak ayarlanır.When adding the Panel to the Designer, its Height and Width properties are set to 50px and 125px, respectively. Bu özellik değerlerini Özellikler penceresi temizleyin.Clear out these property values from the Properties window.

Araç kutusundan Tasarımcı üzerine bir panel sürükleyin Drag a Panel from the Toolbox onto the Designer

Şekil 2: araç kutusundan Tasarımcı üzerine bir panel sürükleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 2: Drag a Panel from the Toolbox onto the Designer (Click to view full-size image)

Sonra, bir düğme ve GridView denetimini panele sürükleyin.Next, drag a Button and GridView control into the Panel. Düğme s ID özelliğini ProcessShipment ve Text özelliğine, ürün sevk Irsaliyesini Işleyecek şekilde ayarlayın.Set the Button s ID property to ProcessShipment and its Text property to Process Product Shipment. GridView s ID özelliğini ProductsGrid ve akıllı etiketinden ProductsDataSourceadlı yeni bir ObjectDataSource 'a bağlayın.Set the GridView s ID property to ProductsGrid and, from its smart tag, bind it to a new ObjectDataSource named ProductsDataSource. ProductsBLL sınıf s GetProducts yönteminden verileri çekmek için ObjectDataSource 'ı yapılandırın.Configure the ObjectDataSource to pull its data from the ProductsBLL class s GetProducts method. Bu GridView yalnızca verileri göstermek için kullanıldığından, GÜNCELLEŞTIRME, ekleme ve SILME sekmelerinden (hiçbiri) açılan listeleri ayarlayın.Since this GridView is used only to display data, set the drop-down lists in the UPDATE, INSERT, and DELETE tabs to (None). Veri kaynağını yapılandırma Sihirbazı 'nı gerçekleştirmek için son ' a tıklayın.Click Finish to complete the Configure Data Source wizard.

ProductsBLL Class s GetProducts yönteminden döndürülen verileri görüntülemeDisplay the Data Returned from the ProductsBLL Class s GetProducts Method

Şekil 3: ProductsBLL Class s GetProducts yönteminden döndürülen verileri görüntüle (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 3: Display the Data Returned from the ProductsBLL Class s GetProducts Method (Click to view full-size image)

GÜNCELLEŞTIRME, ekleme ve SILME sekmelerindeki açılan listeleri (hiçbiri) ayarlaSet the Drop-Down Lists in the UPDATE, INSERT, and DELETE Tabs to (None)

Şekil 4: GÜNCELLEŞTIRME, ekleme ve silme sekmelerinden açılan listeleri (yok) ayarlayın (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 4: Set the Drop-Down Lists in the UPDATE, INSERT, and DELETE Tabs to (None) (Click to view full-size image)

ObjectDataSource Sihirbazı 'nı tamamladıktan sonra, Visual Studio, ürün verileri alanları için BoundFields ve bir CheckBoxField ekleyecek.After completing the ObjectDataSource wizard, Visual Studio will add BoundFields and a CheckBoxField for the product data fields. ProductName, CategoryName, SupplierName, UnitPriceve Discontinued alanları hariç tümünü kaldırın.Remove all but the ProductName, CategoryName, SupplierName, UnitPrice, and Discontinued fields. Aesthetic Characteristics özelleştirmelerini ücretsiz hale getirebilirsiniz.Feel free to make any aesthetic customizations. UnitPrice alanını bir para birimi değeri olarak biçimlendirmeye, alanları yeniden sınıflandırmaya ve alanların HeaderText değerlerinin birkaç yerine adlandırmaya karar verdim.I decided to format the UnitPrice field as a currency value, reordered the fields, and renamed several of the fields HeaderText values. GridView 'ı Ayrıca, GridView s akıllı etiketinde sayfalama etkinleştir ve sıralamayı etkinleştir onay kutularını işaretleyerek sayfalama ve sıralama desteğini içerecek şekilde yapılandırın.Also configure the GridView to include paging and sorting support by checking the Enable Paging and Enable Sorting checkboxes in the GridView s smart tag.

Panel, düğme, GridView ve ObjectDataSource 'ı ekledikten ve GridView s alanlarını özelleştirirken, sayfa için bildirim temelli işaretleriniz şuna benzer olmalıdır:After adding the Panel, Button, GridView, and ObjectDataSource controls and customizing the GridView s fields, your page s declarative markup should look similar to the following:

<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çin biçimlendirmenin açılış ve kapanış <asp:Panel> etiketleri içinde göründüğünü unutmayın.Note that the markup for the Button and GridView appear within the opening and closing <asp:Panel> tags. Bu denetimler DisplayInterface paneli içinde olduğundan, panel s Visible özelliğini falseolarak ayarlayarak onları gizleyebiliriz.Since these controls are within the DisplayInterface Panel, we can hide them by simply setting the Panel s Visible property to false. 3. adım, bir düğmeye yanıt olarak panel s Visible özelliğini programlı bir şekilde değiştirmeye, diğerini gizleyerek bir arabirim göstermeye yönelik olarak bakar.Step 3 looks at programmatically changing the Panel s Visible property in response to a button click to show one interface while hiding the other.

Bir tarayıcıdan ilerleme durumunu görüntülemek için bir dakikanızı ayırın.Take a moment to view our progress through a browser. Şekil 5 ' i gösterdiği gibi, bir GridView üzerinde, bir kerede on ürünü listeleyen bir Işlem ürün sevkiyat düğmesi görmeniz gerekir.As Figure 5 shows, you should see a Process Product Shipment button above a GridView that lists the products ten at a time.

GridView ürünleri listeler ve sıralama ve sayfalama özellikleri sunarThe GridView Lists the Products and Offers Sorting and Paging Capabilities

Şekil 5: GridView ürünleri listeler ve sıralama ve sayfalama özellikleri sunar (tam boyutlu görüntüyü görüntülemek için tıklatın)Figure 5: The GridView Lists the Products and Offers Sorting and Paging Capabilities (Click to view full-size image)

2. Adım: ekleme arabirimi oluşturmaStep 2: Creating the Inserting Interface

Görüntüleme arabirimi tamamlandıktan sonra ekleme arabirimini oluşturmaya hazırız.With the display interface complete, we re ready to create the inserting interface. Bu öğreticide, s için tek bir tedarikçi ve kategori değeri isteyen bir ekleme arabirimi oluşturun ve ardından kullanıcının en fazla beş ürün adı ve birim fiyat değeri girmesine izin verin.For this tutorial, let s create an inserting interface that prompts for a single supplier and category value and then allows the user to enter up to five product names and unit price values. Bu arabirim ile Kullanıcı, hepsi aynı kategori ve tedarikçiyi paylaştığı, ancak benzersiz ürün adları ve fiyatlarına sahip olan beş yeni ürüne eklenebilir.With this interface, the user can add one to five new products that all share the same category and supplier, but have unique product names and prices.

Araç kutusu 'ndaki bir paneli tasarımcı üzerine sürükleyip, mevcut DisplayInterface panelinin altına yerleştirerek başlayın.Start by dragging a Panel from the Toolbox onto the Designer, placing it beneath the existing DisplayInterface Panel. Bu yeni eklenen bölmenin ID özelliğini InsertingInterface olarak ayarlayın ve Visible özelliğini falseolarak ayarlayın.Set the ID property of this newly added Panel to InsertingInterface and set its Visible property to false. InsertingInterface panel s Visible özelliğini 3. adımdaki true olarak ayarlayan kodu ekleyeceğiz.We'll add code that sets the InsertingInterface Panel s Visible property to true in Step 3. Ayrıca, panel s Height ve Width özellik değerlerini de temizleyin.Also clear out the Panel s Height and Width property values.

Ardından şekil 1 ' de geri gösterilen ekleme arabirimini oluşturmamız gerekiyor.Next, we need to create the inserting interface that was shown back in Figure 1. Bu arabirim çeşitli HTML teknikleri aracılığıyla oluşturulabilir, ancak büyük bir şekilde, dört sütunlu, yedi satırlık bir tablo kullanacağız.This interface can be created through a variety of HTML techniques, but we will use a fairly straightforward one: a four-column, seven-row table.

Note

HTML <table> öğeleri için biçimlendirme girerken kaynak görünümü kullanmayı tercih ediyorum.When entering markup for HTML <table> elements, I prefer to use the Source view. Visual Studio, tasarımcı aracılığıyla <table> öğeleri eklemeye yönelik araçlar içerirken, tasarımcı, style için sorulmayan ayarları biçimlendirmeye ekleme konusunda çok daha fazla şey görünüyor.While Visual Studio does have tools for adding <table> elements through the Designer, the Designer seems all too willing to inject unasked for style settings into the markup. <table> biçimlendirmeyi oluşturduktan sonra, Web denetimlerini eklemek ve özelliklerini ayarlamak için genellikle tasarımcıya geri dönirim.Once I have created the <table> markup, I usually return to the Designer to add the Web controls and set their properties. Önceden belirlenmiş sütunlar ve satırlar içeren tablolar oluştururken tablo Web denetimi yerıne statik HTML kullanmayı tercih ediyorum; çünkü tablo Web denetimi Içine yerleştirilmiş Web denetimlerine yalnızca FindControl("controlID") düzeniyle erişilebilir.When creating tables with pre-determined columns and rows I prefer using static HTML rather than the Table Web control because any Web controls placed within a Table Web control can only be accessed using the FindControl("controlID") pattern. Ancak, Tablo Web denetimi programlı bir şekilde oluşturulabileceğinizden, dinamik boyutlardaki tablolar için Tablo Web denetimlerini (satırlar veya sütunları bir veritabanına veya Kullanıcı tarafından belirtilen ölçütlere göre) kullanır.I do, however, use Table Web controls for dynamically-sized tables (ones whose rows or columns are based on some database or user-specified criteria), since the Table Web control can be constructed programmatically.

InsertingInterface panelinin <asp:Panel> etiketleri arasına aşağıdaki biçimlendirmeyi girin:Enter the following markup within the <asp:Panel> tags of the InsertingInterface Panel:

<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> biçimlendirme henüz herhangi bir Web denetimi içermez, bu tür bir şekilde ekleyeceğiz.This <table> markup does not include any Web controls yet, we'll add those momentarily. Her bir <tr> öğesinin belirli bir CSS sınıfı ayarını içerdiğini unutmayın: tedarikçinin ve kategori DropDownLists 'ın gideceği üst bilgi satırı için BatchInsertHeaderRow; Sevkiyat ve Iptal düğmelerinden ürünlerin ekleneceği alt bilgi satırı için BatchInsertFooterRow; ve, ürün ve birim fiyat metin kutusu denetimlerini içerecek olan satırların BatchInsertRow ve BatchInsertAlternatingRow değerleri.Note that each <tr> element contains a particular CSS class setting: BatchInsertHeaderRow for the header row where the supplier and category DropDownLists will go; BatchInsertFooterRow for the footer row where the Add Products from Shipment and Cancel Buttons will go; and alternating BatchInsertRow and BatchInsertAlternatingRow values for the rows that will contain the product and unit price TextBox controls. Ekleme arabirimine, bu öğreticiler genelinde kullanılan GridView ve DetailsView denetimlerine benzer bir görünüm vermek için Styles.css dosyasında karşılık gelen CSS sınıfları oluşturdum.I ve created corresponding CSS classes in the Styles.css file to give the inserting interface an appearance similar to the GridView and DetailsView controls we ve used throughout these tutorials. Bu CSS sınıfları aşağıda gösterilmiştir.These CSS classes are shown below.

/*** 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 biçimlendirme girildiğinde Tasarım görünümü geri döndürün.With this markup entered, return to the Design view. Bu <table>, Şekil 6 ' da gösterildiği gibi, tasarımcıda dört sütunlu, yedi satırlık tablo olarak gösterilmelidir.This <table> should show as a four-column, seven-row table in the Designer, as Figure 6 illustrates.

ekleme arabirimi dört sütunlu, yedi satırlık bir tablodan oluşurThe Inserting Interface is Composed of a Four-Column, Seven-Row Table

Şekil 6: ekleme arabirimi dört sütunlu, yedi satırlık bir tablodan oluşur (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 6: The Inserting Interface is Composed of a Four-Column, Seven-Row Table (Click to view full-size image)

Şimdi ekleme arabirimine Web denetimleri eklemeye hazırsınız.We re now ready to add the Web controls to the inserting interface. Araç kutusundan iki DropDownLists öğesini, tablodaki ve kategori için bir tabloda bulunan uygun hücrelere sürükleyin.Drag two DropDownLists from the Toolbox into the appropriate cells in the table one for the supplier and one for the category.

Tedarikçinin DropDownList s ID özelliğini Suppliers olarak ayarlayın ve SuppliersDataSourceadlı yeni bir ObjectDataSource 'a bağlayın.Set the supplier DropDownList s ID property to Suppliers and bind it to a new ObjectDataSource named SuppliersDataSource. SuppliersBLL sınıf s GetSuppliers yönteminden verileri almak için yeni ObjectDataSource 'u yapılandırın ve GÜNCELLEŞTIRME sekmesi s açılan listesini (None) olarak ayarlayın.Configure the new ObjectDataSource to retrieve its data from the SuppliersBLL class s GetSuppliers method and set the UPDATE tab s drop-down list to (None). Sihirbazı tamamladığınızda son ' a tıklayın.Click Finish to complete the wizard.

SuppliersBLL sınıfı s GetSuppliers metodunu kullanmak için ObjectDataSource 'ı yapılandırmaConfigure the ObjectDataSource to Use the SuppliersBLL Class s GetSuppliers Method

Şekil 7: SuppliersBLL sınıf s GetSuppliers metodunu (tam boyutlu görüntüyü görüntülemek Için tıklayın) kullanmak üzere ObjectDataSource 'ı yapılandırınFigure 7: Configure the ObjectDataSource to Use the SuppliersBLL Class s GetSuppliers Method (Click to view full-size image)

Suppliers DropDownList CompanyName veri alanını görüntülemesini ve ListItem s değerleri olarak SupplierID veri alanını kullanmasını sağlayabilirsiniz.Have the Suppliers DropDownList display the CompanyName data field and use the SupplierID data field as its ListItem s values.

CompanyName veri alanını görüntüleyin ve SupplierID değerini değer olarak kullanınDisplay the CompanyName Data Field and Use SupplierID as the Value

Şekil 8: CompanyName veri alanını görüntüleyin ve değer olarak SupplierID kullanın (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 8: Display the CompanyName Data Field and Use SupplierID as the Value (Click to view full-size image)

İkinci DropDownList Categories adlandırın ve CategoriesDataSourceadlı yeni bir ObjectDataSource 'a bağlayın.Name the second DropDownList Categories and bind it to a new ObjectDataSource named CategoriesDataSource. CategoriesDataSource ObjectDataSource 'ı CategoriesBLL Class s GetCategories metodunu kullanacak şekilde yapılandırın; GÜNCELLEŞTIRME ve SILME sekmelerinden açılan listeleri (yok) olarak ayarlayın ve Sihirbazı tamamladıktan sonra son ' a tıklayın.Configure the CategoriesDataSource ObjectDataSource to use the CategoriesBLL class s GetCategories method; set the drop-down lists in the UPDATE and DELETE tabs to (None) and click Finish to complete the wizard. Son olarak, DropDownList 'ın CategoryName veri alanını göstermesini ve CategoryID değer olarak kullanmasına sahip olmanız gerekir.Finally, have the DropDownList display the CategoryName data field and use the CategoryID as the value.

Bu iki DropDownLists eklendikten ve uygun şekilde yapılandırılmış ObjectDataSources 'lar ile bağlandıktan sonra, ekranınız Şekil 9 ' a benzer görünmelidir.After these two DropDownLists have been added and bound to appropriately configured ObjectDataSources, your screen should look similar to Figure 9.

Başlık satırı artık tedarikçileri ve kategorileri DropDownLists IçerirThe Header Row Now Contains the Suppliers and Categories DropDownLists

Şekil 9: başlık satırı artık Suppliers ve Categories dropdownlists (tam boyutlu görüntüyü görüntülemek Için tıklayın) içerirFigure 9: The Header Row Now Contains the Suppliers and Categories DropDownLists (Click to view full-size image)

Şimdi her yeni ürünün adını ve fiyatını toplamak için metin kutuları oluşturmanız gerekir.We now need to create the TextBoxes to collect the name and price for each new product. Araç kutusundan bir TextBox denetimini, beş ürün adı ve fiyat satırı için tasarımcı üzerine sürükleyin.Drag a TextBox control from the Toolbox onto the Designer for each of the five product name and price rows. Metin kutularının ID özelliklerini ProductName1, UnitPrice1, ProductName2, UnitPrice2, ProductName3, UnitPrice3vb. olarak ayarlayın.Set the ID properties of the TextBoxes to ProductName1, UnitPrice1, ProductName2, UnitPrice2, ProductName3, UnitPrice3, and so on.

Birim Fiyat metin kutularının her biri için bir CompareValidator ekleyin ve ControlToValidate özelliğini uygun IDolarak ayarlar.Add a CompareValidator after each of the unit price TextBoxes, setting the ControlToValidate property to the appropriate ID. Ayrıca, Operator özelliğini GreaterThanEqual, ValueToCompare 0 olarak ayarlayın ve Currency``Type.Also set the Operator property to GreaterThanEqual, ValueToCompare to 0, and Type to Currency. Bu ayarlar, girildiyse fiyatın, sıfıra eşit veya sıfırdan büyük geçerli bir para birimi değeri olduğundan emin olmak için CompareValidator yönlendirir.These settings instruct the CompareValidator to ensure that the price, if entered, is a valid currency value that is greater than or equal to zero. Text özelliğini *olarak ayarlayın ve fiyata ErrorMessage sıfırdan büyük veya sıfıra eşit olmalıdır.Set the Text property to *, and ErrorMessage to The price must be greater than or equal to zero. Ayrıca, lütfen tüm para birimi sembollerini atlayın.Also, please omit any currency symbols.

Note

Products veritabanı tablosundaki ProductName alanı NULL değerlere izin vermediği halde ekleme arabirimi herhangi bir RequiredFieldValidator denetimi içermez.The inserting interface does not include any RequiredFieldValidator controls, even though the ProductName field in the Products database table does not allow NULL values. Bunun nedeni kullanıcının en fazla beş ürün girmelerini sağlamak istiyoruz.This is because we want to let the user enter up to five products. Örneğin, Kullanıcı ilk üç satır için ürün adı ve birim fiyatını sağlamamız, son iki satırı boş bırakarak sisteme yalnızca üç yeni ürün ekleyeceğiz.For example, if the user were to provide the product name and unit price for the first three rows, leaving the last two rows blank, we d just add three new products to the system. Ancak ProductName gerekli olduğundan, karşılık gelen bir ürün adı değerinin sağlandığı bir birim fiyatı girilmişse emin olmak için programlı olarak kontrol etmemiz gerekir.Since ProductName is required, however, we will need to programmatically check to ensure that if a unit price is entered that a corresponding product name value is provided. Adım 4 ' te bu denetimi kullanıma sunacağız.We'll tackle this check in Step 4.

Kullanıcı girişi doğrulanırken, değer bir para birimi simgesi içeriyorsa, CompareValidator geçersiz verileri raporlar.When validating the user s input, the CompareValidator reports invalid data if the value contains a currency symbol. Kullanıcıya fiyat girerken para birimi sembolünü atmasını bildiren bir görsel ipucu olarak kullanılacak, birim fiyat kutularının her birinin bir $ ın önüne ekleyin.Add a $ in front of each of the unit price TextBoxes to serve as a visual cue that instructs the user to omit the currency symbol when entering the price.

Son olarak, InsertingInterface paneli içinde bir ValidationSummary denetimi ekleyin, ShowMessageBox özelliğini true ve ShowSummary özelliğine falseolarak ayarlar.Lastly, add a ValidationSummary control within the InsertingInterface Panel, settings its ShowMessageBox property to true and its ShowSummary property to false. Bu ayarlarla, Kullanıcı geçersiz bir birim fiyat değeri girerse, sorunlu metin kutusu 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ı MessageBox görüntüler.With these settings, if the user enters an invalid unit price value, an asterisk will appear next to the offending TextBox controls and the ValidationSummary will display a client-side messagebox that shows the error message we specified earlier.

Bu noktada ekranınızın Şekil 10 ' a benzer olması gerekir.At this point, your screen should look similar to Figure 10.

Ekleme arabirimi , artık ürün adları ve fiyatları için metin kutuları IçerirThe Inserting Interface Now Includes TextBoxes for the Products Names and Prices

Şekil 10: ekleme arabirimi artık ürün adları ve fiyatları Için metin kutuları içerir (tam boyutlu görüntüyü görüntülemek için tıklatın)Figure 10: The Inserting Interface Now Includes TextBoxes for the Products Names and Prices (Click to view full-size image)

Sonraki adımda, Sevkiyat ve Iptal düğmelerinden ürün Ekle ' ye alt bilgi satırına eklememiz gerekiyor.Next we need to add the Add Products from Shipment and Cancel buttons to the footer row. Araç kutusundan iki düğme denetimini ekleme arabiriminin altbilgisine sürükleyin, düğmeleri ID Özellikler AddProducts ve CancelButton ve Text özellikleri, Sevkiyat ve Iptal 'tan ürün eklemek için, sırasıyla ayarlar.Drag two Button controls from the Toolbox into the footer of the inserting interface, setting the Buttons ID properties to AddProducts and CancelButton and Text properties to Add Products from Shipment and Cancel, respectively. Ayrıca, CancelButton Control s CausesValidation özelliğini falseolarak ayarlayın.In addition, set the CancelButton control s CausesValidation property to false.

Son olarak, iki arabirim için durum iletilerini görüntüleyecek bir etiket Web denetimi eklememiz gerekiyor.Finally, we need to add a Label Web control that will display status messages for the two interfaces. Örneğin, bir Kullanıcı ürünlerin yeni bir sevkiyatını başarıyla eklediğinde, görüntüleme arabirimine dönmek ve bir onay iletisi göstermek istiyoruz.For example, when a user successfully adds a new shipment of products, we want to return to the display interface and display a confirmation message. Ancak, Kullanıcı yeni bir ürün için bir fiyat sağlar, ancak ürün adını kaparsa, ProductName alanı gerekli olduğundan bir uyarı iletisi görüntüliyoruz.If, however, the user provides a price for a new product but leaves off the product name, we need to display a warning message since the ProductName field is required. Bu iletinin her iki arabirim için de görüntülenmesi gerektiğinden, sayfanın üst kısmına Pano dışından yerleştirin.Since we need this message to display for both interfaces, place it at the top of the page outside of the Panels.

Araç kutusundan bir etiket Web denetimini tasarımcıda sayfanın en üstüne sürükleyin.Drag a Label Web control from the Toolbox to the top of the page in the Designer. ID özelliğini StatusLabelolarak ayarlayın, Text özelliğini temizleyin ve Visible ve EnableViewState özelliklerini falseolarak ayarlayın.Set the ID property to StatusLabel, clear out the Text property, and set the Visible and EnableViewState properties to false. Önceki öğreticilerde gördüğimize göre EnableViewState özelliğinin false olarak ayarlanması, etiket s özellik değerlerini programlı bir şekilde değiştirebilmemiz ve sonraki geri göndermede otomatik olarak varsayılan değerlerine geri dönmemize olanak sağlar.As we have seen in previous tutorials, setting the EnableViewState property to false allows us to programmatically change the Label s property values and have them automatically revert back to their defaults on the subsequent postback. Bu, sonraki geri göndermede ortadan bulunan bazı kullanıcı eylemine yanıt olarak bir durum iletisi göstermek için kodu basitleştirir.This simplifies the code for showing a status message in response to some user action that disappears on the subsequent postback. Son olarak, büyük, italik, kalın ve kırmızı bir yazı tipinde metin görüntüleyen Styles.css tanımlanmış bir CSS sınıfının adı olan StatusLabel Control s CssClass özelliğini uyarı olarak ayarlayın.Finally, set the StatusLabel control s CssClass property to Warning, which is the name of a CSS class defined in Styles.css that displays text in a large, italic, bold, red font.

Şekil 11 ' ın etiketi eklendikten ve yapılandırıldıktan sonra Visual Studio Tasarımcısı gösterilmektedir.Figure 11 shows the Visual Studio Designer after the Label has been added and configured.

, StatusLabel denetimini Iki Panel denetiminin üzerine yerleştirinPlace the StatusLabel Control Above the Two Panel Controls

Şekil 11: StatusLabel denetimini Iki Panel denetiminin üstüne yerleştirin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 11: Place the StatusLabel Control Above the Two Panel Controls (Click to view full-size image)

3. Adım: görüntüleme ve ekleme arabirimleri arasında geçiş yapmaStep 3: Switching Between the Display and Inserting Interfaces

Bu noktada, görüntü ve ekleme arabirimlerimiz için biçimlendirmeyi tamamladık, ancak yine de iki görevle hala ayrıldık:At this point we have completed the markup for our display and inserting interfaces, but we re still left with two tasks:

  • Görüntüleme ve ekleme arabirimleri arasında geçiş yapmaSwitching between the display and inserting interfaces
  • Sevkıyata eklenen ürünler veritabanına ekleniyorAdding the products in the shipment to the database

Şu anda, görüntüleme arabirimi görünür ancak ekleme arabirimi gizli.Currently, the display interface is visible but the inserting interface is hidden. Bunun nedeni, DisplayInterface panel s Visible özelliğinin true (varsayılan değer) olarak ayarlandığı, InsertingInterface panel s Visible özelliği ise falseolarak ayarlanmıştır.This is because the DisplayInterface Panel s Visible property is set to true (the default value), while the InsertingInterface Panel s Visible property is set to false. İki arabirim arasında geçiş yapmak için, her bir denetimin Visible özellik değerini değiştirmek zorunda olduğumuz her bir denetim için yeterlidir.To switch between the two interfaces we simply need to toggle each control s Visible property value.

Işlem ürünü sevk Irsaliyesi düğmesine tıklandığında, görüntüleme arabiriminden ekleme arabirimine geçmek istiyoruz.We want to move from the display interface to the inserting interface when the Process Product Shipment button is clicked. Bu nedenle, bu düğme s Click için aşağıdaki kodu içeren bir olay işleyicisi oluşturun:Therefore, create an event handler for this Button s Click event that contains the following code:

protected void ProcessShipment_Click(object sender, EventArgs e)
{
    DisplayInterface.Visible = false;
    InsertingInterface.Visible = true;
}

Bu kod yalnızca DisplayInterface paneli gizler ve InsertingInterface panelini gösterir.This code simply hides the DisplayInterface Panel and shows the InsertingInterface Panel.

Sonra, ekleme arabirimindeki, Sevkiyat ve Iptal düğmesi denetimlerinden ürün Ekle ' ye yönelik olay işleyicileri oluşturun.Next, create event handlers for the Add Products from Shipment and Cancel Button controls in the inserting interface. Bu düğmelerden birine tıklandığında, görüntüleme arabirimine geri dönmemiz gerekir.When either of these Buttons is clicked, we need to revert back to the display interface. Her iki düğme denetimi için de Click olay işleyicileri oluşturun, bu sayede bir yöntem olarak ekleyeceğiz ReturnToDisplayInterface.Create Click event handlers for both Button controls so that they call ReturnToDisplayInterface, a method we will add momentarily. InsertingInterface paneli gizleme ve DisplayInterface panelini gösterme ek olarak, ReturnToDisplayInterface yönteminin Web denetimlerini önceden düzenlenen durumuna döndürmesi gerekir.In addition to hiding the InsertingInterface Panel and showing the DisplayInterface Panel, the ReturnToDisplayInterface method needs to return the Web controls to their pre-editing state. Bu, DropDownLists SelectedIndex özelliklerinin 0 olarak ayarlanmasını ve metin kutusu denetimlerinin Text özelliklerini temizlemeyi içerir.This involves setting the DropDownLists SelectedIndex properties to 0 and clearing out the Text properties of the TextBox controls.

Note

Görüntüleme arabirimine dönmeden önce denetimleri ön Düzenle durumuna döndürmediyseniz ne olabileceğini göz önünde bulundurun.Consider what might happen if we didn't return the controls to their pre-editing state before returning to the display interface. Kullanıcı, ürün sevk Irsaliyesini Işle düğmesine tıklayabilir, sevkıyata ürünleri girebilir ve ardından sevkıyata ürün Ekle ' ye tıklayabilirsiniz.A user might click the Process Product Shipment button, enter the products from the shipment, and then click Add Products from Shipment. Bu, ürünleri ekleyecek ve Kullanıcı görüntüleme arabirimine döndürüyor.This would add the products and return the user to the display interface. Bu noktada Kullanıcı başka bir sevkiyat eklemek isteyebilir.At this point the user might want to add another shipment. Işlem ürün sevkiyat düğmesine tıklandıktan sonra ekleme arabirimine geri döner, ancak DropDownList seçimleri ve metin kutusu değerleri yine de önceki değerleriyle doldurulur.Upon clicking the Process Product Shipment button they would return to the inserting interface but the DropDownList selections and TextBox values would still be populated with their previous values.

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;
}

Click olay işleyicilerinin her ikisi de yalnızca ReturnToDisplayInterface yöntemini çağırır, ancak 4. adımda ürün Ekle Click olay işleyicisine geri dönebiliyoruz ve ürünleri kaydetmek için kod ekleyeceğiz.Both Click event handlers simply call the ReturnToDisplayInterface method, although we'll return to the Add Products from Shipment Click event handler in Step 4 and add code to save the products. ReturnToDisplayInterface, Suppliers ve Categories DropDownLists ilk seçeneklerine dönerek başlar.ReturnToDisplayInterface starts by returning the Suppliers and Categories DropDownLists to their first options. İki sabitler firstControlID ve lastControlID, ekleme arabirimindeki ürün adını ve birim fiyat metin kutularını adlandırırken kullanılan başlangıç ve bitiş denetim dizini değerlerini işaretleyip metin kutusu denetimlerinin Text özelliklerini boş bir dizeye doğru ayarlayan for döngüsünün sınırları içinde kullanılır.The two constants firstControlID and lastControlID mark the starting and ending control index values used in naming the product name and unit price TextBoxes in the inserting interface and are used in the bounds of the for loop that sets the Text properties of the TextBox controls back to an empty string. Son olarak, ekleme arabiriminin gizlenmesi ve görüntüleme arabiriminin gösterilmesi için paneller Visible Özellikler sıfırlanır.Finally, the Panels Visible properties are reset so that the inserting interface is hidden and the display interface shown.

Bu sayfayı bir tarayıcıda test etmek için bir dakikanızı ayırın.Take a moment to test out this page in a browser. Sayfayı ilk kez ziyaret edildiğinde, Şekil 5 ' te gösterildiği gibi görüntüleme arabirimini görmeniz gerekir.When first visiting the page you should see the display interface as was shown in Figure 5. Ürün sevk Irsaliyesini Işle düğmesine tıklayın.Click the Process Product Shipment button. Sayfa geri gönderilir ve şimdi Şekil 12 ' de gösterildiği gibi ekleme arabirimini görmeniz gerekir.The page will postback and you should now see the inserting interface as shown in Figure 12. Sevkiyat veya Iptal düğmelerinden ürün Ekle ' ye tıklamak sizi görüntüleme arabirimine döndürür.Clicking either the Add Products from Shipment or Cancel buttons returns you to the display interface.

Note

Ekleme arabirimini görüntülerken, birim fiyat metin kutularındaki Comparedoğrulayıcıları test etmek için bir dakikanızı ayırın.While viewing the inserting interface, take a moment to test out the CompareValidators on the unit price TextBoxes. Geçersiz para birimi değerleri veya sıfırdan küçük bir değere sahip fiyatlarla, sevkıyata ürün Ekle düğmesine tıkladığınızda bir istemci tarafı MessageBox uyarısı görmeniz gerekir.You should see a client-side messagebox warning when clicking the Add Products from Shipment button with invalid currency values or prices with a value less than zero.

Işlem ürün sevkıyatı düğmesine tıklandıktan sonra ekleme arabirimi görüntülenirThe Inserting Interface is Displayed After Clicking the Process Product Shipment Button

Şekil 12: Işlem ürünü sevkiyat düğmesine tıklandıktan sonra ekleme arabirimi görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 12: The Inserting Interface is Displayed After Clicking the Process Product Shipment Button (Click to view full-size image)

4. Adım: ürünleri eklemeStep 4: Adding the Products

Bu öğretici için her şey, ürünleri sevkiyat düğmesinden Click olay işleyicisinden veritabanına kaydetmesidir.All that remains for this tutorial is to save the products to the database in the Add Products from Shipment Button s Click event handler. Bu, ProductsDataTable oluşturularak ve sağlanan ürün adlarının her biri için bir ProductsRow örneği eklenerek gerçekleştirilebilir.This can be accomplished by creating a ProductsDataTable and adding a ProductsRow instance for each of the product names supplied. Bu ProductsRow eklendikten sonra, ProductsDataTablegeçen ProductsBLL sınıfı s UpdateWithTransaction yöntemine çağrı yapılır.Once these ProductsRow s have been added we will make a call to the ProductsBLL class s UpdateWithTransaction method passing in the ProductsDataTable. Işlem öğreticisindeki sarmalama veritabanı değişiklikleri içinde oluşturulan UpdateWithTransaction yönteminin ProductsDataTable ProductsTableAdapter s UpdateWithTransaction metoduna geçirmediğini hatırlayın.Recall that the UpdateWithTransaction method, which was created back in the Wrapping Database Modifications within a Transaction tutorial, passes the ProductsDataTable to the ProductsTableAdapter s UpdateWithTransaction method. Buradan, bir ADO.NET işlemi başlatılır ve TableAdapter DataTable içindeki her eklenen ProductsRow için veritabanına INSERT bir bildirim yayınlar.From there, an ADO.NET transaction is started and the TableAdapter issues an INSERT statement to the database for each added ProductsRow in the DataTable. Tüm ürünlerin hatasız eklendiği varsayılarak, işlem kaydedilir, aksi takdirde geri alınır.Assuming all products are added without error, the transaction is committed, otherwise it is rolled back.

Sevkiyat düğmesinden (Click etkinlik Ekle) olay işleyicisi için kod aynı zamanda bir hata denetimi gerçekleştirmesi gerekir.The code for the Add Products from Shipment Button s Click event handler also needs to perform a bit of error checking. Ekleme arabiriminde kullanılan bir RequiredFieldValidators olmadığından, Kullanıcı adını atlayarak bir ürünün fiyatını girebilir.Since there are no RequiredFieldValidators used in the inserting interface, a user could enter a price for a product while omitting its name. Ürünün adı gerekli olduğundan, bu tür bir koşul, kullanıcıyı uyarmak ve ekleme işlemine devam etmemiz gerekir.Since the product s name is required, if such a condition unfolds we need to alert the user and not proceed with the inserts. Tüm Click olay işleyicisi kodu aşağıda verilmiştir:The complete Click event handler code follows:

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 truedeğerini döndürmesi sağlanarak başlar.The event handler starts by ensuring that the Page.IsValid property returns a value of true. falsedöndürürse, bir veya daha fazla Comparedoğrulayıcılarının geçersiz verileri bildirdiği anlamına gelir; Böyle bir durumda, girilen ürünleri eklemeye çalışmak istemedik veya Kullanıcı tarafından girilen birim fiyat değerini ProductsRow s UnitPrice özelliğine atamaya çalışırken bir özel durumla karşılaşırsınız.If it returns false, then that means one or more of the CompareValidators are reporting invalid data; in such a case we do not want to attempt to insert the entered products or we'll end up with an exception when attempting to assign the user-entered unit price value to the ProductsRow s UnitPrice property.

Sonra yeni bir ProductsDataTable örneği oluşturulur (products).Next, a new ProductsDataTable instance is created (products). for döngüsü, ürün adı ve birim fiyat metin kutuları üzerinden yinelemek için kullanılır ve Text özellikleri, productName ve unitPriceyerel değişkenlerine okunurdur.A for loop is used to iterate through the product name and unit price TextBoxes and the Text properties are read into the local variables productName and unitPrice. Kullanıcı birim fiyatı için bir değer girdiyseniz ancak karşılık gelen ürün adı için değilse, bir birim fiyat sağlarsanız, ürünün adını da dahil etmeniz ve olay işleyicisine çıkıyması durumunda StatusLabel iletiyi görüntüler.If the user has entered a value for the unit price but not for the corresponding product name, the StatusLabel displays the message If you provide a unit price you must also include the name of the product and the event handler is exited.

Bir ürün adı sağlanmışsa, ProductsDataTable s NewProductsRow yöntemi kullanılarak yeni bir ProductsRow örneği oluşturulur.If a product name has been provided, a new ProductsRow instance is created using the ProductsDataTable s NewProductsRow method. Bu yeni ProductsRow örneği ProductName özelliği geçerli ürün adı metin kutusuna ayarlanır, ancak SupplierID ve CategoryID özellikleri, ekleme arabirimi s üstbilgisindeki DropDownLists 'in SelectedValue özelliklerine atanır.This new ProductsRow instance s ProductName property is set to the current product name TextBox while the SupplierID and CategoryID properties are assigned to the SelectedValue properties of the DropDownLists in the inserting interface s header. Kullanıcı ürün fiyatı için bir değer girdiyseniz, ProductsRow örnek s UnitPrice özelliğine atanır; Aksi halde, özelliği atanmamış olarak bırakılır ve bu, veritabanındaki UnitPrice NULL bir değere neden olur.If the user entered a value for the product s price, it is assigned to the ProductsRow instance s UnitPrice property; otherwise, the property is left unassigned, which will result in a NULL value for UnitPrice in the database. Son olarak, Discontinued ve UnitsOnOrder özellikleri sırasıyla sabit kodlanmış değerlere false ve 0 ' a atanır.Finally, the Discontinued and UnitsOnOrder properties are assigned to the hard-coded values false and 0, respectively.

Özellikler, ProductsRow örneğine atandıktan sonra, ProductsDataTableeklenir.After the properties have been assigned to the ProductsRow instance it is added to the ProductsDataTable.

for döngüsünün tamamlanmasında, herhangi bir ürünün eklenip eklenmeyeceğini denetliyoruz.At the completion of the for loop, we check whether any products have been added. Kullanıcı, tüm ürün adlarını veya fiyatları girmeden önce, sevk Irsaliyesinden ürün Ekle ' ye tıklamış olabilir.The user may, after all, have clicked the Add Products from Shipment before entering any product names or prices. ProductsDataTableen az bir ürün varsa ProductsBLL sınıf s UpdateWithTransaction yöntemi çağrılır.If there is at least one product in the ProductsDataTable, the ProductsBLL class s UpdateWithTransaction method is called. Daha sonra, veriler ProductsGrid GridView 'a yeniden bağlanır, böylece yeni eklenen ürünlerin görüntüleme arabiriminde görünmesi gerekir.Next, the data is rebound to the ProductsGrid GridView so that the newly added products will appear in the display interface. StatusLabel, bir onay iletisi görüntüleyecek şekilde güncelleştirilir ve ReturnToDisplayInterface çağrılır, ekleme arabirimini gizler ve görüntüleme arabirimini gösterir.The StatusLabel is updated to display a confirmation message and the ReturnToDisplayInterface is invoked, hiding the inserting interface and showing the display interface.

Hiçbir ürün girilmemişse ekleme arabirimi görüntülenmeye devam eder, ancak hiçbir ürün eklenmedi.If no products were entered, the inserting interface remains displayed but the message No products were added. Lütfen metin kutularına ürün adlarını ve birim fiyatlarını girin.Please enter the product names and unit prices in the textboxes is displayed.

Şekil s 13, 14 ve 15, ekleme ve görüntüleme arabirimlerini eylemde gösterir.Figure s 13, 14, and 15 show the inserting and display interfaces in action. Şekil 13 ' te, Kullanıcı karşılık gelen bir ürün adı olmadan bir birim fiyat değeri girmiştir.In Figure 13, the user has entered a unit price value without a corresponding product name. Şekil 14 ' te, üç yeni ürün başarıyla eklendikten sonra görüntüleme arabirimi gösterilmektedir, Şekil 15 ' te yeni eklenen ürünlerden ikisi (üçüncü bir önceki sayfada bulunur) gösterilir.Figure 14 shows the display interface after three new products have been added successfully, while Figure 15 shows two of the newly added products in the GridView (the third one is on the previous page).

Birim fiyatı girilirken bir ürün adı gerekirA Product Name is Required When Entering a Unit Price

Şekil 13: birim fiyatını girerken bir ürün adı gereklidir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 13: A Product Name is Required When Entering a Unit Price (Click to view full-size image)

Tedarikçi Mayumi s için üç yeni grup eklenmiştirThree New Veggies Have Been Added for the Supplier Mayumi s

Şekil 14: Tedarikçi Mayumi s Için üç yeni vegon eklendi (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 14: Three New Veggies Have Been Added for the Supplier Mayumi s (Click to view full-size image)

Yeni Ürünler GridView 'un son sayfasında bulunabilir The New Products Can Be Found in the Last Page of the GridView

Ş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)Figure 15: The New Products Can Be Found in the Last Page of the GridView (Click to view full-size image)

Note

Bu öğreticide kullanılan toplu ekleme mantığı, işlem kapsamındaki eklemeleri sarmalanmış.The batch inserting logic used in this tutorial wraps the inserts within the scope of transaction. Bunu doğrulamak için, bir veritabanı düzeyindeki hatayı tam olarak tanıtın.To verify this, purposefully introduce a database-level error. Örneğin, yeni ProductsRow örnek s CategoryID özelliğini Categories DropDownList içindeki seçili değere atamak yerine i * 5gibi bir değere atayın.For example, rather than assigning the new ProductsRow instance s CategoryID property to the selected value in the Categories DropDownList, assign it to a value like i * 5. Burada i Loop Indexer ve 1 ile 5 arasında değişen değerler vardır.Here i is the loop indexer and has values ranging from 1 to 5. Bu nedenle, toplu işteki iki veya daha fazla ürün eklenirken ilk ürünün geçerli bir CategoryID değeri (5) olacaktır, ancak sonraki ürünlerin Categories tablosundaki CategoryID değerlerle eşleşmeyen CategoryID değerleri olacaktır.Therefore, when adding two or more products in batch insert the first product will have a valid CategoryID value (5), but subsequent products will have CategoryID values that do not match up to CategoryID values in the Categories table. Ağ etkisi, ilk INSERT başarılı olacağı ve sonrasında bir yabancı anahtar kısıtlaması ihlalinden sonra başarısız olacak.The net effect is that while the first INSERT will succeed, subsequent ones will fail with a foreign key constraint violation. Batch INSERT atomik olduğundan, ilk INSERT geri alınacak ve toplu işlem ekleme işlemi başlamadan önce veritabanını durumuna döndürmeyecektir.Since the batch insert is atomic, the first INSERT will be rolled back, returning the database to its state before the batch insert process began.

ÖzetSummary

Bu ve önceki iki öğreticide, verilerin toplu olarak güncelleştirilmesine, silinmesine ve eklenmesine izin veren arabirimler oluşturdunuz ve bu işlem, bir işlem öğreticisindeki sarmalama veritabanı değişiklikleri Içindeki veri erişim katmanına eklediğimiz işlem desteğini kullandı.Over this and the previous two tutorials we have created interfaces that allow for updating, deleting, and inserting batches of data, all of which used the transaction support we added to the Data Access Layer in the Wrapping Database Modifications within a Transaction tutorial. Bazı senaryolarda, bu tür toplu işleme kullanıcı arabirimleri tıklama, geri alma ve klavyeden fare bağlam anahtarlarının sayısını izleyerek Son Kullanıcı verimliliğini büyük ölçüde geliştirir ve ayrıca temel alınan verilerin bütünlüğünü de sürdürmenize olanak sağlar.For certain scenarios, such batch processing user interfaces greatly improve end user efficiency by cutting down on the number of clicks, postbacks, and keyboard-to-mouse context switches, while also maintaining the integrity of the underlying data.

Bu öğretici, toplu verilerle çalışma hakkındaki görünmizi tamamlar.This tutorial completes our look at working with batched data. Sonraki öğreticilerde, TableAdapter s yöntemlerindeki saklı yordamları kullanma, DAL içinde bağlantı ve komut düzeyi ayarlarını yapılandırma, bağlantı dizelerini şifreleme ve daha fazlasını içeren çeşitli gelişmiş veri erişim katmanı senaryoları ele maktadır!The next set of tutorials explores a variety of advanced Data Access Layer scenarios, including using stored procedures in the TableAdapter s methods, configuring connection- and command-level settings in the DAL, encrypting connection strings, and more!

Programlamanın kutlu olsun!Happy Programming!

Yazar hakkındaAbout the Author

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.comadresinden erişilebilir .He can be reached at mitchell@4GuysFromRolla.com. ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.or via his blog, which can be found at http://ScottOnWriting.NET.

Özel olarak teşekkürlerSpecial Thanks To

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Bu öğreticide lider gözden geçirenler, kton Giesenow ve S Ren Jacob Lauritsen.Lead reviewers for this tutorial were Hilton Giesenow and S ren Jacob Lauritsen. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .If so, drop me a line at mitchell@4GuysFromRolla.com.