Toplu Güncelleştirme (C#)Batch Updating (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ı güncelleştirmeyi öğrenin.Learn how to update multiple database records in a single operation. Kullanıcı arabirimi katmanında her bir satırın düzenlenebildiği bir GridView oluşturacağız.In the User Interface Layer we build a GridView where each row is editable. Veri erişim katmanında, tüm güncelleştirmelerin başarılı veya tüm güncelleştirmelerin geri alındığından emin olmak için bir işlem içindeki birden çok güncelleştirme işlemini sardık.In the Data Access Layer we wrap the multiple Update operations within a transaction to ensure that all updates succeed or all updates are rolled back.

GirişIntroduction

Önceki öğreticide , veritabanı işlemleri için destek eklemek üzere veri erişim katmanını genişletmeyi gördük.In the preceding tutorial we saw how to extend the Data Access Layer to add support for database transactions. Veritabanı işlemleri, bir dizi veri değiştirme deyimlerinin tek bir atomik işlem olarak değerlendirilip tüm değişikliklerin başarısız olacağını veya tümünün başarılı olacağını güvence altına alır.Database transactions guarantee that a series of data modification statements will be treated as one atomic operation, which ensures that all modifications will fail or all will succeed. Bu alt düzey DAL işlevselliği sayesinde, toplu veri değiştirme arabirimlerini oluşturmak için ilgilenmeniz bizim için hazır hale gelmiştir.With this low-level DAL functionality out of the way, we re ready to turn our attention to creating batch data modification interfaces.

Bu öğreticide her bir satırın düzenlenebildiği bir GridView oluşturacağız (bkz. Şekil 1).In this tutorial we'll build a GridView where each row is editable (see Figure 1). Her satır düzenleme arabiriminde işlendiği için, Düzenle, Güncelleştir ve Iptal düğmeleri sütunu için gerekli değildir.Since each row is rendered in its editing interface, there s no need for a column of Edit, Update, and Cancel buttons. Bunun yerine sayfada iki güncelleştirme ürünü düğmesi bulunur, tıklandığı zaman GridView satırlarını numaralandırın ve veritabanını güncelleştirebilirsiniz.Instead, there are two Update Products buttons on the page that, when clicked, enumerate the GridView rows and update the database.

GridView 'daki her satır düzenlenebilirEach Row in the GridView is Editable

Şekil 1: GridView 'Daki her satır düzenlenebilir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 1: Each Row in the GridView is Editable (Click to view full-size image)

Haydi başlayın!Let s get started!

Note

Toplu güncelleştirmeler gerçekleştirme öğreticisinde, DataList denetimini kullanarak bir toplu iş düzenlemesi arabirimi oluşturduk.In the Performing Batch Updates tutorial we created a batch editing interface using the DataList control. Bu öğretici, ' deki bir GridView kullanan ve toplu güncelleştirme bir işlemin kapsamı içinde gerçekleştirilen bir öncekinden farklıdır.This tutorial differs from the previous one in that is uses a GridView and the batch update is performed within the scope of a transaction. Bu Öğreticiyi tamamladıktan sonra, önceki öğreticiye geri dönmeli ve önceki öğreticide eklenen veritabanı işlemi ile ilgili işlevselliği kullanmak için onu güncelleştirmeniz önerilir.After completing this tutorial I encourage you to return to the earlier tutorial and update it to use the database transaction-related functionality added in the preceding tutorial.

Tüm GridView satırlarını düzenlenebilir yapma adımları inceleniyorExamining the Steps for Making All GridView Rows Editable

Veri öğreticisini ekleme, güncelleştirme ve silmeye genel bakış konusunda açıklandığı gibi, GridView, temel alınan verilerinin satır başına düzenlenmesine yönelik yerleşik destek sunar.As discussed in the An Overview of Inserting, Updating, and Deleting Data tutorial, the GridView offers built-in support for editing its underlying data on a per-row basis. Dahili olarak, GridView, EditIndex özelliğiaracılığıyla hangi satırın düzenlenebilir olduğunu not edin.Internally, the GridView notes what row is editable through its EditIndex property. GridView kendi veri kaynağına bağladığından, satırın dizininin EditIndexdeğerine eşit olup olmadığını görmek için her bir satırı kontrol eder.As the GridView is being bound to its data source, it checks each row to see if the index of the row equals the value of EditIndex. Bu durumda, satır s alanları kendi düzen arabirimleri kullanılarak işlenir.If so, that row s fields are rendered using their editing interfaces. BoundFields için, düzen arabirimi, Text özelliğine, BoundField s DataField özelliği tarafından belirtilen veri alanının değeri atanmış olan bir TextBox.For BoundFields, the editing interface is a TextBox whose Text property is assigned the value of the data field specified by the BoundField s DataField property. TemplateFields için, EditItemTemplate ItemTemplateyerine kullanılır.For TemplateFields, the EditItemTemplate is used in place of the ItemTemplate.

Kullanıcı bir satır Düzenle düğmesine tıkladığında düzenleme iş akışının başlayacağını geri çekin.Recall that the editing workflow starts when a user clicks a row s Edit button. Bu, bir geri göndermeye neden olur, GridView s EditIndex özelliğini tıklanmış satır s dizinine ayarlar ve verileri kılavuza yeniden bağlar.This causes a postback, sets the GridView s EditIndex property to the clicked row s index, and rebinds the data to the grid. Bir satır s Iptal düğmesine tıklandığında, geri göndermede EditIndex, verileri kılavuza yeniden bağlanmadan önce -1 bir değere ayarlanır.When a row s Cancel button is clicked, on postback the EditIndex is set to a value of -1 before rebinding the data to the grid. GridView s satırları dizin oluşturmaya başladıktan sonra, EditIndex -1 ayarı GridView 'un salt okuma modunda görüntülenmesine etkisi vardır.Since the GridView s rows start indexing at zero, setting EditIndex to -1 has the effect of displaying the GridView in read-only mode.

EditIndex özelliği satır başına düzenlemede iyi işlem yapıyor, ancak toplu düzenlemeyle ilgili tasarlanmamıştır.The EditIndex property works well for per-row editing, but is not designed for batch editing. GridView 'un tamamını düzenlenebilir hale getirmek için, her satırı düzenleme arabirimini kullanarak işlememiz gerekir.To make the entire GridView editable, we need to have each row render using its editing interface. Bunu yapmanın en kolay yolu, her düzenlenebilir alanın, ItemTemplatetanımlı düzenleme arabirimiyle birlikte TemplateField olarak uygulandığını oluşturmaktır.The easiest way to accomplish this is to create where each editable field is implemented as a TemplateField with its editing interface defined in the ItemTemplate.

Sonraki birkaç adımda tamamen düzenlenebilir bir GridView oluşturacağız.Over the next several steps we'll create a completely editable GridView. Adım 1 ' de, GridView ve ObjectDataSource oluşturup BoundFields ve CheckBoxField 'ı TemplateFields 'e dönüştürerek başlayacağız.In Step 1 we'll start by creating the GridView and its ObjectDataSource and convert its BoundFields and CheckBoxField into TemplateFields. Adım 2 ve 3 ' te, TemplateFields EditItemTemplate öğeleri ItemTemplate s ' ye taşıyacağız.In Steps 2 and 3 we'll move the editing interfaces from the TemplateFields EditItemTemplate s to their ItemTemplate s.

1. Adım: ürün bilgilerini görüntülemeStep 1: Displaying Product Information

Satırların düzenlenebildiği bir GridView oluşturma konusunda endişelenmemiz için öncelikle ürün bilgilerini görüntüleyerek başlayın.Before we worry about creating a GridView where are rows are editable, let s start by simply displaying the product information. BatchData klasöründeki BatchUpdate.aspx sayfasını açın ve araç kutusundan Tasarımcı üzerine bir GridView sürükleyin.Open the BatchUpdate.aspx page in the BatchData folder and drag a GridView from the Toolbox onto the Designer. GridView s ID ProductsGrid ve akıllı etiketinden ProductsDataSourceadlı yeni bir ObjectDataSource 'a bağlamayı seçin.Set the GridView s ID to ProductsGrid and, from its smart tag, choose to bind it to a new ObjectDataSource named ProductsDataSource. ProductsBLL sınıf s GetProducts yönteminden verileri almak için ObjectDataSource 'ı yapılandırın.Configure the ObjectDataSource to retrieve its data from the ProductsBLL class s GetProducts method.

, ObjectDataSource 'ı ProductsBLL sınıfını kullanacak şekilde yapılandırmaConfigure the ObjectDataSource to Use the ProductsBLL Class

Şekil 2: ProductsBLL sınıfını kullanmak için ObjectDataSource 'ı yapılandırma (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 2: Configure the ObjectDataSource to Use the ProductsBLL Class (Click to view full-size image)

GetProducts metodunu kullanarak ürün verilerini alma Retrieve the Product Data Using the GetProducts Method

Şekil 3: GetProducts yöntemi kullanarak ürün verilerini alma (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 3: Retrieve the Product Data Using the GetProducts Method (Click to view full-size image)

GridView gibi, ObjectDataSource 'un değişiklik özellikleri satır başına olarak çalışacak şekilde tasarlanmıştır.Like the GridView, the ObjectDataSource s modification features are designed to work on a per-row basis. Bir kayıt kümesini güncelleştirmek için, verileri toplu olarak izleyen ve BLL 'e ileten ASP.NET Page for Code arka plan sınıfında bir kod yazmanız gerekir.In order to update a set of records, we'll need to write a bit of code in the ASP.NET page s code-behind class that batches the data and passes it to the BLL. Bu nedenle, ObjectDataSource 'un GÜNCELLEŞTIRME, ekleme ve SILME sekmelerinden açılan listeleri (hiçbiri) ayarlayın.Therefore, set the drop-down lists in the ObjectDataSource s UPDATE, INSERT, and DELETE tabs to (None). Sihirbazı tamamladığınızda son ' a tıklayın.Click Finish to complete the wizard.

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)

Veri kaynağı Yapılandırma Sihirbazı 'nı tamamladıktan sonra, ObjectDataSource tarafından bildirim temelli biçimlendirme aşağıdaki gibi görünmelidir:After completing the Configure Data Source wizard, the ObjectDataSource s declarative markup should look like the following:

<asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>

Veri kaynağı Yapılandırma Sihirbazı 'nı tamamlamak, Visual Studio 'Nun, GridView 'daki ürün verileri alanları için BoundFields ve CheckBoxField oluşturmasına neden olur.Completing the Configure Data Source wizard also causes Visual Studio to create BoundFields and a CheckBoxField for the product data fields in the GridView. Bu öğreticide, s yalnızca kullanıcının ürün adını, kategorisini, fiyatını ve Discontinued durumunu görüntülemesine ve düzenlemesine izin verir.For this tutorial, let s only allow the user to view and edit the product s name, category, price, and discontinued status. ProductName, CategoryName, UnitPriceve Discontinued alanları hariç tümünü kaldırın ve ilk üç alanın HeaderText özelliklerini sırasıyla ürün, kategori ve fiyat olarak yeniden adlandırın.Remove all but the ProductName, CategoryName, UnitPrice, and Discontinued fields and rename the HeaderText properties of the first three fields to Product, Category, and Price, respectively. Son olarak, GridView s akıllı etiketinde Sayfalamayı Etkinleştir ve sıralamayı etkinleştir onay kutularını işaretleyin.Lastly, check the Enable Paging and Enable Sorting checkboxes in the GridView s smart tag.

Bu noktada GridView üç BoundFields (ProductName, CategoryNameve UnitPrice) ve bir CheckBoxField (Discontinued) içerir.At this point the GridView has three BoundFields (ProductName, CategoryName, and UnitPrice) and a CheckBoxField (Discontinued). Bu dört alanı TemplateFields 'e dönüştürmemiz ve daha sonra TemplateField EditItemTemplate düzen arabirimini ItemTemplateolarak taşımanız gerekir.We need to convert these four fields into TemplateFields and then move the editing interface from the TemplateField s EditItemTemplate to its ItemTemplate.

Note

Veri değişikliği arabirimini özelleştirme öğreticisinde templatefields oluşturmayı ve özelleştirmeyi araştırıyoruz.We explored creating and customizing TemplateFields in the Customizing the Data Modification Interface tutorial. BoundFields ve CheckBoxField değerlerini TemplateFields 'e dönüştürme ve ItemTemplate s 'de kendi düzen arabirimlerini tanımlama adımlarını inceleyeceğiz, ancak takıldıysanız veya bir yenileyici gerekiyorsa, bu önceki öğreticiye geri başvurmaktan çekinmeyin.We'll walk through the steps of converting the BoundFields and CheckBoxField into TemplateFields and defining their editing interfaces in their ItemTemplate s, but if you get stuck or need a refresher, don t hesitate to refer back to this earlier tutorial.

GridView s akıllı etiketinden sütunları düzenle bağlantısına tıklayarak alanlar iletişim kutusunu açın.From the GridView s smart tag, click the Edit Columns link to open the Fields dialog box. Ardından, her bir alanı seçin ve bu alanı bir TemplateField öğesine Dönüştür bağlantısına tıklayın.Next, select each field and click the Convert this field into a TemplateField link.

Mevcut BoundFields ve CheckBoxField 'ı TemplateField 'A Dönüştür

Şekil 5: mevcut boundfields ve CheckBoxField 'ı TemplateField 'a DönüştürFigure 5: Convert the Existing BoundFields and CheckBoxField Into TemplateField

Artık her bir alan bir TemplateField olduğuna göre, EditItemTemplate s ' den ItemTemplate s öğesine kadar olan geçiş arabirimini taşımaya hazır hale gelmiştir.Now that each field is a TemplateField, we re ready to move the editing interface from the EditItemTemplate s to the ItemTemplate s.

2. Adım:ProductName,UnitPriceveDiscontinueddüzen arabirimlerini oluşturmaStep 2: Creating theProductName,UnitPrice, andDiscontinuedEditing Interfaces

ProductName, UnitPriceve Discontinued düzen arabirimlerinin oluşturulması, bu adımın konusu olduğunu ve her bir arabirim TemplateField s EditItemTemplatezaten tanımlandığından oldukça basittir.Creating the ProductName, UnitPrice, and Discontinued editing interfaces are the topic of this step and are pretty straightforward, as each interface is already defined in the TemplateField s EditItemTemplate. CategoryName düzen arabirimini oluşturmak, uygulanabilir kategorilerin bir DropDownList 'i oluşturmamız gerektiğinden biraz daha karmaşıktır.Creating the CategoryName editing interface is a bit more involved since we need to create a DropDownList of the applicable categories. Bu CategoryName düzen arabirimi adım 3 ' te bir grup değildir.This CategoryName editing interface is tackled in Step 3.

S ProductName TemplateField ile başlayalım.Let s start with the ProductName TemplateField. GridView s akıllı etiketinden Şablonları Düzenle bağlantısına tıklayın ve ProductName TemplateField EditItemTemplate' a gidin.Click on the Edit Templates link from the GridView s smart tag and drill down to the ProductName TemplateField s EditItemTemplate. Metin kutusunu seçin, panoya kopyalayın ve sonra ProductName TemplateField s ItemTemplateyapıştırın.Select the TextBox, copy it to the clipboard, and then paste it to the ProductName TemplateField s ItemTemplate. TextBox s ID özelliğini ProductNameolacak şekilde değiştirin.Change the TextBox s ID property to ProductName.

Sonra, kullanıcının her bir ürün adı için bir değer sağladığından emin olmak için ItemTemplate bir RequiredFieldValidator ekleyin.Next, add a RequiredFieldValidator to the ItemTemplate to ensure that the user provides a value for each product s name. ControlToValidate özelliğini ProductName olarak ayarlayın, ErrorMessage özelliği ürünün adını sağlamanız gerekir.Set the ControlToValidate property to ProductName, the ErrorMessage property to You must provide the product's name. ve *Text özelliği.and the Text property to *. Bu ItemTemplateeklemeler yapıldıktan sonra, ekranınızın Şekil 6 ' ya benzer olması gerekir.After making these additions to the ItemTemplate, your screen should look similar to Figure 6.

ProductName TemplateField artık bir TextBox ve bir RequiredFieldValidator IçeriyorThe ProductName TemplateField Now Includes a TextBox and a RequiredFieldValidator

Şekil 6: ProductName TemplateField artık bir TextBox ve bir RequiredFieldValidator içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 6: The ProductName TemplateField Now Includes a TextBox and a RequiredFieldValidator (Click to view full-size image)

UnitPrice Editing arabirimi için, metin kutusunu EditItemTemplate ItemTemplatekopyalayarak başlayın.For the UnitPrice editing interface, start by copying the TextBox from the EditItemTemplate to the ItemTemplate. Sonra, TextBox ' ın önüne bir $ yerleştirip, ID özelliğini BirimFiyat ve Columns özelliğini 8 olarak ayarlayın.Next, place a $ in front of the TextBox and set its ID property to UnitPrice and its Columns property to 8 .

Ayrıca, Kullanıcı tarafından girilen değerin $0,00 ' den büyük veya buna eşit geçerli bir para birimi değeri olduğundan emin olmak için UnitPrice s ItemTemplate bir CompareValidator ekleyin.Also add a CompareValidator to the UnitPrice s ItemTemplate to ensure that the value entered by the user is a valid currency value greater than or equal to $0.00. Validator ControlToValidate özelliğini UnitPrice olarak ayarlayın, ErrorMessage özelliği için geçerli bir para birimi değeri girmeniz gerekir.Set the validator s ControlToValidate property to UnitPrice, its ErrorMessage property to You must enter a valid currency value. Lütfen herhangi bir para birimi simgesini *, Type özelliğini Currency``Text, Operator özelliğini GreaterThanEqual``ValueToCompare ve özelliğini 0 olarak atlayın.Please omit any currency symbols., its Text property to *, its Type property to Currency, its Operator property to GreaterThanEqual, and its ValueToCompare property to 0 .

, girilen fiyatın negatif olmayan bir para birimi değeri olduğundan emin olmak için bir CompareValidator ekleyinAdd a CompareValidator to Ensure the Price Entered is a Non-Negative Currency Value

Şekil 7: girilen fiyatın negatif olmayan bir para birimi değeri olduğundan emin olmak Için bir CompareValidator ekleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 7: Add a CompareValidator to Ensure the Price Entered is a Non-Negative Currency Value (Click to view full-size image)

Discontinued TemplateField alanı için ItemTemplateönceden tanımlanmış onay kutusunu kullanabilirsiniz.For the Discontinued TemplateField you can use the CheckBox already defined in the ItemTemplate. ID, trueolarak Enabled özelliğini Discontinued olarak ayarlamanız yeterlidir.Simply set its ID to Discontinued and its Enabled property to true.

3. Adım:CategoryNameEditing arabirimini oluşturmaStep 3: Creating theCategoryNameEditing Interface

CategoryName TemplateField s EditItemTemplate içindeki Düzenle arabirimi CategoryName veri alanının değerini gösteren bir TextBox içerir.The editing interface in the CategoryName TemplateField s EditItemTemplate contains a TextBox that displays the value of the CategoryName data field. Bunu olası kategorileri listeleyen bir DropDownList ile değiştirdiğinizden ihtiyacımız var.We need to replace this with a DropDownList that lists the possible categories.

Note

Veri değişikliği arabirimini özelleştirme öğreticisini özelleştirmek, bir şablonu özelleştirme hakkında daha kapsamlı ve eksiksiz bir tartışma Içerir ve metin kutusu yerine bir DropDownList içerir.The Customizing the Data Modification Interface tutorial contains a more thorough and complete discussion on customizing a template to include a DropDownList as opposed to a TextBox. Buradaki adımlar tamamlandıktan sonra, bu işlemler özellikle bir şekilde sunulur.While the steps here are complete, they are presented tersely. DropDownList kategorilerini oluşturma ve yapılandırma hakkında daha ayrıntılı bir bakış için veri değişikliği arabirimini özelleştirme öğreticisine bakın.For a more in-depth look at creating and configuring the categories DropDownList, refer back to the Customizing the Data Modification Interface tutorial.

Araç kutusundan bir DropDownList öğesini CategoryName TemplateField s ItemTemplateüzerine sürükleyin, ID Categoriesolarak ayarlar.Drag a DropDownList from the Toolbox onto the CategoryName TemplateField s ItemTemplate, setting its ID to Categories. Bu noktada, genellikle yeni bir ObjectDataSource oluşturarak DropDownLists veri kaynağını akıllı etiketiyle tanımlayacağız.At this point we would usually define the DropDownLists s data source through its smart tag, creating a new ObjectDataSource. Bununla birlikte, bu, her GridView satırı için oluşturulan ObjectDataSource örneği ile sonuçlanacaktır ItemTemplateiçindeki ObjectDataSource 'ı ekler.However, this will add the ObjectDataSource within the ItemTemplate, which will result in an ObjectDataSource instance created for each GridView row. Bunun yerine, ObjectDataSource 'yi GridView s TemplateFields dışındaki oluşturmalarına izin verin.Instead, let s create the ObjectDataSource outside of the GridView s TemplateFields. Şablon düzenlemesini sonlandırın ve araç kutusundan bir ObjectDataSource 'ı ProductsDataSource ObjectDataSource 'un altında tasarımcı üzerine sürükleyin.End the template editing and drag an ObjectDataSource from the Toolbox onto the Designer beneath the ProductsDataSource ObjectDataSource. Yeni ObjectDataSource CategoriesDataSource adlandırın ve CategoriesBLL Class s GetCategories metodunu kullanacak şekilde yapılandırın.Name the new ObjectDataSource CategoriesDataSource and configure it to use the CategoriesBLL class s GetCategories method.

, ObjectDataSource 'un CategoriesBLL sınıfını kullanacak şekilde yapılandırılmasıConfigure the ObjectDataSource to Use the CategoriesBLL Class

Şekil 8: ObjectDataSource 'ı CategoriesBLL sınıfını kullanacak şekilde yapılandırma (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 8: Configure the ObjectDataSource to Use the CategoriesBLL Class (Click to view full-size image)

GetCategories metodunu kullanarak kategori verilerini alma Retrieve the Category Data Using the GetCategories Method

Şekil 9: GetCategories yöntemi kullanarak kategori verilerini alma (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 9: Retrieve the Category Data Using the GetCategories Method (Click to view full-size image)

Bu ObjectDataSource yalnızca verileri almak için kullanıldığından, GÜNCELLEŞTIR ve SIL sekmelerinde açılan listeleri (None) olarak ayarlayın.Since this ObjectDataSource is used merely to retrieve data, set the drop-down lists in the UPDATE and DELETE tabs to (None). Sihirbazı tamamladığınızda son ' a tıklayın.Click Finish to complete the wizard.

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

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

Sihirbazı tamamladıktan sonra, CategoriesDataSource s bildirime dayalı biçimlendirme aşağıdaki gibi görünmelidir:After completing the wizard, the CategoriesDataSource s declarative markup should look like the following:

<asp:ObjectDataSource ID="CategoriesDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>

Oluşturulan ve yapılandırılan CategoriesDataSource CategoryName TemplateField s ItemTemplate ve DropDownList s akıllı etiketinde veri kaynağı Seç bağlantısına tıklayın.With the CategoriesDataSource created and configured, return to the CategoryName TemplateField s ItemTemplate and, from the DropDownList s smart tag, click on the Choose Data Source link. Veri kaynağı Yapılandırma sihirbazında, ilk açılan listeden CategoriesDataSource seçeneğini belirleyin ve ekran için CategoryName ve değer olarak CategoryID ' yı seçin.In the Data Source Configuration wizard, select the CategoriesDataSource option from the first drop-down list and choose to have CategoryName used for the display and CategoryID as the value.

DropDownList 'i CategoriesDataSource 'a bağlama Bind the DropDownList to the CategoriesDataSource

Şekil 11: DropDownList 'i CategoriesDataSource bağlama (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 11: Bind the DropDownList to the CategoriesDataSource (Click to view full-size image)

Bu noktada Categories DropDownList tüm kategorileri listeler, ancak GridView satırına bağlantılı ürün için uygun kategoriyi henüz otomatik olarak seçmeyin.At this point the Categories DropDownList lists all of the categories, but it does not yet automatically select the appropriate category for the product bound to the GridView row. Bunu gerçekleştirmek için Categories DropDownList s SelectedValue ürün s CategoryID değerine ayarlamanız gerekir.To accomplish this we need to set the Categories DropDownList s SelectedValue to the product s CategoryID value. DropDownList s akıllı etiketinden DataBindings 'i düzenle bağlantısına tıklayın ve SelectedValue özelliğini Şekil 12 ' de gösterildiği gibi CategoryID Data alanı ile ilişkilendirin.Click on the Edit DataBindings link from the DropDownList s smart tag and associate the SelectedValue property with the CategoryID data field as shown in Figure 12.

Product s CategoryID değerini DropDownList s SelectedValue özelliğine bağlayın

Şekil 12: ürün s CategoryID değerini DropDownList s SelectedValue özelliğine bağlamaFigure 12: Bind the Product s CategoryID Value to the DropDownList s SelectedValue Property

Son bir sorun kalır: ürünün CategoryID bir değeri belirtilmemişse, SelectedValue veri bağlama deyimlerinin bir özel durumla sonuçlanacaktır.One last problem remains: if the product doesn t have a CategoryID value specified then the databinding statement on SelectedValue will result in an exception. Bunun nedeni, DropDownList 'in yalnızca kategoriler için öğeler içermesi ve CategoryIDiçin NULL veritabanı değeri olan ürünler için bir seçenek sunmamaktadır.This is because the DropDownList contains only items for the categories and does not offer an option for those products that have a NULL database value for CategoryID. Bu sorunu gidermek için, DropDownList s AppendDataBoundItems özelliğini true olarak ayarlayın ve DropDownList 'e yeni bir öğe ekleyerek bildirime dayalı sözdiziminden Value özelliğini atlayarak.To remedy this, set the DropDownList s AppendDataBoundItems property to true and add a new item to the DropDownList, omitting the Value property from the declarative syntax. Diğer bir deyişle, Categories DropDownList s bildirime dayalı sözdiziminin aşağıdaki gibi göründüğünden emin olun:That is, make sure that the Categories DropDownList s declarative syntax looks like the following:

<asp:DropDownList ID="Categories" runat="server" AppendDataBoundItems="True" 
    DataSourceID="CategoriesDataSource" DataTextField="CategoryName" 
    DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'>
    <asp:ListItem Value=">-- Select One --</asp:ListItem>
</asp:DropDownList>

<asp:ListItem Value="">--Select One--Value özniteliğini açık bir şekilde boş bir dizeye nasıl ayarlayabileceğinizi aklınızda edin.Note how the <asp:ListItem Value=""> -- Select One -- has its Value attribute explicitly set to an empty string. NULL durumunu işlemek için bu ek DropDownList öğesinin neden gerekli olduğu ve Value özelliğinin boş bir dizeye atanmasının ne kadar önemli olduğunu hakkında daha ayrıntılı bir tartışma için veri değişikliği arabirimini özelleştirme öğreticisine geri bakın.Refer back to the Customizing the Data Modification Interface tutorial for a more thorough discussion on why this additional DropDownList item is needed to handle the NULL case and why assignment of the Value property to an empty string is essential.

Note

Burada, gereken olası bir performans ve ölçeklenebilirlik sorunu vardır.There is a potential performance and scalability issue here that is worth mentioning. Her satırda, veri kaynağı olarak CategoriesDataSource kullanan bir DropDownList bulunduğundan, CategoriesBLL sınıf s GetCategories yöntemi sayfa ziyaret başına n kez adlandırılır; burada n , GridView 'daki satır sayısıdır.Since each row has a DropDownList that uses the CategoriesDataSource as its data source, the CategoriesBLL class s GetCategories method will be called n times per page visit, where n is the number of rows in the GridView. Bu n GetCategories çağrısı, veritabanına n sorgu ile sonuçlanır.These n calls to GetCategories result in n queries to the database. Veritabanı üzerindeki bu etki, döndürülen kategorilerin istek başına önbellekte ya da SQL önbellek bağımlılığı veya çok kısa bir süre tabanlı süre sonu kullanılarak önbelleğe alma katmanında önbelleğe alınarak azaltılabilir.This impact on the database could be lessened by caching the returned categories either in a per-request cache or through the Caching Layer using a SQL caching dependency or a very short time-based expiry. İstek başına önbelleğe alma seçeneği hakkında daha fazla bilgi için, bkz. Istek başına önbellek deposuHttpContext.Items.For more information on the per-request caching option, see HttpContext.Items a Per-Request Cache Store.

4. Adım: düzen arabirimini tamamlamaStep 4: Completing the Editing Interface

İlerleme durumunu görüntülemek için, ' i duraklatmadan GridView s şablonlarında birkaç değişiklik yaptık.We ve made a number of changes to the GridView s templates without pausing to view our progress. 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 13 ' te gösterildiği gibi, her satır, onun ItemTemplatekullanılarak işlenir ve bu da hücre s Editing arabirimini içerir.As Figure 13 shows, each row is rendered using its ItemTemplate, which contains the cell s editing interface.

Her GridView satırı düzenlenebilirEach GridView Row is Editable

Şekil 13: her GridView satırı düzenlenebilir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 13: Each GridView Row is Editable (Click to view full-size image)

Bu noktada ilgilenmemiz gereken birkaç küçük biçimlendirme sorunu vardır.There are a few minor formatting issues that we should take care of at this point. İlk olarak, UnitPrice değerinin dört ondalık noktası içerdiğini unutmayın.First, note that the UnitPrice value contains four decimal points. Bunu yapmak için, UnitPrice TemplateField s ItemTemplate geri dönüp metin kutusu s akıllı etiketinden, DataBindings 'i düzenle bağlantısına tıklayın.To fix this, return to the UnitPrice TemplateField s ItemTemplate and, from the TextBox s smart tag, click on the Edit DataBindings link. Sonra, Text özelliğinin bir sayı olarak biçimlendirilmesi gerektiğini belirtin.Next, specify that the Text property should be formatted as a number.

Metin özelliğini bir sayı olarak biçimlendirin

Şekil 14: Text özelliğini sayı olarak biçimlendirmeFigure 14: Format the Text Property as a Number

İkincisi, Discontinued sütunundaki onay kutusunu ortalamasına izin ver (sola hizalı olmasını yerine).Second, let s center the checkbox in the Discontinued column (rather than having it left-aligned). GridView s akıllı etiketinden sütunları Düzenle ' ye tıklayın ve sol alt köşedeki alanlar listesinden Discontinued TemplateField ' ı seçin.Click on Edit Columns from the GridView s smart tag and select the Discontinued TemplateField from the list of fields in the bottom left corner. ItemStyle detaya gidin ve şekil 15 ' te gösterildiği gibi HorizontalAlign özelliğini Center olarak ayarlayın.Drill down into ItemStyle and set the HorizontalAlign property to Center as shown in Figure 15.

Discontinued onay kutusunu Ortala

Şekil 15: Discontinued onay kutusunu ortalayınFigure 15: Center the Discontinued CheckBox

Sonra, sayfaya bir ValidationSummary denetimi ekleyin ve ShowMessageBox özelliğini true ve ShowSummary özelliğini falseolarak ayarlayın.Next, add a ValidationSummary control to the page and set its ShowMessageBox property to true and its ShowSummary property to false. Ayrıca, tıklandığında Kullanıcı değişikliklerinin güncelleştirilmesini sağlayacak olan düğme Web denetimlerini de ekleyin.Also add the Button Web controls that, when clicked, will update the user s changes. Özellikle, GridView 'un üzerinde bir tane olmak üzere iki düğme web denetimi ekleyin, her iki denetimi de ürünleri güncelleştirmek için Text özellikleri.Specifically, add two Button Web controls, one above the GridView and one below it, setting both controls Text properties to Update Products .

GridView s Düzenle arabirimi TemplateFields ItemTemplate s içinde tanımlandığından, EditItemTemplate s gereksiz olduğundan silinebilir.Since the GridView s editing interface is defined in its TemplateFields ItemTemplate s, the EditItemTemplate s are superfluous and may be deleted.

Yukarıda bahsedilen biçimlendirme değişikliklerini yaptıktan sonra, düğme denetimlerini ekleyerek ve gereksiz EditItemTemplate s 'yi kaldırarak, sayfa oluşturma sözdiziminizin aşağıdaki gibi görünmesi gerekir:After making the above mentioned formatting changes, adding the Button controls, and removing the unnecessary EditItemTemplate s, your page s declarative syntax should look like the following:

<p>
    <asp:Button ID="UpdateAllProducts1" runat="server" Text="Update Products" />
</p>
<p>
    <asp:GridView ID="ProductsGrid" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="ProductID" DataSourceID="ProductsDataSource" 
        AllowPaging="True" AllowSorting="True">
        <Columns>
            <asp:TemplateField HeaderText="Product" SortExpression="ProductName">
                <ItemTemplate>
                    <asp:TextBox ID="ProductName" runat="server" 
                        Text='<%# Bind("ProductName") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
                        ControlToValidate="ProductName"
                        ErrorMessage="You must provide the product's name." 
                        runat="server">*</asp:RequiredFieldValidator>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Category" 
                SortExpression="CategoryName">
                <ItemTemplate>
                    <asp:DropDownList ID="Categories" runat="server" 
                        AppendDataBoundItems="True" 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName" 
                        DataValueField="CategoryID" 
                        SelectedValue='<%# Bind("CategoryID") %>'>
                        <asp:ListItem>-- Select One --</asp:ListItem>
                    </asp:DropDownList>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Price" 
                SortExpression="UnitPrice">
                <ItemTemplate>
                    $<asp:TextBox ID="UnitPrice" runat="server" Columns="8" 
                        Text='<%# Bind("UnitPrice", "{0:N}") %>'></asp:TextBox>
                    <asp:CompareValidator ID="CompareValidator1" runat="server" 
                        ControlToValidate="UnitPrice"
                        ErrorMessage="You must enter a valid currency value. 
                                      Please omit any currency symbols."
                        Operator="GreaterThanEqual" Type="Currency" 
                        ValueToCompare="0">*</asp:CompareValidator>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
                <ItemTemplate>
                    <asp:CheckBox ID="Discontinued" runat="server" 
                        Checked='<%# Bind("Discontinued") %>' />
                </ItemTemplate>
                <ItemStyle HorizontalAlign="Center" />
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</p>
<p>
    <asp:Button ID="UpdateAllProducts2" runat="server" Text="Update Products" />
    <asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
        OldValuesParameterFormatString="original_{0}"
        SelectMethod="GetProducts" TypeName="ProductsBLL">
    </asp:ObjectDataSource>
    <asp:ObjectDataSource ID="CategoriesDataSource" runat="server" 
        OldValuesParameterFormatString="original_{0}"
        SelectMethod="GetCategories" TypeName="CategoriesBLL">
    </asp:ObjectDataSource>
    <asp:ValidationSummary ID="ValidationSummary1" runat="server" 
        ShowMessageBox="True" ShowSummary="False" />
</p>

Şekil 16, düğme Web denetimleri eklendikten ve biçimlendirme değişiklikleri yapıldıktan sonra bir tarayıcı aracılığıyla görüntülendiğinde bu sayfayı gösterir.Figure 16 shows this page when viewed through a browser after the Button Web controls have been added and the formatting changes made.

Sayfa artık Iki güncelleştirme ürünü düğmesi IçerirThe Page Now Includes Two Update Products Buttons

Şekil 16: sayfa artık Iki güncelleştirme ürünü düğmesi içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 16: The Page Now Includes Two Update Products Buttons (Click to view full-size image)

5. Adım: ürünleri güncelleştirmeStep 5: Updating the Products

Bir Kullanıcı bu sayfayı ziyaret ettiğinde, değişiklikleri yapar ve ardından iki güncelleştirme ürünü düğmesinden birine tıklamaları gerekir.When a user visits this page they will make their modifications and then click one of the two Update Products buttons. Bu noktada, her satır için Kullanıcı tarafından girilen değerleri bir ProductsDataTable örneğine kaydetmeniz ve sonra bu ProductsDataTable örneğini DAL s UpdateWithTransaction yöntemine geçirecek bir BLL yöntemine iletmemiz gerekir.At that point we need to somehow save the user-entered values for each row into a ProductsDataTable instance and then pass that to a BLL method that will then pass that ProductsDataTable instance to the DAL s UpdateWithTransaction method. Önceki öğreticideoluşturduğumuz UpdateWithTransaction yöntemi, değişiklik toplu işinin atomik bir işlem olarak güncelleştirilmesini sağlar.The UpdateWithTransaction method, which we created in the preceding tutorial, ensures that the batch of changes will be updated as an atomic operation.

BatchUpdate.aspx.cs BatchUpdate adlı bir yöntem oluşturun ve aşağıdaki kodu ekleyin:Create a method named BatchUpdate in BatchUpdate.aspx.cs and add the following code:

private void BatchUpdate()
{
    // Enumerate the GridView's Rows collection and create a ProductRow
    ProductsBLL productsAPI = new ProductsBLL();
    Northwind.ProductsDataTable products = productsAPI.GetProducts();
    foreach (GridViewRow gvRow in ProductsGrid.Rows)
    {
        // Find the ProductsRow instance in products that maps to gvRow
        int productID = Convert.ToInt32(ProductsGrid.DataKeys[gvRow.RowIndex].Value);
        Northwind.ProductsRow product = products.FindByProductID(productID);
        if (product != null)
        {
            // Programmatically access the form field elements in the 
            // current GridViewRow
            TextBox productName = (TextBox)gvRow.FindControl("ProductName");
            DropDownList categories = 
                (DropDownList)gvRow.FindControl("Categories");
            TextBox unitPrice = (TextBox)gvRow.FindControl("UnitPrice");
            CheckBox discontinued = 
                (CheckBox)gvRow.FindControl("Discontinued");
            // Assign the user-entered values to the current ProductRow
            product.ProductName = productName.Text.Trim();
            if (categories.SelectedIndex == 0) 
                product.SetCategoryIDNull(); 
            else 
                product.CategoryID = Convert.ToInt32(categories.SelectedValue);
            if (unitPrice.Text.Trim().Length == 0) 
                product.SetUnitPriceNull(); 
            else 
                product.UnitPrice = Convert.ToDecimal(unitPrice.Text);
            product.Discontinued = discontinued.Checked;
        }
    }
    // Now have the BLL update the products data using a transaction
    productsAPI.UpdateWithTransaction(products);
}

Bu yöntem, BLL s GetProducts yöntemine yapılan bir çağrı aracılığıyla ProductsDataTable tüm ürünleri geri alarak başlatılır.This method starts out by getting all of the products back in a ProductsDataTable via a call to the BLL s GetProducts method. Ardından ProductGrid GridView s Rows koleksiyonununumaralandırır.It then enumerates the ProductGrid GridView s Rows collection. Rows koleksiyonu, GridView 'da görünen her satır için bir GridViewRow örneği içerir.The Rows collection contains a GridViewRow instance for each row displayed in the GridView. Sayfa başına en fazla on satır gösterdiğimiz için, GridView s Rows koleksiyonda on öğeden fazla öğe olmayacaktır.Since we are showing at most ten rows per page, the GridView s Rows collection will have no more than ten items.

Her satır için ProductID DataKeys koleksiyonundan bir şekilde belirlenir ve ProductsDataTableuygun ProductsRow seçilir.For each row the ProductID is grabbed from the DataKeys collection and the appropriate ProductsRow is selected from the ProductsDataTable. Program aracılığıyla dört adet TemplateField giriş denetimine başvurulur ve bunların değerleri ProductsRow örnek s özelliklerine atanır.The four TemplateField input controls are programmatically referenced and their values assigned to the ProductsRow instance s properties. Her bir GridView satır s değeri ProductsDataTablegüncelleştirmek için kullanıldıktan sonra, bu, önceki öğreticUpdateWithTransaction ide gördüğünüz gibi BLL s UpdateWithTransaction yöntemine geçirilir.After each GridView row s values have been used to update the ProductsDataTable, it s passed to the BLL s UpdateWithTransaction method which, as we saw in the preceding tutorial, simply calls down into the DAL s UpdateWithTransaction method.

Bu öğretici için kullanılan Batch güncelleştirme algoritması, ürün bilgilerinin değiştirilip değiştirilmediğine bakılmaksızın GridView 'daki bir satıra karşılık gelen ProductsDataTable her satırı güncelleştirir.The batch update algorithm used for this tutorial updates each row in the ProductsDataTable that corresponds to a row in the GridView, regardless of whether the product s information has been changed. Bu görünmeyen güncelleştirmeler genellikle bir performans sorunu olsa da, veritabanı tablosunda yapılan değişiklikleri yeniden denetlebiliyorsanız, bu değişiklikler gereksiz kayıtlara yol açabilir.While such blind updates aren't usually a performance issue, they can lead to superfluous records if you re auditing changes to the database table. Toplu güncelleştirmeler gerçekleştirme öğreticisine geri döndüğünüzde, DataList ve yalnızca Kullanıcı tarafından değiştirilen kayıtları güncelleştirecek kod içeren bir toplu güncelleştirme arabirimi araştırdık.Back in the Performing Batch Updates tutorial we explored a batch updating interface with the DataList and added code that would only update those records that were actually modified by the user. İsterseniz bu öğreticide kodu güncelleştirmek için toplu güncelleştirmeler gerçekleştirmekten yararlanabilirsiniz.Feel free to use the techniques from Performing Batch Updates to update the code in this tutorial, if desired.

Note

Veri kaynağı GridView 'a akıllı etiketi aracılığıyla bağlarken, Visual Studio veri kaynağı s birincil anahtar değerlerini otomatik olarak GridView s DataKeyNames özelliğine atar.When binding the data source to the GridView through its smart tag, Visual Studio automatically assigns the data source s primary key value(s) to the GridView s DataKeyNames property. Adım 1 ' de özetlenen GridView 'un akıllı etiketi aracılığıyla ObjectDataSource 'u GridView 'a bağladıysanız, her bir satır için ProductID değerine DataKeys koleksiyonu aracılığıyla erişmek için GridView s DataKeyNames özelliğini el ile ProductID olarak ayarlamanız gerekecektir.If you did not bind the ObjectDataSource to the GridView through the GridView s smart tag as outlined in Step 1, then you will need to manually set the GridView s DataKeyNames property to ProductID in order to access the ProductID value for each row through the DataKeys collection.

BatchUpdate kullanılan kod BLL s UpdateProduct yöntemlerinde kullanılanlara benzerdir; UpdateProduct yöntemlerinde yalnızca tek bir ProductRow örneği, mimariden alınan asıl farktır.The code used in BatchUpdate is similar to that used in the BLL s UpdateProduct methods, the main difference being that in the UpdateProduct methods only a single ProductRow instance is retrieved from the architecture. ProductRow özelliklerini atayan kod, genel bir düzende olduğu gibi, BatchUpdateiçindeki foreach döngüsünde bulunan UpdateProducts yöntemleri ve kodla aynıdır.The code that assigns the properties of the ProductRow is the same between the UpdateProducts methods and the code within the foreach loop in BatchUpdate, as is the overall pattern.

Bu öğreticiyi tamamlayabilmeniz için, güncelleştirme ürünleri düğmelerinden herhangi biri tıklandığında BatchUpdate yönteminin çağrılması gerekir.To complete this tutorial, we need to have the BatchUpdate method invoked when either of the Update Products buttons is clicked. Bu iki düğme denetiminin Click olayları için olay işleyicileri oluşturun ve olay işleyicilerinde aşağıdaki kodu ekleyin:Create event handlers for the Click events of these two Button controls and add the following code in the event handlers:

BatchUpdate();
ClientScript.RegisterStartupScript(this.GetType(), "message", 
    "alert('The products have been updated.');", true);

BatchUpdateiçin ilk çağrı yapılır.First a call is made to BatchUpdate. Ardından ClientScript property, güncelleştirilmiş ürünleri okuyan bir MessageBox görüntüleyen JavaScript eklemek için kullanılır.Next, the ClientScript property is used to inject JavaScript that will display a messagebox that reads The products have been updated.

Bu kodu sınamak için bir dakikanızı alın.Take a minute to test out this code. Tarayıcı aracılığıyla BatchUpdate.aspx ziyaret edin, bir dizi satırı düzenleyin ve güncelleştirme ürünleri düğmelerinden birine tıklayın.Visit BatchUpdate.aspx through a browser, edit a number of rows, and click one of the Update Products buttons. Hiç giriş doğrulama hatası olmadığı varsayılarak, güncelleştirilmiş ürünleri okuyan bir MessageBox görmeniz gerekir.Assuming there are no input validation errors, you should see a messagebox that reads The products have been updated. Güncelleştirmenin kararlılığını doğrulamak için, UnitPrice 1234,56 değerine izin vermeyen bir rastgele CHECK kısıtlaması eklemeyi göz önünde bulundurun.To verify the atomicity of the update, consider adding a random CHECK constraint, like one that disallows UnitPrice values of 1234.56. BatchUpdate.aspx, bir dizi kaydı düzenleyin ve ürün UnitPrice değerinden birini yasak değere (1234,56) ayarladığınızdan emin olun.Then from BatchUpdate.aspx, edit a number of records, making sure to set one of the product s UnitPrice value to the forbidden value ( 1234.56 ). Bu, toplu işlem sırasında orijinal değerlerine geri alındığında diğer değişikliklerle ürünleri Güncelleştir ' e tıkladığınızda bir hatayla sonuçlanır.This should result in an error when clicking Update Products with the other changes during that batch operation rolled back to their original values.

Alternatif birBatchUpdateyöntemiAn AlternativeBatchUpdateMethod

Az önce incelediğimiz BatchUpdate yöntemi BLL s GetProducts yönteminden Tüm ürünleri alır ve ardından GridView içinde görünen kayıtları güncelleştirir.The BatchUpdate method we just examined retrieves all of the products from the BLL s GetProducts method and then updates just those records that appear in the GridView. GridView, sayfalama kullanmıyorsa bu yaklaşım idealdir, ancak varsa yüzlerce, binlerce veya onlarca binlerce ürün, ancak GridView içinde yalnızca on satır olabilir.This approach is ideal if the GridView does not use paging, but if it does, there may be hundreds, thousands, or tens of thousands of products, but only ten rows in the GridView. Böyle bir durumda, veritabanındaki tüm ürünlerin yalnızca 10 ' u değiştirmek ideal olandan düşüktür.In such a case, getting all of the products from the database only to modify 10 of them is less than ideal.

Bu tür durumlar için, bunun yerine aşağıdaki BatchUpdateAlternate yöntemini kullanmayı göz önünde bulundurun:For those types of situations, consider using the following BatchUpdateAlternate method instead:

private void BatchUpdateAlternate()
{
    // Enumerate the GridView's Rows collection and create a ProductRow
    ProductsBLL productsAPI = new ProductsBLL();
    Northwind.ProductsDataTable products = new Northwind.ProductsDataTable();
    foreach (GridViewRow gvRow in ProductsGrid.Rows)
    {
        // Create a new ProductRow instance
        int productID = Convert.ToInt32(ProductsGrid.DataKeys[gvRow.RowIndex].Value);
        
        Northwind.ProductsDataTable currentProductDataTable = 
            productsAPI.GetProductByProductID(productID);
        if (currentProductDataTable.Rows.Count > 0)
        {
            Northwind.ProductsRow product = currentProductDataTable[0];
            // Programmatically access the form field elements in the 
            // current GridViewRow
            TextBox productName = (TextBox)gvRow.FindControl("ProductName");
            DropDownList categories = 
                (DropDownList)gvRow.FindControl("Categories");
            TextBox unitPrice = (TextBox)gvRow.FindControl("UnitPrice");
            CheckBox discontinued = 
                (CheckBox)gvRow.FindControl("Discontinued");
            // Assign the user-entered values to the current ProductRow
            product.ProductName = productName.Text.Trim();
            if (categories.SelectedIndex == 0) 
                product.SetCategoryIDNull(); 
            else 
                product.CategoryID = Convert.ToInt32(categories.SelectedValue);
            if (unitPrice.Text.Trim().Length == 0) 
                product.SetUnitPriceNull(); 
            else 
                product.UnitPrice = Convert.ToDecimal(unitPrice.Text);
            product.Discontinued = discontinued.Checked;
            // Import the ProductRow into the products DataTable
            products.ImportRow(product);
        }
    }
    // Now have the BLL update the products data using a transaction
    productsAPI.UpdateProductsWithTransaction(products);
}

BatchMethodAlternate, productsadlı yeni bir boş ProductsDataTable oluşturarak başlar.BatchMethodAlternate starts by creating a new empty ProductsDataTable named products. Ardından, GridView s Rows koleksiyonu ve her satır için BLL s GetProductByProductID(productID) yöntemini kullanarak belirli ürün bilgilerini alır.It then steps through the GridView s Rows collection and for each row gets the particular product information using the BLL s GetProductByProductID(productID) method. Alınan ProductsRow örneğinin özellikleri BatchUpdateaynı şekilde güncelleştirilir, ancak satırı güncelleştirdikten sonra DataTable s ImportRow(DataRow) yöntemiaracılığıyla products``ProductsDataTable içeri aktarılır.The retrieved ProductsRow instance has its properties updated in the same fashion as BatchUpdate, but after updating the row it is imported into the products``ProductsDataTable via the DataTable s ImportRow(DataRow) method.

foreach döngüsü tamamlandıktan sonra, products GridView 'daki her satır için bir ProductsRow örneği içerir.After the foreach loop completes, products contains one ProductsRow instance for each row in the GridView. ProductsRow örneklerinin her biri products eklenmiş olduğundan (güncelleştirilmiş yerine), UpdateWithTransaction yöntemine bir şekilde geçirirseniz, ProductsTableAdapter kayıtların her birini veritabanına eklemeye çalışacaktır.Since each of the ProductsRow instances have been added to the products (instead of updated), if we blindly pass it to the UpdateWithTransaction method the ProductsTableAdapter will try to insert each of the records into the database. Bunun yerine, bu satırların her birinin değiştirildiğini (eklenmemiş) belirtmemiz gerekir.Instead, we need to specify that each of these rows has been modified (not added).

Bu, BLL adlı UpdateProductsWithTransactionyeni bir yöntem eklenerek gerçekleştirilebilir.This can be accomplished by adding a new method to the BLL named UpdateProductsWithTransaction. Aşağıda gösterilen UpdateProductsWithTransaction, ProductsDataTable ProductsRow örneklerinin her birinin RowState Modified ve ardından ProductsDataTable DAL s UpdateWithTransaction yöntemine geçirir.UpdateProductsWithTransaction, shown below, sets the RowState of each of the ProductsRow instances in the ProductsDataTable to Modified and then passes the ProductsDataTable to the DAL s UpdateWithTransaction method.

public int UpdateProductsWithTransaction(Northwind.ProductsDataTable products)
{
    // Mark each product as Modified
    products.AcceptChanges();
    foreach (Northwind.ProductsRow product in products)
        product.SetModified();
    // Update the data via a transaction
    return UpdateWithTransaction(products);
}

ÖzetSummary

GridView, yerleşik satır başına düzenleme özellikleri sağlar, ancak tamamen düzenlenebilir arabirimler oluşturma desteği yoktur.The GridView provides built-in per-row editing capabilities, but lacks support for creating fully editable interfaces. Bu öğreticide gördüğünüz gibi, bu tür arabirimler mümkündür ancak biraz iş gerektirir.As we saw in this tutorial, such interfaces are possible, but require a bit of work. Her satırın düzenlenebildiği bir GridView oluşturmak için, GridView s alanlarını TemplateFields 'e dönüştürmemiz ve ItemTemplate s içinde düzenleme arabirimini tanımlamanız gerekir.To create a GridView where every row is editable, we need to convert the GridView s fields into TemplateFields and define the editing interface within the ItemTemplate s. Ayrıca, Update All-Type düğme Web denetimlerini, GridView 'dan ayrı olarak sayfaya eklenmelidir.Additionally, Update All -type Button Web controls must be added to the page, separate from the GridView. Bu düğmeler Click olay işleyicilerinin GridView s Rows koleksiyonunu numaralandırması, değişiklikleri bir ProductsDataTabledepolaması ve güncelleştirilmiş bilgileri uygun BLL yöntemine geçirmesi gerekir.These Buttons Click event handlers need to enumerate the GridView s Rows collection, store the changes in a ProductsDataTable, and pass the updated information into the appropriate BLL method.

Sonraki öğreticide toplu silme için bir arabirim oluşturma hakkında bilgi edineceksiniz.In the next tutorial we'll see how to create an interface for batch deleting. Özellikle, her GridView satırı bir onay kutusu içerir ve tüm tür düğmelerini güncelleştirmek yerine seçili satırları sil düğmelerini kullanacağız.In particular, each GridView row will include a checkbox and instead of Update All -type buttons, we'll have Delete Selected Rows buttons.

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, bir Murphy ve David suru olarak eklenmiştir.Lead reviewers for this tutorial were Teresa Murphy and David Suru. 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.