Toplu Güncelleştirmeler Gerçekleştirme (C#)

Scott Mitchell tarafından

Örnek uygulamayı indirin veya PDF 'yi indirin

Tüm öğeleri düzenleme modunda olduğu ve sayfadaki "Tümünü Güncelleştir" düğmesine tıklanarak değerlerinin kaydedilebileceği tam düzenlenebilir bir DataList oluşturmayı öğrenin.

Giriş

Önceki öğreticide , öğe düzeyi DataList oluşturmayı inceledik. Standart düzenlenebilir GridView gibi, DataList 'teki her öğe tıklandığı zaman öğeyi düzenlenebilir hale getirmek için bir Düzenle düğmesi içeriyordu. Bu öğe düzeyi düzenleme yalnızca zaman zaman güncellenen veriler için uygun olsa da, bazı kullanım örneği senaryoları kullanıcının birçok kaydı düzenlemesini gerektirir. Bir kullanıcının onlarca kayıt düzenlemesi gerekiyorsa ve Düzenle ' ye tıkladıktan sonra değişiklikleri yapıp, her biri için Güncelleştir ' e tıkladığınızda, tıklama miktarı üretkenliği görebilir. Bu tür durumlarda daha iyi bir seçenek, Tüm öğelerinin düzenleme modunda olduğu ve içindeki tüm öğeleri bir Update Tümünü Güncelleştir düğmesine tıklanarak düzenlenebildiği bir tam düzenlenebilir DataList sağlamaktır (bkz. Şekil 1).

Tamamen düzenlenebilir bir DataList 'teki her öğe değiştirilebilir

Şekil 1: tamamen düzenlenebilir bir DataList 'Teki her öğe değiştirilebilir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu öğreticide, kullanıcıların tamamen düzenlenebilir bir DataList kullanarak tedarikçi adres bilgilerini güncelleştirmesine nasıl olanak sağlayacağız.

1. Adım: DataList 'te Düzenlenek Kullanıcı arabirimini oluşturma

Yukarıdaki öğreticide, standart, öğe düzeyi düzenlenebilir bir DataList oluşturduğumuz iki şablon kullandık:

  • ItemTemplate salt okunurdur Kullanıcı arabirimini içeriyordu (her bir ürün adı ve fiyatını görüntülemek için Web denetimleri etiketi).
  • EditItemTemplate, düzenleme modu kullanıcı arabirimini içeriyordu (iki metin kutusu Web denetimi).

DataList EditItemIndex özelliği, EditItemTemplatekullanılarak DataListItem (varsa) işleneceğini belirler. Özellikle, ItemIndex değeri DataList s EditItemIndex özelliği ile eşleşen DataListItem EditItemTemplatekullanılarak işlenir. Tek seferde yalnızca bir öğe düzenlenebilir olduğunda, ancak tamamen düzenlenebilir bir DataList oluşturulurken bu model iyi bir şekilde geçerlidir.

Tamamen düzenlenebilir bir DataList için, tüm DataListItem öğeleri düzenlenebilir arabirim kullanarak işlemesini istiyoruz. Bunu gerçekleştirmenin en kolay yolu ItemTemplatedüzenlenebilir arabirimini tanımlamaktır. Tedarikçiler adres bilgilerini değiştirmek için, düzenlenebilir arabirim, satıcı adını metin olarak ve ardından Adres, şehir ve ülke değerleri için metin kutuları içerir.

BatchUpdate.aspx sayfasını açıp bir DataList denetimi ekleyin ve ID özelliğini Suppliersolarak ayarlayın. DataList s akıllı etiketinden SuppliersDataSourceadlı yeni bir ObjectDataSource denetimi eklemeyi tercih edin.

SuppliersDataSource adlı yeni bir ObjectDataSource oluşturma

Şekil 2: SuppliersDataSource adlı yeni bir ObjectDataSource oluşturun (tam boyutlu görüntüyü görüntülemek için tıklayın)

SuppliersBLL sınıf s GetSuppliers() metodunu kullanarak verileri almak için ObjectDataSource 'ı yapılandırın (bkz. Şekil 3). Önceki öğreticide olduğu gibi, ObjectDataSource aracılığıyla Tedarikçi bilgilerini güncelleştirmek yerine doğrudan Iş mantığı katmanı ile çalışacağız. Bu nedenle, GÜNCELLEŞTIRME sekmesinde açılan listeyi (yok) olarak ayarlayın (bkz. Şekil 4).

GetSuppliers () yöntemini kullanarak Tedarikçi bilgilerini alma

Şekil 3: GetSuppliers() yöntemi kullanarak Tedarikçi bilgilerini alma (tam boyutlu görüntüyü görüntülemek için tıklayın)

GÜNCELLEŞTIRME sekmesinde açılan listeyi (yok) olarak ayarlayın

Şekil 4: güncelleştirme sekmesinde açılan listeyi (yok) olarak ayarlayın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Sihirbaz tamamlandıktan sonra Visual Studio, bir etiket Web denetimindeki veri kaynağı tarafından döndürülen her bir veri alanını göstermek için otomatik olarak ItemTemplate DataList 'i oluşturur. Bunun yerine, düzen arabirimini sağlamak için bu şablonu değiştirmemiz gerekiyor. ItemTemplate, DataList ' akıllı etiketindeki veya doğrudan bildirim temelli söz dizimi aracılığıyla Şablonları Düzenle seçeneği kullanılarak tasarımcı aracılığıyla özelleştirilebilir.

Tedarikçinin adını metin olarak görüntüleyen bir düzen arabirimi oluşturmak için bir dakikanızı ayırın, ancak Tedarikçi s adresi, şehir ve ülke değerleri için metin kutuları içerir. Bu değişiklikleri yaptıktan sonra, sayfa bildirimli sözdizimi aşağıdaki gibi görünmelidir:

<asp:DataList ID="Suppliers" runat="server" DataKeyField="SupplierID"
    DataSourceID="SuppliersDataSource">
    <ItemTemplate>
        <h4><asp:Label ID="CompanyNameLabel" runat="server"
            Text='<%# Eval("CompanyName") %>' /></h4>
        <table border="0">
            <tr>
                <td class="SupplierPropertyLabel">Address:</td>
                <td class="SupplierPropertyValue">
                    <asp:TextBox ID="Address" runat="server"
                        Text='<%# Eval("Address") %>' />
                </td>
            </tr>
            <tr>
                <td class="SupplierPropertyLabel">City:</td>
                <td class="SupplierPropertyValue">
                    <asp:TextBox ID="City" runat="server"
                        Text='<%# Eval("City") %>' />
                </td>
            </tr>
            <tr>
                <td class="SupplierPropertyLabel">Country:</td>
                <td class="SupplierPropertyValue">
                    <asp:TextBox ID="Country" runat="server"
                        Text='<%# Eval("Country") %>' />
                </td>
            </tr>
        </table>
        <br />
    </ItemTemplate>
</asp:DataList>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLL">
</asp:ObjectDataSource>

Note

Önceki öğreticide olduğu gibi, bu öğreticideki DataList 'in görünüm durumunun etkin olması gerekir.

ItemTemplate, Styles.css sınıfına eklenen ve ProductPropertyLabel ve ProductPropertyValue CSS sınıflarıyla aynı stil ayarlarını kullanacak şekilde yapılandırılan SupplierPropertyLabel ve SupplierPropertyValueiki yeni CSS sınıfı kullandım.

.ProductPropertyLabel, .SupplierPropertyLabel
{
    font-weight: bold;
    text-align: right;
}
.ProductPropertyValue, .SupplierPropertyValue
{
    padding-right: 35px;
}

Bu değişiklikleri yaptıktan sonra bu sayfayı bir tarayıcı aracılığıyla ziyaret edin. Şekil 5 ' i gösterdiği gibi, her bir DataList öğesi tedarikçi adını metin olarak görüntüler ve adres, şehir ve ülkeyi göstermek için metin kutuları kullanır.

DataList 'teki her tedarikçi düzenlenebilir

Şekil 5: DataList 'teki her bir tedarikçi düzenlenebilir (tam boyutlu görüntüyü görüntülemek için tıklayın)

2. Adım: Tümünü Güncelleştir düğmesi ekleme

Şekil 5 ' teki her tedarikçinin adres, şehir ve ülke alanları bir metin kutusunda görüntülenirken, şu anda bir güncelleştirme düğmesi yok demektir. Tamamen düzenlenebilir veri bilgileriyle her öğe için bir güncelleştirme düğmesine sahip olmak yerine, bir sayfada genellikle tek bir güncelleştir düğmesi vardır ve tıklandığı zaman DataList 'teki Tüm kayıtları günceller. Bu öğretici için, her biri sayfanın üst kısmına ve diğeri alta doğru bir şekilde iki güncelleştirme ekleyelim (iki düğmeyi de aynı etkiye sahip olur).

DataList 'in üzerine bir düğme web denetimi ekleyerek başlayın ve ID özelliğini UpdateAll1olarak ayarlayın. Sonra, DataList 'in altına ikinci düğme web denetimini ekleyin, ID UpdateAll2olarak ayarlar. Tümünü güncelleştirmek için iki düğme için Text özelliklerini ayarlayın. Son olarak, olaylar Click her iki düğme için de olay işleyicileri oluşturun. Her olay işleyicilerindeki güncelleştirme mantığını çoğaltmak yerine, bu mantığı üçüncü bir yöntemle yeniden düzenleme, UpdateAllSupplierAddresses, olay işleyicilerinin bu üçüncü yöntemi çağırma.

protected void UpdateAll1_Click(object sender, EventArgs e)
{
    UpdateAllSupplierAddresses();
}
protected void UpdateAll2_Click(object sender, EventArgs e)
{
    UpdateAllSupplierAddresses();
}
private void UpdateAllSupplierAddresses()
{
    // TODO: Write code to update _all_ of the supplier addresses in the DataList
}

Şekil 6, Tümünü Güncelleştir düğmeleri eklendikten sonra sayfayı gösterir.

Sayfaya Iki güncelleştirme tüm düğmeler eklendi

Şekil 6: sayfaya Iki güncelleştirme tüm düğmeler eklenmiş (tam boyutlu görüntüyü görüntülemek için tıklatın)

3. Adım: tüm tedarikçiler adres bilgilerini güncelleştirme

Tüm DataList öğeleri, düzen arabirimini görüntüleyen ve Tümünü Güncelleştir düğmelerinin eklenmesiyle birlikte, her durumda kalan, toplu güncelleştirmeyi gerçekleştirmek için kod yazıyor. Özellikle, DataList öğeleri arasında döngü yapmanız ve her biri için SuppliersBLL sınıf s UpdateSupplierAddress metodunu çağırmanız gerekir.

DataList 'i oluşturan DataListItem örneklerinin koleksiyonuna DataList s Items özelliğiaracılığıyla erişilebilir. Bir DataListItembaşvurusu ile DataKeys koleksiyonundan ilgili SupplierID alabilir ve aşağıdaki kodun gösterildiği gibi ItemTemplate içindeki TextBox Web denetimlerine programlı bir şekilde başvurabilir:

private void UpdateAllSupplierAddresses()
{
    // Create an instance of the SuppliersBLL class
    SuppliersBLL suppliersAPI = new SuppliersBLL();
    // Iterate through the DataList's items
    foreach (DataListItem item in Suppliers.Items)
    {
        // Get the supplierID from the DataKeys collection
        int supplierID = Convert.ToInt32(Suppliers.DataKeys[item.ItemIndex]);
        // Read in the user-entered values
        TextBox address = (TextBox)item.FindControl("Address");
        TextBox city = (TextBox)item.FindControl("City");
        TextBox country = (TextBox)item.FindControl("Country");
        string addressValue = null, cityValue = null, countryValue = null;
        if (address.Text.Trim().Length > 0)
            addressValue = address.Text.Trim();
        if (city.Text.Trim().Length > 0)
              cityValue = city.Text.Trim();
        if (country.Text.Trim().Length > 0)
            countryValue = country.Text.Trim();
        // Call the SuppliersBLL class's UpdateSupplierAddress method
        suppliersAPI.UpdateSupplierAddress
            (supplierID, addressValue, cityValue, countryValue);
    }
}

Kullanıcı Update All düğmelerinden birine tıkladığında UpdateAllSupplierAddresses yöntemi Suppliers DataList 'teki her bir DataListItem üzerinden yinelenir ve ilgili değerleri geçirerek SuppliersBLL sınıf s UpdateSupplierAddress yöntemini çağırır. Adres, şehir veya ülke geçişleri için girilen olmayan bir değer, UpdateSupplierAddress (boş bir dize yerine) Nothing bir değerdir ve bu, temel kayıt alanları için bir veritabanı NULL sonuçlanır.

Note

Geliştirme olarak, toplu güncelleştirme gerçekleştirildikten sonra bazı onay iletisi sağlayan sayfaya bir durum etiketi Web denetimi eklemek isteyebilirsiniz.

Yalnızca değiştirilen adresler güncelleştiriliyor

Bu öğretici için kullanılan Batch güncelleştirme algoritması, kendi adres bilgilerinin değiştirilip değiştirilmediğini bağımsız olarak DataList 'teki her tedarikçide UpdateSupplierAddress yöntemini çağırır. 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. Örneğin, tüm UPDATE Suppliers öğeleri bir denetim tablosuna kaydetmek için Tetikleyiciler kullanırsanız, Kullanıcı tüm değişiklikleri Güncelleştir düğmesine her tıkladığında, kullanıcının herhangi bir değişiklik yapıp yapmadığına bakılmaksızın, sistemdeki her bir sağlayıcı için yeni bir denetim kaydı oluşturulur.

ADO.NET DataTable ve DataAdapter sınıfları, yalnızca değiştirilen, silinen ve yeni kayıtların herhangi bir veritabanı iletişimine neden olduğu durumlarda toplu güncelleştirmeleri destekleyecek şekilde tasarlanmıştır. DataTable 'daki her satır, satırın DataTable 'a eklenip eklenmeyeceğini, onun içinden silindiğini veya değiştirildiğini belirten bir RowState özelliğine sahiptir. Bir DataTable başlangıçta doldurulduktan sonra tüm satırlar değiştirilmeden işaretlenir. Satır s sütunlarının herhangi birinin değerini değiştirmek satırı değiştirilmiş olarak işaretler.

SuppliersBLL sınıfında, ilk olarak tek tedarikçide bir SuppliersDataTable ve ardından aşağıdaki kodu kullanarak Address, Cityve Country sütun değerlerini ayarlayarak belirtilen tedarikçinin s adres bilgilerini güncelleştirdik:

public bool UpdateSupplierAddress
    (int supplierID, string address, string city, string country)
{
    Northwind.SuppliersDataTable suppliers =
        Adapter.GetSupplierBySupplierID(supplierID);
    if (suppliers.Count == 0)
        // no matching record found, return false
        return false;
    else
    {
        Northwind.SuppliersRow supplier = suppliers[0];
        if (address == null)
            supplier.SetAddressNull();
        else
            supplier.Address = address;
        if (city == null)
            supplier.SetCityNull();
        else
            supplier.City = city;
        if (country == null)
            supplier.SetCountryNull();
        else
            supplier.Country = country;
        // Update the supplier Address-related information
        int rowsAffected = Adapter.Update(supplier);
        // Return true if precisely one row was updated,
        // otherwise false
        return rowsAffected == 1;
    }
}

Bu kod, geçirilen adres, şehir ve ülke değerlerini, değerlerin değiştirilip değiştirilmediğini bakılmaksızın SuppliersDataTable SuppliersRow atar. Bu değişiklikler SuppliersRow s RowState özelliğinin değiştirilmiş olarak işaretlenmesine neden olur. Veri erişim katmanı s Update yöntemi çağrıldığında, SupplierRow değiştirildiğini görür ve bu nedenle veritabanına bir UPDATE komutu gönderir.

Bununla birlikte, yalnızca SuppliersRow s mevcut değerlerinden farklıysa, yalnızca geçirilen adres, şehir ve ülke değerlerini atamak için bu yönteme kod ekledik. Adres, şehir ve ülkenin mevcut verilerle aynı olduğu durumlarda, hiçbir değişiklik yapılmaz ve SupplierRow s RowState değiştirilmemiş olarak işaretlenir. Ağ sonucu, DAL s Update yöntemi çağrıldığında, SuppliersRow değiştirilmediği için hiçbir veritabanı çağrısının yapılmaması durumunda olur.

Bu değişikliği yapmak için, şu kodla, geçen adres, şehir ve ülke değerlerini etkileyen deyimleri değiştirin:

// Only assign the values to the SupplierRow's column values if they differ
if (address == null && !supplier.IsAddressNull())
    supplier.SetAddressNull();
else if ((address != null && supplier.IsAddressNull()) ||
         (!supplier.IsAddressNull() &&
         string.Compare(supplier.Address, address) != 0))
    supplier.Address = address;
if (city == null && !supplier.IsCityNull())
    supplier.SetCityNull();
else if ((city != null && supplier.IsCityNull()) ||
         (!supplier.IsCityNull() && string.Compare(supplier.City, city) != 0))
    supplier.City = city;
if (country == null && !supplier.IsCountryNull())
    supplier.SetCountryNull();
else if ((country != null && supplier.IsCountryNull()) ||
         (!supplier.IsCountryNull() &&
         string.Compare(supplier.Country, country) != 0))
    supplier.Country = country;

Bu eklenen kodla, DAL s Update yöntemi veritabanına yalnızca adresle ilgili değerler değiştirilen kayıtlar için bir UPDATE ifade gönderir.

Alternatif olarak, geçilen adres alanları ve veritabanı verileri arasında herhangi bir farklılık olup olmadığını ve yoksa yalnızca DAL s Update metoduna olan çağrıyı atlayabilirsiniz. Bu yaklaşım, veritabanı doğrudan yöntemi bir veritabanı çağrısının gerçekten gerekli olup olmadığını tespit etmek üzere RowState denetlenebileceği bir SuppliersRow örneği geçirdiğinden, DB Direct yöntemini yeniden kullandığınızda iyi bir şekilde çalışabilir.

Note

UpdateSupplierAddress yöntemi her çağrıldığında, güncelleştirilmiş kayıt hakkında bilgi almak için veritabanına bir çağrı yapılır. Daha sonra verilerde değişiklik olursa tablo satırını güncelleştirmek için başka bir veritabanına yapılan çağrı yapılır. Bu iş akışı, BatchUpdate.aspx sayfasındaki Tüm değişikliklere sahip bir EmployeesDataTable örneğini kabul eden bir UpdateSupplierAddress yöntemi aşırı yüklemesi oluşturularak iyileştirilebilir. Daha sonra, Suppliers tablodaki tüm kayıtları almak için veritabanına bir çağrı yapabilir. Bu durumda, iki sonuç kümeleri numaralandırılır ve yalnızca değişikliklerin gerçekleştiği kayıtlar güncelleştirilemeyebilir.

Özet

Bu öğreticide, tam olarak düzenlenebilir bir DataList oluşturmayı, kullanıcının birden çok tedarikçi için adres bilgilerini hızlı bir şekilde değiştirmesine izin vermeyi gördük. Bir metin kutusu Web denetimi oluşturma arabirimini, DataList s ItemTemplateiçindeki Tedarikçi adresi, şehir ve ülke değerleri için tanımlayarak başladık. Daha sonra, DataList 'in üzerinde ve altındaki tüm düğmeleri güncelleştirme ekledik. Bir Kullanıcı değişiklikleri yaptıktan ve Tümünü Güncelleştir düğmelerinden birine tıkladıktan sonra, DataListItem s numaralandırılır ve SuppliersBLL sınıfı s UpdateSupplierAddress yöntemine bir çağrı yapılır.

Programlamanın kutlu olsun!

Yazar hakkında

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 bağımsız danışman, Trainer ve yazıcı olarak çalışıyor. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister. mitchell@4GuysFromRolla.comadresinden erişilebilir . ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.

Özel olarak teşekkürler

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi. Bu öğreticiye ilişkin müşteri adayı gözden geçirenler Zack Jones ve Ken ön PISA ' dir. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .