Mevcut İkili Verileri Güncelleştirme ve Silme (C#)

Scott Mitchell tarafından

Örnek uygulamayı indirin veya PDF 'yi indirin

Önceki öğreticilerde, GridView denetiminin metin verilerini düzenlemeyi ve silmeyi basit hale getiren gördük. Bu öğreticide, GridView denetiminin, ikili verilerin veritabanına kaydedilip kaydedilmediğini veya dosya sisteminde depolanıp saklanmadığını, ikili verileri düzenleme ve silme olanağı da sağlar.

Giriş

Son üç öğreticide, ikili verilerle çalışmaya yönelik çok sayıda işlevselliği ekledik. Categories tabloya bir BrochurePath sütunu ekleyerek ve mimariyi uygun şekilde güncelleştirdik. Ayrıca, bir görüntü dosyasının ikili içeriğini tutan kategori tablo s Picture sütunuyla çalışmak üzere veri erişim katmanı ve Iş mantığı katmanı yöntemleri ekledik. Bir GridView 'da ikili verileri, bir <img> öğesinde gösterilen kategori s resmine sahip ve kullanıcıların yeni bir kategori eklemesine ve kendi broşür ve resim verilerini yüklemesine izin veren bir DetailsView ekledi.

Tüm bunlar geçerli kategorileri düzenleme ve silme olanağıdır. Bu öğreticide, GridView s yerleşik düzenleme ve silme özelliklerini kullanarak gerçekleştireceğiz. Bir kategoriyi düzenlediğinizde, Kullanıcı isteğe bağlı olarak yeni bir resim yükleyebilir ya da kategorinin mevcut olanı kullanmaya devam etmesine izin verebilir. Broşür için, mevcut broşürden birini veya yeni bir broşürü karşıya yüklemeyi seçebilir ya da kategorinin artık onunla ilişkili bir broşürü olmadığını belirtebilirsiniz. Haydi başlayın!

1. Adım: veri erişim katmanını güncelleştirme

DAL, Insert, Updateve Delete yöntemlerine otomatik olarak üretilmiş, ancak bu yöntemler, Picture sütununu içermeyen CategoriesTableAdapter s ana sorgusuna göre oluşturulmuştur. Bu nedenle, Insert ve Update yöntemleri, kategori s resmine yönelik ikili verileri belirtmek için parametreler içermez. Önceki öğreticideyaptığımız gibi, ikili verileri belirtirken Categories tablosunu güncelleştirmek için yeni bir TableAdapter yöntemi oluşturuyoruz.

Türü belirtilmiş veri kümesini açın ve tasarımcı 'dan CategoriesTableAdapter s başlığına sağ tıklayıp bağlam menüsünden sorgu Ekle ' yi seçerek TableAdapter sorgu Yapılandırma Sihirbazı 'nı başlatın. Bu sihirbaz, TableAdapter sorgusunun veritabanına nasıl eriştiğimizi isteyerek başlar. SQL deyimlerini kullan ' ı seçin ve Ileri ' ye tıklayın. Sonraki adım, oluşturulacak sorgu türünü sorar. Categories tabloya yeni bir kayıt eklemek için bir sorgu oluşturuyoruz, GÜNCELLEŞTIR ' i seçin ve Ileri ' ye tıklayın.

GÜNCELLEŞTIRME seçeneğini belirleyin

Şekil 1: Güncelleştir seçeneğini belirleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)

Artık UPDATE SQL ifadesini belirtmemiz gerekir. Sihirbaz, TableAdapter s ana sorgusuna (CategoryName, Descriptionve BrochurePath değerlerini güncelleştiren bir UPDATE) karşılık gelen otomatik olarak bir ifade önerir. Picture sütununun bir @Picture parametresiyle birlikte dahil edilmesini sağlamak için ifadeyi değiştirin, örneğin:

UPDATE [Categories] SET 
    [CategoryName] = @CategoryName, 
    [Description] = @Description, 
    [BrochurePath] = @BrochurePath ,
    [Picture] = @Picture
WHERE (([CategoryID] = @Original_CategoryID))

Sihirbazın son ekranında yeni TableAdapter metodunu adlandırma bize sorulur. UpdateWithPicture girin ve son ' a tıklayın.

yeni TableAdapter metodunu UpdateWithPicture olarak adlandırın

Şekil 2: yeni TableAdapter metodunu adlandırma UpdateWithPicture (tam boyutlu görüntüyü görüntülemek için tıklayın)

2. Adım: Iş mantığı katman yöntemlerini ekleme

DAL güncellenmesinin yanı sıra, bir kategoriyi güncelleştirmek ve silmek için yöntemler eklemek üzere BLL 'yi güncelleştirmemiz gerekir. Bunlar, sunum katmanından çağrılacak yöntemlerdir.

Bir kategoriyi silmek için CategoriesTableAdapter s otomatik olarak oluşturulan Delete metodunu kullanabiliriz. CategoriesBLL sınıfına aşağıdaki yöntemi ekleyin:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Delete, true)]
public bool DeleteCategory(int categoryID)
{
    int rowsAffected = Adapter.Delete(categoryID);
    // Return true if precisely one row was deleted, otherwise false
    return rowsAffected == 1;
}

Bu öğreticide, bir kategoriyi güncelleştirmek için ikili resim verilerini bekleyen ve CategoriesTableAdapter yeni eklenen UpdateWithPicture yöntemi ve yalnızca CategoryName, Descriptionve BrochurePath değerlerini kabul eden ve CategoriesTableAdapter Class s otomatik olarak oluşturulan Update ifadesini kullanan iki yöntem oluşturalım. İki yöntem kullanılarak yapılan bir Kullanıcı, bazı durumlarda bir kullanıcının kategori s resmini diğer alanlarıyla birlikte güncelleştirmek isteyebilir ve bu durumda kullanıcının yeni resmi karşıya yüklemesi gerekecektir. Karşıya yüklenen Picture s ikili verileri daha sonra UPDATE bildiriminde kullanılabilir. Diğer durumlarda, Kullanıcı yalnızca güncelleştirme, örneğin adı ve açıklama ile ilgileniyor olabilir. Ancak UPDATE deyimin Picture sütununun ikili verilerini de beklediğinde, bu bilgileri de sağlamanız gerekir. Bu, düzenlenen kayıt için resim verilerini geri getirmek üzere veritabanına fazladan bir seyahat gerektirir. Bu nedenle, iki UPDATE yöntemi istiyoruz. Iş mantığı katmanı, kategori güncelleştirilirken resim verilerinin sağlanıp sağlanana göre hangisinin kullanılacağını belirleyecek.

Bunu kolaylaştırmak için, CategoriesBLL sınıfına, her ikisi de adlı UpdateCategoryiki yöntem ekleyin. Birincisi, giriş parametreleri olarak üç string s, byte dizisi ve bir int kabul etmelidir; İkincisi, yalnızca üç string ve bir int. string giriş parametreleri kategori adı, açıklama ve broşür dosya yolu için, byte dizisi kategori s resminin ikili içeriğine yöneliktir ve int güncelleştirilecek kaydın CategoryID tanımlar. Geçirilen byte dizisi nullise ilk aşırı yükün ikinci kez harekete geçirdiğine dikkat edin:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateCategory(string categoryName, string description, 
    string brochurePath, byte[] picture, int categoryID)
{
    // If no picture is specified, use other overload
    if (picture == null)
        return UpdateCategory(categoryName, description, brochurePath, categoryID);
    // Update picture, as well
    int rowsAffected = Adapter.UpdateWithPicture
        (categoryName, description, brochurePath, picture, categoryID);
    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}
[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Update, true)]
public bool UpdateCategory(string categoryName, string description, 
    string brochurePath, int categoryID)
{
    int rowsAffected = Adapter.Update
        (categoryName, description, brochurePath, categoryID);
    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}

3. Adım: ekleme ve görüntüleme Işlevinin üzerine kopyalama

Önceki öğreticide , GridView 'daki tüm kategorileri listelenmiş UploadInDetailsView.aspx adlı bir sayfa oluşturduk ve sisteme yeni kategoriler eklemek Için bir DetailsView sağladık. Bu öğreticide, GridView 'ı düzen ve silme desteğini kapsayacak şekilde genişleteceğiz. UploadInDetailsView.aspx' den çalışmaya devam etmek yerine, bu öğretici değişikliklerini aynı klasörden UpdatingAndDeleting.aspx sayfasında ~/BinaryData. Bildirime dayalı işaretlemeyi ve kodu UploadInDetailsView.aspx kopyalayıp UpdatingAndDeleting.aspxyapıştırın.

UploadInDetailsView.aspx sayfasını açarak başlayın. Şekil 3 ' te gösterildiği gibi, <asp:Content> öğesi içindeki bildirim temelli sözdiziminin tümünü kopyalayın. Sonra UpdatingAndDeleting.aspx açın ve bu biçimlendirmeyi <asp:Content> öğesi içinde yapıştırın. Benzer şekilde, kodu UploadInDetailsView.aspx Page for Code Behind sınıfından UpdatingAndDeleting.aspx.

, Uploadındetailsview. aspx dosyasından bildirim temelli biçimlendirmeyi kopyalayın

Şekil 3: UploadInDetailsView.aspx bildirim temelli biçimlendirmeyi kopyalama (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bildirim temelli biçimlendirmenin ve kodun üzerine kopyaladıktan sonra UpdatingAndDeleting.aspxziyaret edin. Aynı çıktıyı görmeniz ve önceki öğreticide UploadInDetailsView.aspx sayfasıyla aynı kullanıcı deneyimine sahip olmanız gerekir.

4. Adım: ObjectDataSource ve GridView 'a silme desteğini ekleme

Veri öğreticisini ekleme, güncelleştirme ve silmeye genel bakış konusunda anlatıldığı gibi, GridView, yerleşik silme özellikleri sağlar ve bu özellik, altta yatan veri kaynağı silmeyi destekliyorsa, bir onay kutusunun Tick değerinde etkinleştirilebilir. Şu anda GridView 'un bağlı olduğu ObjectDataSource (CategoriesDataSource) silmeyi desteklemez.

Bu sorunu gidermek için, ObjectDataSource 'un akıllı etiketindeki veri kaynağını Yapılandır seçeneğine tıklayarak Sihirbazı başlatın. İlk ekran, ObjectDataSource 'un CategoriesBLL sınıfıyla çalışacak şekilde yapılandırıldığını gösterir. Ileri düğmesine basın. Şu anda yalnızca ObjectDataSource s InsertMethod ve SelectMethod özellikleri belirtilmiş. Ancak sihirbaz, GÜNCELLEŞTIR ve SIL sekmelerinde bulunan aşağı açılan listeleri sırasıyla UpdateCategory ve DeleteCategory yöntemleriyle otomatik olarak doldurmuş. Bunun nedeni, CategoriesBLL sınıfında bu yöntemleri güncelleştirme ve silme için varsayılan yöntemler olarak DataObjectMethodAttribute kullanarak işaretliyoruz.

Şimdilik, GÜNCELLEŞTIRME sekmesi aşağı açılan listesini (yok) olarak ayarlayın, ancak SIL sekme s açılır listesini DeleteCategoryolarak ayarlayın. Güncelleştirme desteği eklemek için adım 6 ' da Bu sihirbaza geri döneceğiz.

silme işlemini DeleteCategory metodunu kullanacak şekilde yapılandırın

Şekil 4: DeleteCategory yöntemini kullanmak için ObjectDataSource 'ı yapılandırın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Note

Sihirbaz tamamlandıktan sonra Visual Studio, veri Web denetimleri alanlarını yeniden oluşturacak alanları ve anahtarları yenilemek isteyip istemediğinizi sorabilir. Evet ' i seçmek, yapmış olduğunuz tüm alan özelleştirmelerinin üzerine yazacak şekilde Hayır ' ı seçin.

ObjectDataSource artık DeleteMethod özelliği için bir değer ve bir DeleteParameterde içerir. Yöntemi belirtmek için Sihirbazı kullanırken, Visual Studio 'Nun ObjectDataSource OldValuesParameterFormatString özelliğini original_{0}olarak, Update ve Delete Yöntem etkinleştirmeleri ile ilgili sorunlara neden olduğunu hatırlayın. Bu nedenle, bu özelliği tamamen temizleyin veya {0}varsayılana sıfırlayın. Bu ObjectDataSource özelliğinde belleğinizin yenilenmesi gerekiyorsa, verileri ekleme, güncelleştirme ve silmeye Ilişkin genel bakışa bakın.

Sihirbazı tamamladıktan ve OldValuesParameterFormatStringdüzelttikten sonra, ObjectDataSource tarafından bildirim temelli biçimlendirme aşağıdaki gibi görünmelidir:

<asp:ObjectDataSource ID="CategoriesDataSource" runat="server" 
    OldValuesParameterFormatString="{0}" SelectMethod="GetCategories" 
    TypeName="CategoriesBLL" InsertMethod="InsertWithPicture" 
    DeleteMethod="DeleteCategory">
    <InsertParameters>
        <asp:Parameter Name="categoryName" Type="String" />
        <asp:Parameter Name="description" Type="String" />
        <asp:Parameter Name="brochurePath" Type="String" />
        <asp:Parameter Name="picture" Type="Object" />
    </InsertParameters>
    <DeleteParameters>
        <asp:Parameter Name="categoryID" Type="Int32" />
    </DeleteParameters>
</asp:ObjectDataSource>

ObjectDataSource yapılandırıldıktan sonra, GridView s akıllı etiketinden silmeyi etkinleştir onay kutusunu işaretleyerek GridView 'a silme özellikleri ekleyin. Bu, GridView 'a ShowDeleteButton özelliği trueolarak ayarlanmış bir CommandField ekler.

GridView 'da silme desteğini etkinleştirmek

Şekil 5: GridView 'Da silme desteğini etkinleştirin (tam boyutlu görüntüyü görüntülemek için tıklayın)

Silme işlevini test etmek için bir dakikanızı ayırın. Products tablo s CategoryID ve Categories tablo CategoryIDs arasında bir yabancı anahtar vardır; bu nedenle ilk sekiz kategorinin birini silmeye çalışırsanız yabancı anahtar kısıtlaması ihlali özel durumu alırsınız. Bu işlevi test etmek için, hem bir broşür hem de resim sağlayan yeni bir kategori ekleyin. Şekil 6 ' da gösterilen test kategorim, Test.pdf adlı bir test broşürü dosyası ve bir test resmi içerir. Şekil 7 ' de test kategorisi eklendikten sonra GridView gösterilmektedir.

Broşür ve görüntüyle bir test kategorisi eklemek

Şekil 6: broşür ve görüntüyle bir test kategorisi ekleme (tam boyutlu görüntüyü görüntülemek için tıklayın)

Test kategorisini ekledikten sonra GridView içinde görüntülenir

Şekil 7: test kategorisini ekledikten sonra GridView içinde görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Visual Studio 'da Çözüm Gezgini yenileyin. Artık ~/Brochures klasöründe yeni bir dosya görmeniz gerekir Test.pdf (bkz. Şekil 8).

Sonra, test kategorisi satırındaki Sil bağlantısına tıklayın, sayfanın geri göndermeye ve CategoriesBLL sınıf s DeleteCategory yönteminin tetiklenmesine neden olur. Bu, DAL s Delete yöntemini çağırır ve uygun DELETE bildiriminin veritabanına gönderilmesine neden olur. Veriler daha sonra GridView 'a yeniden bağlanır ve işaretleme, test kategorisi artık mevcut olmayan istemciye geri gönderilir.

Silme iş akışı, Categories tablosundan test kategorisi kaydını başarıyla kaldırırken, Web sunucusu s dosya sisteminden broşür dosyasını kaldırmadı. Çözüm Gezgini yenileyin ve Test.pdf ~/Brochures klasörde hala oturmakta olduğunu görürsünüz.

Test. PDF dosyası Web sunucusu s dosya sisteminden silinmedi

Şekil 8: Test.pdf dosyası Web sunucusu s dosya sisteminden silinmedi

5. Adım: silinen kategori broşür dosyasını kaldırma

Veritabanına dış ikili verileri depolamanın altlarından biri, ilişkili veritabanı kaydı silindiğinde bu dosyaları temizlemek için ek adımların alınması gerekir. GridView ve ObjectDataSource, Delete komutu gerçekleştirildikten sonra ve sonra başlatılan olayları sağlar. Aslında hem ön hem de eylem sonrası olaylar için olay işleyicileri oluşturuyoruz. Categories kaydı silinmeden önce, PDF dosyasının yolunu belirlememiz gerekir, ancak bazı özel durumlar olması ve kategorinin silinmemesi durumunda kategori silinmeden önce PDF 'YI silmek istemiyorum.

GridView s RowDeleting olayı , ObjectDataSource s Delete komutu çağrılmadan önce ateşlenir, bu, RowDeleted olayı sonrasında ateşlenir. Aşağıdaki kodu kullanarak bu iki olay için olay işleyicileri oluşturun:

// A page variable to "remember" the deleted category's BrochurePath value 
string deletedCategorysPdfPath = null;
protected void Categories_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    // Determine the PDF path for the category being deleted...
    int categoryID = Convert.ToInt32(e.Keys["CategoryID"]);
    CategoriesBLL categoryAPI = new CategoriesBLL();
    Northwind.CategoriesDataTable categories = 
        categoryAPI.GetCategoryByCategoryID(categoryID);
    Northwind.CategoriesRow category = categories[0];
    if (category.IsBrochurePathNull())
        deletedCategorysPdfPath = null;
    else
        deletedCategorysPdfPath = category.BrochurePath;
}
protected void Categories_RowDeleted(object sender, GridViewDeletedEventArgs e)
{
    // Delete the brochure file if there were no problems deleting the record
    if (e.Exception == null)
    {
        // Is there a file to delete?
        if (deletedCategorysPdfPath != null)
        {
            System.IO.File.Delete(Server.MapPath(deletedCategorysPdfPath));
        }
    }
}

RowDeleting olay işleyicisinde, silinmekte olan satırın CategoryID, bu olay işleyiciden e.Keys koleksiyonu aracılığıyla erişilebilen GridView s DataKeys koleksiyonundan yapılır. Sonra, CategoriesBLL sınıf s GetCategoryByCategoryID(categoryID), silinmekte olan kayıt hakkında bilgi döndürmek için çağrılır. Döndürülen CategoriesDataRow nesnesininNULL``BrochurePath olmayan bir değeri varsa, dosyanın RowDeleted olay işleyicisinde silinebilmesi için deletedCategorysPdfPath sayfa değişkeninde depolanır.

Note

RowDeleting olay işleyicisinde silinmekte olan Categories kaydı için BrochurePath ayrıntılarını almak yerine, BrochurePath GridView s DataKeyNames özelliğine başka bir şekilde eklemiş ve e.Keys koleksiyonu aracılığıyla kayıt s değerine erişmiş olabilir. Bunun yapılması, GridView s görünüm durumu boyutunu biraz artırır, ancak gereken kod miktarını azaltır ve veritabanına bir seyahat kaydeder.

Temel alınan Delete komutu çağırdıktan sonra, GridView s RowDeleted olay işleyicisi ateşlenir. Verileri silmenin hiçbir özel durum yoksa ve deletedCategorysPdfPathiçin bir değer varsa, PDF dosya sisteminden silinir. Bu ek kodun, resmiyle ilişkili kategori s ikili verilerini temizlemek için gerekli olmadığına unutmayın. Çünkü resim verileri doğrudan veritabanında depolandığından, Categories satırı silindiğinde bu kategori resim verileri de silinir.

İki olay işleyicisini ekledikten sonra bu test çalışmasını yeniden çalıştırın. Kategori silinirken ilişkili PDF de silinir.

Mevcut bir kayıtla ilişkili ikili verilerin güncelleştirilmesi bazı ilginç sorunlar sağlar. Bu öğreticinin geri kalanında, broşür ve resme güncelleştirme özellikleri ekleme işlemi yapılır. Adım 6, adım 7 ' de resmi güncelleştirirken broşür bilgilerini güncelleştirme tekniklerini inceler.

6. Adım: Kategori broşürü güncelleştirme

Veri öğreticisini ekleme, güncelleştirme ve silmeye genel bakış konusunda açıklandığı gibi, GridView, temel alınan veri kaynağı uygun şekilde yapılandırıldıysa bir CheckBox 'ın Tick 'i tarafından uygulanabilecek yerleşik satır düzeyinde yapılandırma desteği sunar. Şu anda, CategoriesDataSource ObjectDataSource henüz güncelleştirme desteğini içerecek şekilde yapılandırılmadı, bu nedenle ' de bunu eklemesini sağlar.

ObjectDataSource 'un veri kaynağını Yapılandır bağlantısına tıklayın ve ikinci adıma ilerleyin. CategoriesBLLkullanılan DataObjectMethodAttribute nedeniyle, GÜNCELLEŞTIRME açılır listesi, dört giriş parametresini kabul eden UpdateCategory aşırı yüklemesiyle otomatik olarak doldurulmalıdır (tüm sütunlar için, ancak Picture). Bunu, beş parametreli aşırı yüklemeyi kullanacak şekilde değiştirin.

, bir resim parametresi Içeren UpdateCategory metodunu kullanmak için ObjectDataSource 'u yapılandırma

Şekil 9: Picture Için bir parametre Içeren UpdateCategory yöntemi kullanmak üzere ObjectDataSource 'ı yapılandırma (tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource artık UpdateMethod özelliği ve karşılık gelen UpdateParameter s için bir değer içerir. Adım 4 ' te belirtildiği gibi, Visual Studio, veri kaynağı Yapılandırma Sihirbazı 'nı kullanırken ObjectDataSource s OldValuesParameterFormatString özelliğini original_{0} olarak ayarlar. Bu, Update ve Delete yöntemi etkinleştirmeleri ile ilgili sorunlara neden olur. Bu nedenle, bu özelliği tamamen temizleyin veya {0}varsayılana sıfırlayın.

Sihirbazı tamamladıktan ve OldValuesParameterFormatStringdüzelttikten sonra, ObjectDataSource tarafından bildirim temelli biçimlendirme aşağıdaki gibi görünmelidir:

<asp:ObjectDataSource ID="CategoriesDataSource" runat="server" 
    OldValuesParameterFormatString="{0}" SelectMethod="GetCategories" 
    TypeName="CategoriesBLL" InsertMethod="InsertWithPicture" 
    DeleteMethod="DeleteCategory" UpdateMethod="UpdateCategory">
    <InsertParameters>
        <asp:Parameter Name="categoryName" Type="String" />
        <asp:Parameter Name="description" Type="String" />
        <asp:Parameter Name="brochurePath" Type="String" />
        <asp:Parameter Name="picture" Type="Object" />
    </InsertParameters>
    <DeleteParameters>
        <asp:Parameter Name="categoryID" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="categoryName" Type="String" />
        <asp:Parameter Name="description" Type="String" />
        <asp:Parameter Name="brochurePath" Type="String" />
        <asp:Parameter Name="picture" Type="Object" />
        <asp:Parameter Name="categoryID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

GridView s yerleşik Düzenle özelliklerini açmak için GridView s akıllı etiketinde Düzenle özelliğini etkinleştir seçeneğini işaretleyin. Bu, CommandField s ShowEditButton özelliğini trueolarak ayarlar, böylece bir düzenleme düğmesi eklenmesine (ve düzenlenmekte olan satır için Update ve Cancel düğmelerine) sahiptir.

GridView 'ı düzenlemesini destekleyecek şekilde yapılandırma

Şekil 10: GridView 'ı düzenlemesini destekleyecek şekilde yapılandırma (tam boyutlu görüntüyü görüntülemek için tıklayın)

Sayfayı tarayıcıda ziyaret edin ve satır s düzenleme düğmelerinden birine tıklayın. CategoryName ve Description BoundFields, metin kutuları olarak işlenir. BrochurePath TemplateField bir EditItemTemplateeksiktir, bu nedenle, ItemTemplate bir bağlantı bağlantısını göstermeye devam eder. Picture ImageField, Text özelliğine CategoryIDImageField s DataImageUrlField değerinin atandığı bir TextBox olarak işlenir.

GridView BrochurePath için bir Editing arabirimi eksik

Şekil 11: GridView BrochurePath Için bir düzenleyen arabirimi yok (tam boyutlu görüntüyü görüntülemek için tıklayın)

BrochurePaths Editing arabirimini özelleştirme

Kullanıcının şunları yapmasına izin veren BrochurePath TemplateField alanı için bir düzen arabirimi oluşturuyoruz.

  • Kategori broşürleri olduğu gibi bırakın,
  • Yeni bir broşür yükleyerek kategori broşürleri güncelleştirin veya
  • Kategori broşürleri tamamen kaldırın (kategorinin artık ilişkili bir broşürü olmaması durumunda).

Ayrıca, Picture ImageField s Editing arabirimini güncelleştirmemiz gerekir, ancak adım 7 ' de bunu kullanacağız.

GridView s akıllı etiketinde Şablonları Düzenle bağlantısına tıklayın ve açılan listeden BrochurePath TemplateField EditItemTemplate ' ı seçin. Bu şablona bir RadioButtonList Web denetimi ekleyin, ID özelliğini BrochureOptions ve AutoPostBack özelliği trueolarak ayarlar. Özellikler penceresi, ListItem koleksiyonu düzenleyicisini getirecek Items özelliğindeki üç noktaya tıklayın. Aşağıdaki üç seçeneği sırasıyla Value s 1, 2 ve 3 ile ekleyin:

  • Geçerli broşürü kullan
  • Geçerli broşürü kaldır
  • Yeni Broşür yükle

İlk ListItem s Selected özelliğini trueolarak ayarlayın.

RadioButtonList için üç ListItems ekleyin

Şekil 12: RadioButtonList ' ye üç ListItem s ekleme

RadioButtonList altına BrochureUploadadlı bir dosya yükleme denetimi ekleyin. Visible özelliğini falseolarak ayarlayın.

EditItemTemplate 'e RadioButtonList ve FileUpload denetimi ekleme

Şekil 13: EditItemTemplate bir RadioButtonList ve FileUpload denetimi ekleme (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu RadioButtonList Kullanıcı için üç seçenek sağlar. Bu düşünce, dosya yükleme denetiminin yalnızca son seçenek olan yeni Broşür yükle seçeneğinin seçili olması durumunda görüntülencedir. Bunu gerçekleştirmek için, RadioButtonList s SelectedIndexChanged olayı için bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

protected void BrochureOptions_SelectedIndexChanged(object sender, EventArgs e)
{
    // Get a reference to the RadioButtonList and its Parent
    RadioButtonList BrochureOptions = (RadioButtonList)sender;
    Control parent = BrochureOptions.Parent;
    // Now use FindControl("controlID") to get a reference of the 
    // FileUpload control
    FileUpload BrochureUpload = 
        (FileUpload)parent.FindControl("BrochureUpload");
    // Only show BrochureUpload if SelectedValue = "3"
    BrochureUpload.Visible = (BrochureOptions.SelectedValue == "3");
}

RadioButtonList ve FileUpload denetimleri bir şablon içinde olduğundan, bu denetimlere programlı olarak erişmek için bir kod yazmanız gerekir. SelectedIndexChanged olay işleyicisine sender giriş parametresinde RadioButtonList başvurusu geçirilir. Dosya karşıya yükleme denetimini almak için, RadioButtonList s üst denetimini almanız ve FindControl("controlID") yöntemi buradan kullanmanız gerekir. Hem RadioButtonList hem de FileUpload denetimlerine bir başvurduktan sonra, FileUpload Control s Visible özelliği yalnızca RadioButtonList s SelectedValue eşitse true olarak ayarlanır. Bu, karşıya yükleme yeni broşürü ListItem``Value.

Bu kodla birlikte, düzen arabirimini test etmek için bir dakikanızı ayırın. Bir satır için Düzenle düğmesine tıklayın. Başlangıçta geçerli broşüri kullan seçeneği seçilmelidir. Seçili dizinin değiştirilmesi geri göndermeye neden olur. Üçüncü seçenek işaretliyse, dosya yükleme denetimi görüntülenir, aksi takdirde gizlidir. Şekil 14 ' te Düzenle düğmesi ilk tıklandığında düzenleme arabirimi gösterilir; Şekil 15, yeni broşür karşıya yükle seçeneği seçildikten sonra arabirimi gösterir.

Başlangıçta geçerli broşürü kullan seçeneği seçilidir

Şekil 14: başlangıçta geçerli broşürü kullan seçeneği seçilidir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Yeni Broşür yükle seçeneğinin seçilmesi dosya yükleme denetimini görüntüler

Şekil 15: yeni Broşür yükle seçeneğinin belirlenmesi, FileUpload denetimini görüntüler (tam boyutlu görüntüyü görüntülemek için tıklayın)

Broşür dosyasını kaydetme veBrochurePathsütunu güncelleştirme

GridView s Update düğmesine tıklandığında RowUpdating olayı ateşlenir. ObjectDataSource s Update komutu çağrılır ve ardından GridView s RowUpdated olayı ateşlenir. Silme iş akışında olduğu gibi, bu olayların her ikisi için de olay işleyicileri oluşturuyoruz. RowUpdating olay işleyicisinde, BrochureOptions RadioButtonList ' nin SelectedValue göre hangi eylemin yapılacağını belirlememiz gerekir:

  • SelectedValue 1 ise, aynı BrochurePath ayarını kullanmaya devam etmek istiyoruz. Bu nedenle, ObjectDataSource brochurePath parametresini güncelleştirilmekte olan kaydın mevcut BrochurePath değerine ayarlamanız gerekir. ObjectDataSource s brochurePath parametresi e.NewValues["brochurePath"] = valuekullanılarak ayarlanabilir.
  • SelectedValue 2 ise, kayıt s BrochurePath değerini NULLolarak ayarlamak istiyoruz. Bu, ObjectDataSource brochurePath parametresi Nothingolarak ayarlanarak gerçekleştirilebilir ve bu, UPDATE ifadesinde kullanılan bir veritabanı NULL sonuçlanır. Kaldırılmakta olan mevcut bir broşür dosyası varsa, var olan dosyayı silmemiz gerekir. Ancak, bunu yalnızca güncelleştirme özel durum oluşturulmadan tamamlanırsa bunu yapmak istiyoruz.
  • SelectedValue 3 ise, kullanıcının bir PDF dosyasını karşıya yükleyip dosya sistemine kaydetmesini ve kayıt s BrochurePath sütun değerini güncelleştirdiğinden emin olmak istiyoruz. Ayrıca, değiştirilmekte olan mevcut bir broşür dosyası varsa, önceki dosyayı silmemiz gerekir. Ancak, bunu yalnızca güncelleştirme özel durum oluşturulmadan tamamlanırsa bunu yapmak istiyoruz.

RadioButtonList s SelectedValue 3 olduğunda tamamlanması gereken adımlar, DetailsView 'un ItemInserting olay işleyicisi tarafından kullanılanlarla neredeyse aynıdır. Bu olay işleyicisi, önceki öğreticideeklediğimiz DetailsView denetiminden yeni bir kategori kaydı eklendiğinde yürütülür. Bu nedenle, bu işlevselliği ayrı yöntemlere yeniden düzenleme behooves. Özellikle, yaygın işlevselliği iki yönteme taşıdım:

  • ProcessBrochureUpload(FileUpload, out bool), bir dosya yükleme denetim örneği ve silme veya düzenleme işleminin devam edip etmediğini veya bazı doğrulama hataları nedeniyle iptal edilip edilmeyeceğini belirten bir çıkış Boole değeri kabul eder. Bu yöntem, kaydedilen dosyanın yolunu veya kaydedilmiş bir dosya yoksa null döndürür.
  • DeleteRememberedBrochurePath, deletedCategorysPdfPath nulldeğilse, sayfa değişkeni deletedCategorysPdfPath yol tarafından belirtilen dosyayı siler.

Bu iki yöntemin kodu aşağıda verilmiştir. Önceki öğreticiden ProcessBrochureUpload ve DetailsView 'un ItemInserting olay işleyicisi arasındaki benzerliğini aklınızda edin. Bu öğreticide, bu yeni yöntemleri kullanmak için DetailsView 'un olay işleyicilerini güncelleştirdim. DetailsView 'un olay işleyicilerindeki değişiklikleri görmek için bu öğreticiyle ilişkili kodu indirin.

private string ProcessBrochureUpload
    (FileUpload BrochureUpload, out bool CancelOperation)
{
    CancelOperation = false;    // by default, do not cancel operation
    if (BrochureUpload.HasFile)
    {
        // Make sure that a PDF has been uploaded
        if (string.Compare(System.IO.Path.GetExtension(BrochureUpload.FileName), 
            ".pdf", true) != 0)
        {
            UploadWarning.Text = 
                "Only PDF documents may be used for a category's brochure.";
            UploadWarning.Visible = true;
            CancelOperation = true;
            return null;
        }
        const string BrochureDirectory = "~/Brochures/";
        string brochurePath = BrochureDirectory + BrochureUpload.FileName;
        string fileNameWithoutExtension = 
            System.IO.Path.GetFileNameWithoutExtension(BrochureUpload.FileName);
        int iteration = 1;
        while (System.IO.File.Exists(Server.MapPath(brochurePath)))
        {
            brochurePath = string.Concat(BrochureDirectory, fileNameWithoutExtension, 
                "-", iteration, ".pdf");
            iteration++;
        }
        // Save the file to disk and set the value of the brochurePath parameter
        BrochureUpload.SaveAs(Server.MapPath(brochurePath));
        return brochurePath;
    }
    else
    {
        // No file uploaded
        return null;
    }
}
private void DeleteRememberedBrochurePath()
{
    // Is there a file to delete?
    if (deletedCategorysPdfPath != null)
    {
        System.IO.File.Delete(Server.MapPath(deletedCategorysPdfPath));
    }
}

Aşağıdaki kodun gösterdiği gibi, GridView s RowUpdating ve RowUpdated olay işleyicileri ProcessBrochureUpload ve DeleteRememberedBrochurePath yöntemlerini kullanır:

protected void Categories_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    // Reference the RadioButtonList
    RadioButtonList BrochureOptions = 
        (RadioButtonList)Categories.Rows[e.RowIndex].FindControl("BrochureOptions");
    // Get BrochurePath information about the record being updated
    int categoryID = Convert.ToInt32(e.Keys["CategoryID"]);
    CategoriesBLL categoryAPI = new CategoriesBLL();
    Northwind.CategoriesDataTable categories = 
        categoryAPI.GetCategoryByCategoryID(categoryID);
    Northwind.CategoriesRow category = categories[0];
    if (BrochureOptions.SelectedValue == "1")
    {
        // Use current value for BrochurePath
        if (category.IsBrochurePathNull())
            e.NewValues["brochurePath"] = null;
        else
            e.NewValues["brochurePath"] = category.BrochurePath;
    }
    else if (BrochureOptions.SelectedValue == "2")
    {
        // Remove the current brochure (set it to NULL in the database)
        e.NewValues["brochurePath"] = null;
    }
    else if (BrochureOptions.SelectedValue == "3")
    {
        // Reference the BrochurePath FileUpload control
        FileUpload BrochureUpload = 
            (FileUpload)Categories.Rows[e.RowIndex].FindControl("BrochureUpload");
        // Process the BrochureUpload
        bool cancelOperation = false;
        e.NewValues["brochurePath"] = 
            ProcessBrochureUpload(BrochureUpload, out cancelOperation);
        e.Cancel = cancelOperation;
    }
    else
    {
        // Unknown value!
        throw new ApplicationException(
            string.Format("Invalid BrochureOptions value, {0}", 
                BrochureOptions.SelectedValue));
    }
    if (BrochureOptions.SelectedValue == "2" || 
        BrochureOptions.SelectedValue == "3")
    {
        // "Remember" that we need to delete the old PDF file
        if (category.IsBrochurePathNull())
            deletedCategorysPdfPath = null;
        else
            deletedCategorysPdfPath = category.BrochurePath;
    }
}
protected void Categories_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
    // If there were no problems and we updated the PDF file, 
    // then delete the existing one
    if (e.Exception == null)
    {
        DeleteRememberedBrochurePath();
    }
}

RowUpdating olay işleyicisinin, BrochureOptions RadioButtonList s SelectedValue özellik değerine göre uygun eylemi gerçekleştirmek için bir dizi koşullu deyim kullandığını aklınızda edin.

Bu kodla birlikte, bir kategoriyi düzenleyebilir ve geçerli broşürü kullanımını, bir broşür veya yenisini yüklemeyi seçebilirsiniz. Devam edin ve deneyin. RowUpdating ve RowUpdated olay işleyicilerinde kesme noktaları ayarlayın ve iş akışını bir fikir alın.

7. Adım: yeni bir resim yükleme

Picture ImageField s Editing Interface, DataImageUrlField özelliğinden alınan değerle doldurulmuş bir TextBox olarak işler. Düzen iş akışı sırasında, GridView bir parametreyi bir parametre adı, ImageField s DataImageUrlField özelliğinin değerini ve parametre s değerini, Editing arabirimindeki metin kutusuna girilen değere geçirir. Bu davranış, görüntü dosya sistemine bir dosya olarak kaydedildiğinde ve DataImageUrlField görüntünün tam URL 'sini içerdiğinde uygundur. Bu gibi durumlarda, düzen arabirimi, kullanıcının değiştirebileceği ve veritabanına geri kaydedildiği görüntü s URL 'sini metin kutusu içinde görüntüler. Verilen bu varsayılan arabirim, kullanıcının yeni bir görüntü yüklemesine izin vermez, ancak görüntünün URL 'sini geçerli değerden diğerine değiştirmesine izin verir. Ancak, bu öğreticide, Picture ikili veriler doğrudan veritabanında depolandığından ve DataImageUrlField özelliği yalnızca CategoryIDtutuyor olduğundan, ImageField 'ın varsayılan düzenlenme arabirimi yeterli değildir.

Bir Kullanıcı bir ImageField ile bir satırı düzenlediğinde öğreticimize ne olduğunu daha iyi anlamak için aşağıdaki örneği göz önünde bulundurun: bir Kullanıcı, CategoryID 10 içeren bir satırı düzenleyerek, Picture ImageField 'ın 10 değeriyle bir TextBox olarak işlenmesine neden olur. Kullanıcının bu metin kutusundaki değeri 50 olarak değiştirdiği ve Güncelleştir düğmesine tıkladığı hakkında düşünün. Bir geri gönderme gerçekleşir ve GridView başlangıçta 50 değeriyle CategoryID adlı bir parametre oluşturur. Ancak, GridView bu parametreyi (ve CategoryName ve Description parametrelerini) göndermeden önce, DataKeys koleksiyonundan değerleri ekler. Bu nedenle, CategoryID parametresi, temel alınan CategoryID değeri olan 10 ' un geçerli satırı ile geçersiz kılar. Kısa bir deyişle, ImageField s DataImageUrlField özelliğinin ve kılavuz s DataKey değerinin adları aynı olduğundan, ImageField s düzen arabirimi bu öğreticide düzenlenen iş akışını etkilemez.

ImageField, veritabanı verilerini temel alan bir görüntünün görüntülenmesini kolaylaştırırken, düzen arabiriminde bir metin kutusu sağlamak istemedik. Bunun yerine, son kullanıcının kategori resmini değiştirmek için kullanabileceği bir dosya karşıya yükleme denetimi sunmak istiyoruz. BrochurePath değerinden farklı olarak, bu öğreticiler için her kategorinin bir resme sahip olması gerektiğine karar veririz. Bu nedenle, kullanıcının ilişkili bir resim olmadığını göstermesi gerekmez ve kullanıcının yeni bir resim yükleyip geçerli resmi olduğu gibi bırakabilir.

ImageField s Editing arabirimini özelleştirmek için onu TemplateField 'a dönüştürmemiz gerekiyor. GridView s akıllı etiketinde sütunları düzenle bağlantısına tıklayın, ImageField ' ı seçin ve bu alanı TemplateField ' a Dönüştür bağlantısına tıklayın.

ImageField 'ı TemplateField 'A Dönüştür

Şekil 16: ImageField 'ı TemplateField 'a dönüştürme

ImageField 'ı bu şekilde bir TemplateField 'a dönüştürmek, iki şablon içeren bir TemplateField oluşturur. Aşağıdaki bildirim temelli sözdiziminin gösterdiği gibi, ItemTemplate, ImageUrl özelliği, ImageField s DataImageUrlField ve DataImageUrlFormatString özelliklerine göre veri bağlama söz dizimi kullanılarak atanan bir görüntü Web denetimi içerir. EditItemTemplate, Text özelliği DataImageUrlField özelliği tarafından belirtilen değere bağlantılı olan bir TextBox içerir.

<asp:TemplateField>
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server" 
            Text='<%# Eval("CategoryID") %>'></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Image ID="Image1" runat="server" 
            ImageUrl='<%# Eval("CategoryID", 
                "DisplayCategoryPicture.aspx?CategoryID={0}") %>' />
    </ItemTemplate>
</asp:TemplateField>

Bir dosya yükleme denetimi kullanmak için EditItemTemplate güncelleştirmemiz gerekiyor. GridView s akıllı etiketinde Şablonları Düzenle bağlantısına tıklayın ve ardından açılan listeden Picture TemplateField EditItemTemplate ' ı seçin. Şablonda bunu bir TextBox görürsünüz. Sonra, bir dosya yükleme denetimini araç kutusundan şablona sürükleyin ve ID PictureUploadolarak ayarlayarak. Ayrıca kategori resmini değiştirmek Için metin ekleyin, yeni bir resim belirtin. Kategorinin görünümünü aynı tutmak için, bu alanı şablon için de boş bırakın.

EditItemTemplate 'e dosya yükleme denetimi ekleme

Şekil 17: EditItemTemplate bir dosya yükleme denetimi ekleme (tam boyutlu görüntüyü görüntülemek için tıklayın)

Düzen arabirimini özelleştirdikten sonra, ilerlemenizi bir tarayıcıda görüntüleyin. Bir satırı salt okuma modunda görüntülerken, kategori s resmi daha önce olduğu gibi gösterilir, ancak Düzenle düğmesine tıklamak resim sütununu bir dosya olarak bir FileUpload denetimiyle metin olarak işler.

, düzen arabirimi bir dosya yükleme denetimi Içerir

Şekil 18: düzen arabirimi bir dosya karşıya yükleme denetimi içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource 'un, resim için ikili verileri bir byte dizisi olarak kabul eden CategoriesBLL sınıf s UpdateCategory yöntemini çağırmak üzere yapılandırıldığını unutmayın. Ancak, bu dizide bir null değeri varsa, diğer UpdateCategory aşırı yükleme çağrılır. Bu, Picture sütununu değiştirmediğinde UPDATE SQL ifadesini veren, bu nedenle kategorinin geçerli resmini bozulmadan bırakır. Bu nedenle, GridView s RowUpdating olay işleyicisinde program aracılığıyla PictureUpload FileUpload denetimine başvurabilmek ve bir dosyanın karşıya yüklenip yüklenmediğini belirlemeniz gerekir. Bunlardan biri karşıya yüklenemediğinden picture parametresi için bir değer belirtmek istemiyorum. Diğer taraftan, bir dosya PictureUpload Fıleupload denetimine yüklenmişse, bunun JPG dosyası olduğundan emin olmak istiyoruz. Bu durumda, ikili içeriğini picture parametresi aracılığıyla ObjectDataSource 'a gönderebiliriz.

Adım 6 ' da kullanılan kodda olduğu gibi, burada gereken kodun çoğu, DetailsView ItemInserting olay işleyicisinde zaten mevcuttur. Bu nedenle, ortak işlevleri yeni bir yönteme yeniden düzenlenmiş, ValidPictureUploadve ItemInserting olay işleyicisini bu yöntemi kullanacak şekilde güncelleştirdim.

Aşağıdaki kodu GridView s RowUpdating olay işleyicisinin başlangıcına ekleyin. Bu kod, geçersiz bir resim dosyası yüklenirse, broşürün Web sunucusu dosya sistemine kaydedilmesini istediğimiz için, bu kodun, broşür dosyasını kaydeden koddan önce geldiği önemli öneme sahiptir.

// Reference the PictureUpload FileUpload
FileUpload PictureUpload = 
    (FileUpload)Categories.Rows[e.RowIndex].FindControl("PictureUpload");
if (PictureUpload.HasFile)
{
    // Make sure the picture upload is valid
    if (ValidPictureUpload(PictureUpload))
    {
        e.NewValues["picture"] = PictureUpload.FileBytes;
    }
    else
    {
        // Invalid file upload, cancel update and exit event handler
        e.Cancel = true;
        return;
    }
}

ValidPictureUpload(FileUpload) yöntemi, tek giriş parametresi olarak bir FileUpload denetimini alır ve karşıya yüklenen dosyanın JPG olduğundan emin olmak için karşıya yüklenen dosya uzantısını denetler; yalnızca bir resim dosyası karşıya yüklenirse çağrılır. Karşıya dosya yüklenayarlanmamışsa, resim parametresi ayarlı değildir ve bu nedenle nullvarsayılan değerini kullanır. Bir resim karşıya yüklenmişse ve ValidPictureUpload truedöndürürse picture parametresine karşıya yüklenen görüntünün ikili verileri atanır; Yöntem falsedöndürürse, güncelleştirme iş akışı iptal edilir ve olay işleyicisinin çıkış yapılır.

ValidPictureUpload(FileUpload) yöntemi kodu, DetailsView 'un ItemInserting olay işleyicisinden şu şekildedir:

private bool ValidPictureUpload(FileUpload PictureUpload)
{
    // Make sure that a JPG has been uploaded
    if (string.Compare(System.IO.Path.GetExtension(PictureUpload.FileName), 
            ".jpg", true) != 0 &&
        string.Compare(System.IO.Path.GetExtension(PictureUpload.FileName), 
            ".jpeg", true) != 0)
    {
        UploadWarning.Text = 
            "Only JPG documents may be used for a category's picture.";
        UploadWarning.Visible = true;
        return false;
    }
    else
    {
        return true;
    }
}

8. Adım: özgün Kategoriler resimlerini JPGs ile değiştirme

Özgün sekiz kategori resimlerinin bir OLE üst bilgisinde kaydırılan bit eşlem dosyaları olduğunu hatırlayın. Artık var olan bir kayıt görüntüsünü düzenleme özelliğini eklediğimiz için, bu bit eşlemleri JPGs ile değiştirmek için bir dakikanızı ayırın. Geçerli kategori resimlerini kullanmaya devam etmek istiyorsanız, aşağıdaki adımları uygulayarak bunları JPGs 'e dönüştürebilirsiniz:

  1. Bit eşlem görüntülerini sabit sürücünüze kaydedin. Tarayıcınızda UpdatingAndDeleting.aspx sayfasını ziyaret edin ve ilk sekiz kategorinin her biri için görüntüye sağ tıklayıp resmi kaydetmeyi seçin.
  2. Görüntüyü istediğiniz görüntü Düzenleyicinizde açın. Örneğin, Microsoft Paint 'i kullanabilirsiniz.
  3. Bit eşlemi JPG görüntüsü olarak kaydedin.
  4. Kategori s resmini, JPG dosyasını kullanarak, düzen arabirimi aracılığıyla güncelleştirin.

Bir kategoriyi düzenledikten ve JPG görüntüsünü karşıya yükledikten sonra, DisplayCategoryPicture.aspx sayfası ilk sekiz kategorinin resimlerinden ilk 78 baytı kullandığından, görüntü tarayıcıda işlenmez. OLE üst bilgisini gerçekleştiren kodu kaldırarak bunu düzeltir. Bunu yaptıktan sonra, DisplayCategoryPicture.aspx``Page_Load olay işleyicisi yalnızca aşağıdaki koda sahip olmalıdır:

protected void Page_Load(object sender, EventArgs e)
{
    int categoryID = Convert.ToInt32(Request.QueryString["CategoryID"]);
    // Get information about the specified category
    CategoriesBLL categoryAPI = new CategoriesBLL();
    Northwind.CategoriesDataTable categories = _
        categoryAPI.GetCategoryWithBinaryDataByCategoryID(categoryID);
    Northwind.CategoriesRow category = categories[0];
    // For new categories, images are JPGs...
    
    // Output HTTP headers providing information about the binary data
    Response.ContentType = "image/jpeg";
    // Output the binary data
    Response.BinaryWrite(category.Picture);
}

Note

UpdatingAndDeleting.aspx sayfa ekleme ve oluşturma arabirimleri biraz daha iş kullanabilir. DetailsView ve GridView 'daki CategoryName ve Description BoundFields, TemplateFields 'e dönüştürülmelidir. CategoryName NULL değerlere izin vermediğinden, bir RequiredFieldValidator eklenmelidir. Description metin kutusu büyük olasılıkla çok satırlı bir metin kutusuna dönüştürülebilmelidir. Bu son aşağı dokunmalar sizin için bir alıştırma olarak bırakıyorum.

Özet

Bu öğreticide, ikili verilerle çalışma hakkındaki görünüm tamamlanır. Bu öğreticide ve önceki üç adımda, ikili verilerin dosya sisteminde veya doğrudan veritabanı içinde nasıl depolanabileceğini gördük. Bir Kullanıcı sabit sürücüsünden bir dosya seçerek ve dosyayı dosya sisteminde depolanabilen veya veritabanına eklenebilen Web sunucusuna yükleyerek sisteme ikili veriler sağlar. ASP.NET 2,0, bu tür bir arabirim sağlayan bir dosya yükleme denetimini sürükleyip bırakma işlemini kolaylaştırıyor. Ancak, karşıya yükleme dosyaları öğreticisinde belirtildiği gibi, dosya karşıya yükleme denetimi yalnızca görece küçük dosya yüklemeleri için uygundur ve ideal olarak bir megabayt aşmaz. Ayrıca, karşıya yüklenen verileri temel alınan veri modeliyle ilişkilendirmeyi ve var olan kayıtlardan ikili verilerin nasıl düzenleneceğini ve silineceğini de araştırıyoruz.

Önümüzdeki öğreticilerimiz çeşitli önbelleğe alma tekniklerini anlatıyor. Önbelleğe alma, pahalı işlemlerden sonuçları alarak ve bunları daha hızlı erişilebilen bir konumda depolayarak, uygulamanın genel performansını artırmak için bir yol sağlar.

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 öğretici için müşteri adayı gözden geçireni bir Murphy idi. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .