Veri Değişikliği Arabirimini Özelleştirme (C#)

tarafından Scott Mitchell

PDF’yi İndir

Bu öğreticide, standart TextBox ve CheckBox denetimlerini alternatif giriş Web denetimleriyle değiştirerek düzenlenebilir bir GridView arabiriminin nasıl özelleştirileceğine bakacağız.

Giriş

GridView ve DetailsView denetimleri tarafından kullanılan BoundFields ve CheckBoxFields, salt okunur, düzenlenebilir ve eklenebilir arabirimleri işleyebilmeleri nedeniyle verileri değiştirme işlemini basitleştirir. Bu arabirimler ek bildirim temelli işaretleme veya kod eklemeye gerek kalmadan işlenebilir. Ancak BoundField ve CheckBoxField arabirimleri, gerçek dünya senaryolarında genellikle gereken özelleştirilebilirliği içermez. GridView veya DetailsView'da düzenlenebilir veya eklenebilir arabirimi özelleştirmek için bunun yerine TemplateField'ı kullanmamız gerekir.

Önceki öğreticide doğrulama Web denetimleri ekleyerek veri değişikliği arabirimlerini özelleştirmeyi gördük. Bu öğreticide, BoundField ve CheckBoxField'in standart TextBox ve CheckBox denetimlerini alternatif giriş Web denetimleriyle değiştirerek gerçek veri toplama Web denetimlerinin nasıl özelleştirileceğine bakacağız. Özellikle, bir ürünün adının, kategorisinin, tedarikçinin ve kullanımdan kaldırılan durumunun güncelleştirilmesini sağlayan düzenlenebilir bir GridView oluşturacağız. Belirli bir satırı düzenlerken, kategori ve sağlayıcı alanları, aralarından seçim yapabileceğiniz kullanılabilir kategoriler ve sağlayıcılar kümesini içeren DropDownLists olarak işlenir. Ayrıca, CheckBoxField'ın varsayılan CheckBox'ını iki seçenek sunan bir RadioButtonList denetimiyle değiştireceğiz: "Etkin" ve "Sonlandırıldı".

GridView'un Düzenleme Arabirimi DropDownLists ve RadioButton'ları içerir

Şekil 1: GridView'un Düzenleme Arabirimi DropDownLists ve RadioButton'ları içerir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

1. Adım: UygunUpdateProductAşırı Yüklemeyi Oluşturma

Bu öğreticide, bir ürünün adını, kategorisini, tedarikçisini ve kullanımdan kaldırılan durumunu düzenlemeye izin veren düzenlenebilir bir GridView oluşturacağız. Bu nedenle, bu dört ürün değerinin yanı sıra ProductIDbeş giriş parametresi kabul eden bir UpdateProduct aşırı yüklemeye ihtiyacımız vardır. Önceki aşırı yüklemelerimizde olduğu gibi, bu da şunları yapacaktır:

  1. Belirtilen ProductIDiçin veritabanından ürün bilgilerini alın.
  2. , , SupplierIDCategoryIDve alanlarını güncelleştirin ve DiscontinuedProductName
  3. TableAdapter'ın yöntemi aracılığıyla güncelleştirme isteğini DAL'ye Update() gönderin.

Bu özel aşırı yükleme için, bir ürünün üretimden kaldırılmış olarak işaretlenmesini sağlayan iş kuralı denetimini atladım. Bu denetim, tedarikçi tarafından sunulan tek ürün değildir. İsterseniz bunu eklemekten çekinmeyin veya ideal olarak mantığı ayrı bir yöntemle yeniden düzenlemeniz gerekir.

Aşağıdaki kod, sınıfındaki yeni UpdateProduct aşırı yüklemeyi ProductsBLL gösterir:

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, int? categoryID,
    int? supplierID, bool discontinued, int productID)
{
    Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
    if (products.Count == 0)
        // no matching record found, return false
        return false;
    Northwind.ProductsRow product = products[0];
    product.ProductName = productName;
    if (supplierID == null) product.SetSupplierIDNull();
      else product.SupplierID = supplierID.Value;
    if (categoryID == null) product.SetCategoryIDNull();
      else product.CategoryID = categoryID.Value;
    product.Discontinued = discontinued;
    // Update the product record
    int rowsAffected = Adapter.Update(product);
    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}

2. Adım: Düzenlenebilir GridView'ı Oluşturma

UpdateProduct Aşırı yükleme eklendiğinde düzenlenebilir GridView'umuzu oluşturmaya hazırız. Klasördeki EditInsertDelete sayfayı CustomizedUI.aspx açın ve Tasarım Aracı bir GridView denetimi ekleyin. Ardından GridView'un akıllı etiketinden yeni bir ObjectDataSource oluşturun. Sınıfın yöntemi aracılığıyla ProductBLLGetProducts() ürün bilgilerini almak ve yeni oluşturduğumuz aşırı yüklemeyi kullanarak UpdateProduct ürün verilerini güncelleştirmek için ObjectDataSource'u yapılandırın. EKLE ve Sİl sekmelerinden açılan listelerden (Yok) öğesini seçin.

ObjectDataSource'ı Az Önce Oluşturulan UpdateProduct Aşırı Yüklemesini Kullanacak Şekilde Yapılandırma

Şekil 2: ObjectDataSource'ı Yeni Oluşturulan Aşırı Yüklemeyi Kullanacak UpdateProduct Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Veri değiştirme öğreticileri boyunca gördüğümüz gibi, Visual Studio tarafından oluşturulan ObjectDataSource için bildirim temelli söz dizimi özelliğini öğesine original_{0}atarOldValuesParameterFormatString. Yöntemlerimiz özgün ProductID değerin geçirilmesini beklemediğinden bu elbette İş Mantığı Katmanımızla çalışmaz. Bu nedenle, önceki öğreticilerde yaptığımız gibi, bu özellik atamasını bildirim temelli söz diziminden kaldırmak için biraz zaman ayırın veya bunun yerine bu özelliğin değerini olarak {0}ayarlayın.

Bu değişiklik sonrasında ObjectDataSource'un bildirim temelli işaretlemesi aşağıdaki gibi görünmelidir:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="GetProducts" TypeName="ProductsBLL"
    UpdateMethod="UpdateProduct">
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

özelliğinin OldValuesParameterFormatString kaldırıldığını ve koleksiyonda UpdateParameters aşırı yüklememiz UpdateProduct tarafından beklenen giriş parametrelerinin her biri için bir Parameter olduğunu unutmayın.

ObjectDataSource, ürün değerlerinin yalnızca bir alt kümesini güncelleştirecek şekilde yapılandırılmış olsa da GridView şu anda tüm ürün alanlarını gösterir. GridView'ı şu şekilde düzenlemek için biraz zaman ayırın:

  • Yalnızca , , CategoryNameSupplierNameBoundFields ve Discontinued CheckBoxField değerlerini içerir ProductName
  • CategoryName CheckBoxField'dan önce görünecek ve SupplierName alanları (sol tarafta)Discontinued
  • CategoryName ve SupplierName BoundFields'ın HeaderText özelliği sırasıyla "Category" ve "Supplier" olarak ayarlanır
  • Düzenleme desteği etkinleştirildi (GridView'un akıllı etiketinde Düzenlemeyi Etkinleştir onay kutusunu işaretleyin)

Bu değişikliklerden sonra Tasarım Aracı Şekil 3'e benzer ve GridView'un bildirim temelli söz dizimi aşağıda gösterilmiştir.

GridView'dan Gereksiz Alanları Kaldırma

Şekil 3: GridView'dan Gereksiz Alanları Kaldırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:BoundField DataField="ProductName"
           HeaderText="ProductName" SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category"
           ReadOnly="True"
           SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier"
           ReadOnly="True"
           SortExpression="SupplierName" />
        <asp:CheckBoxField DataField="Discontinued"
           HeaderText="Discontinued" SortExpression="Discontinued" />
    </Columns>
</asp:GridView>

Bu noktada GridView'un salt okunur davranışı tamamlanır. Veriler görüntülenirken, her ürün GridView'da bir satır olarak işlenir ve ürünün adı, kategorisi, sağlayıcısı ve kullanımdan kaldırılan durumu gösterilir.

GridView'ın Read-Only Arabirimi Tamamlandı

Şekil 4: GridView'un Read-Only Arabirimi Tamamlandı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Veri Ekleme, Güncelleştirme ve Silmeye Genel Bakış öğreticisinde açıklandığı gibi, GridView görünüm durumunun (varsayılan davranış) etkinleştirilmesi çok önemlidir. GridView s EnableViewState özelliğini olarak falseayarlarsanız, eşzamanlı kullanıcıların istemeden kayıtları silmesini veya düzenlemesini sağlarsınız.

3. Adım: Kategori ve Sağlayıcı Düzenleme Arabirimleri için DropDownList Kullanma

NesneninProductsRow, veritabanı tablosundaki gerçek yabancı anahtar kimliği değerlerini ve ve SupplierName tablolarındaki Products karşılık gelen Name değerleri sağlayan , CategoryName, SupplierIDve Suppliers özelliklerini içerdiğini CategoryIDCategories hatırlayın. ProductRowve CategoryIDSupplierID özellikleri salt okunur olarak işaretlenirken CategoryName hem 'ler hem de 'den okunabilir ve SupplierName 'ye yazılabilir.

ve SupplierName özelliklerinin salt okunur durumu CategoryName nedeniyle, karşılık gelen BoundField'ların ReadOnly özelliği olarak trueayarlanmıştır ve bu da bir satır düzenlendiğinde bu değerlerin değiştirilmesini önlemektedir. özelliğini olarak ayarlayabilirizReadOnly, ancak düzenleme sırasında ve SupplierName BoundFields öğelerini TextBoxes olarak işleyebilirizCategoryName, ancak kullanıcı ürünü güncelleştirmeye çalıştığında ve SupplierName girişlerini alan CategoryName bir aşırı yükleme olmadığından UpdateProduct böyle bir yaklaşım özel durumla sonuçlanır.false Aslında, iki nedenden dolayı böyle bir aşırı yükleme oluşturmak istemeyiz:

  • Tabloda Products veya CategoryName alanları yokturSupplierName, ancak SupplierID ve CategoryID. Bu nedenle, yöntemimizin arama tablolarının değerlerini değil, bu belirli kimlik değerlerinin geçirilmesini istiyoruz.
  • Kullanıcının sağlayıcının veya kategorinin adını yazmasını istemek idealden daha azdır, kullanıcının kullanılabilir kategorileri ve tedarikçileri ve doğru yazımlarını bilmesini gerektirir.

Sağlayıcı ve kategori alanları, salt okunur moddayken (şu anda olduğu gibi) kategoriyi ve sağlayıcıların adlarını ve düzenlenirken geçerli seçeneklerin açılan listesini görüntülemelidir. Açılan listeyi kullanarak, son kullanıcı hangi kategorilerin ve tedarikçilerin seçilebilir olduğunu hızlı bir şekilde görebilir ve seçimini daha kolay yapabilir.

Bu davranışı sağlamak için ve CategoryName BoundField değerlerini yayan ItemTemplateSupplierName ve kullanılabilir kategorileri ve EditItemTemplate tedarikçileri listelemek için DropDownList denetimi kullanan TemplateField'lere CategoryName dönüştürmemiz SupplierName gerekir.

CategoriesveSuppliersDropDownLists ekleme

ve CategoryName BoundFields öğelerini TemplateFields'e dönüştürerek SupplierName başlayın: GridView'un akıllı etiketinden Sütunları Düzenle bağlantısına tıklayın; sol alttaki listeden BoundField'i seçin ve "Bu alanı TemplateField'e dönüştür" bağlantısına tıklayın. Dönüştürme işlemi, aşağıdaki bildirim temelli söz diziminde gösterildiği gibi hem hem ItemTemplate de ile bir EditItemTemplateTemplateField oluşturur:

<asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
    <EditItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Eval("CategoryName") %>'></asp:Label>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("CategoryName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

BoundField salt okunur olarak işaretlendiğinden ItemTemplate , hem EditItemTemplate de özelliği geçerli veri alanına bağlı olan Text bir Etiket Web denetimi içerir (CategoryNameyukarıdaki söz diziminde). Etiket Web denetimini DropDownList denetimiyle değiştirerek üzerinde değişiklik EditItemTemplateyapmamız gerekir.

Önceki öğreticilerde gördüğümüz gibi, şablon Tasarım Aracı aracılığıyla veya doğrudan bildirim temelli söz diziminden düzenlenebilir. Tasarım Aracı aracılığıyla düzenlemek için GridView'un akıllı etiketinden Şablonları Düzenle bağlantısına tıklayın ve Kategori alanının EditItemTemplateile çalışmayı seçin. Label Web denetimini kaldırın ve DropDownList denetimiyle değiştirip DropDownList'in ID özelliğini olarak Categoriesayarlayın.

TexBox'ı kaldırma ve EditItemTemplate'a DropDownList Ekleme

Şekil 5: TexBox'ı kaldırma ve Öğesine DropDownList EditItemTemplate Ekleme (Tam boyutlu resmi görüntülemek için tıklayın)

Bir sonraki adımda DropDownList'i kullanılabilir kategorilerle doldurmamız gerekiyor. DropDownList'in akıllı etiketinden Veri Kaynağı Seç bağlantısına tıklayın ve adlı CategoriesDataSourceyeni bir ObjectDataSource oluşturmayı tercih edin.

CategoriesDataSource Adlı Yeni Bir ObjectDataSource Denetimi Oluşturma

Şekil 6: Adlı CategoriesDataSource Yeni Bir ObjectDataSource Denetimi Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu ObjectDataSource'un tüm kategorileri döndürmesini sağlamak için sınıfın GetCategories() yöntemine CategoriesBLL bağlayın.

ObjectDataSource'ı CategoriesBLL'nin GetCategories() Yöntemine Bağlama

Şekil 7: ObjectDataSource'unu CategoriesBLLGetCategories() yöntemine bağlama (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son olarak DropDownList'in ayarlarını CategoryName , her DropDownList'te ListItem değeri olarak kullanılan alanla CategoryID görüntülenecek şekilde yapılandırın.

CategoryName Alanının Görüntülenmesini ve CategoryID Değerinin Kullanılması

Şekil 8: Alanın Görüntülenmesini CategoryName ve CategoryID Değer Olarak Kullanılmasını Sağlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu değişiklikleri yaptıktan sonra TemplateField içindeki CategoryName için EditItemTemplate bildirim temelli işaretleme hem DropDownList hem de ObjectDataSource içerir:

<asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
    <EditItemTemplate>
        <asp:DropDownList ID="Categories" runat="server"
          DataSourceID="CategoriesDataSource"
          DataTextField="CategoryName" DataValueField="CategoryID">
        </asp:DropDownList>
        <asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
            OldValuesParameterFormatString="original_{0}"
            SelectMethod="GetCategories" TypeName="CategoriesBLL">
        </asp:ObjectDataSource>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("CategoryName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Not

içindeki DropDownList öğesinin EditItemTemplate görünüm durumu etkin olmalıdır. Yakında DropDownList'in bildirim temelli söz dizimine ve gibi Eval() veri bağlama komutlarına veri bağlama söz dizimi ekleyeceğiz ve Bind() yalnızca görüntüleme durumu etkinleştirilmiş denetimlerde görüntülenebilir.

TemplateField'in öğesine adlı Suppliers bir DropDownList eklemek için SupplierName bu adımları yineleyin.EditItemTemplate Bu, öğesine DropDownList EditItemTemplate eklemeyi ve başka bir ObjectDataSource oluşturmayı içerir. Suppliers Ancak DropDownList'in ObjectDataSource'u sınıfın SuppliersBLLGetSuppliers() yöntemini çağıracak şekilde yapılandırılmalıdır. Buna ek olarak DropDownList'i alanı görüntüleyecek CompanyName ve alanını s değeri olarak kullanacak SupplierID şekilde ListItem yapılandırınSuppliers.

İkisine DropDownLists EditItemTemplate ekledikten sonra, sayfayı bir tarayıcıda yükleyin ve Chef Anton'un Cajun Seasoning ürününün Düzenle düğmesine tıklayın. Şekil 9'da gösterildiği gibi, ürünün kategorisi ve tedarikçi sütunları, seçilebilecek kategorileri ve tedarikçileri içeren açılan listeler olarak işlenir. Bununla birlikte, Chef Anton'un Cajun Seasoning'i New Orleans Cajun Delights tarafından sağlanan bir Çeşide sahip olsa da, her iki açılan listedeki ilk öğelerin varsayılan olarak seçildiğini unutmayın (kategori için İçecekler ve sağlayıcı olarak Egzotik Sıvılar).

Drop-Down Listeler İlk Öğe Varsayılan Olarak Seçilidir

Şekil 9: Drop-Down Listeler'daki İlk Öğe Varsayılan Olarak Seçilidir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ayrıca Güncelleştir'e tıklarsanız ürünün CategoryID ve SupplierID değerlerinin olarak NULLayarlandığını görürsünüz. Bu istenmeyen davranışların her ikisi de, içindeki DropDownLists EditItemTemplate temel alınan ürün verilerinden herhangi bir veri alanına bağlı olmadığından kaynaklanıyor.

DropDownLists'iCategoryIDveSupplierIDVeri Alanlarına Bağlama

Düzenlenen ürünün kategorisini ve tedarikçi açılan listelerini uygun değerlere ayarlamak ve Güncelleştir'e tıklandıktan sonra bu değerleriN BLL UpdateProduct yöntemine geri gönderilmesini sağlamak için, iki yönlü veri bağlamayı kullanarak DropDownLists'in SelectedValue özelliklerini CategoryID ve SupplierID veri alanlarına bağlamamız gerekir. Bunu DropDownList ile Categories gerçekleştirmek için doğrudan bildirim temelli söz dizimine ekleyebilirsiniz SelectedValue='<%# Bind("CategoryID") %>' .

Alternatif olarak, Tasarım Aracı aracılığıyla şablonu düzenleyip DropDownList'in akıllı etiketinden Verileri DüzenleBindings bağlantısına tıklayarak DropDownList'in veri bağlamalarını ayarlayabilirsiniz. Ardından, özelliğin SelectedValue alana iki yönlü veri bağlama kullanılarak bağlanması CategoryID gerektiğini belirtin (bkz. Şekil 10). Veri alanını Suppliers DropDownList'e bağlamak SupplierID için bildirim temelli veya Tasarım Aracı işlemini yineleyin.

Two-Way Databinding Kullanarak CategoryID değerini DropDownList'in SelectedValue Özelliğine Bağlama

Şekil 10: Two-Way Databinding Kullanarak DropDownList'in SelectedValue Özelliğine bağlama CategoryID (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bağlamalar iki DropDownLists'in özelliklerine SelectedValue uygulandıktan sonra, düzenlenen ürünün kategorisi ve tedarikçi sütunları varsayılan olarak geçerli ürünün değerlerine ayarlanır. Güncelleştir'e tıklanmasıyla, CategoryID seçilen açılan liste öğesinin ve SupplierID değerleri yöntemine UpdateProduct geçirilir. Şekil 11'de veri bağlama deyimleri eklendikten sonra öğretici gösterilir; Chef Anton'un Cajun Seasoning'i için seçilen açılan liste öğelerinin condiment ve New Orleans Cajun Delights'in doğru şekilde nasıl olduğunu not edin.

Düzenlenen Ürünün Geçerli Kategorisi ve Tedarikçi Değerleri Varsayılan Olarak Seçilidir

Şekil 11: Düzenlenen Ürünün Geçerli Kategorisi ve Sağlayıcı Değerleri Varsayılan Olarak Seçilidir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Değerleri İşlemeNULL

Tablodaki Products ve SupplierID sütunları olabilirNULL, ancak içindeki DropDownLists EditItemTemplate değerleri bir değeri temsil NULL eden bir CategoryID liste öğesi içermez. Bunun iki sonucu vardır:

  • Kullanıcı, bir ürünün kategorisini veya tedarikçisini değer olmayanNULL bir kategoriye değiştirmek için NULL arabirimimizi kullanamaz
  • Bir ürünün veya SupplierIDdeğeri NULLCategoryID varsa, Düzenle düğmesine tıklanması bir özel durumla sonuçlanır. Bunun nedeni, deyiminde (veya SupplierID) tarafından CategoryID döndürülen değerin Bind()NULL DropDownList içindeki bir değerle eşlenmemesidir (DropDownList özelliği liste öğeleri koleksiyonunda olmayan bir değere ayarlandığında bir özel durum SelectedValue oluşturur).

Değerleri ve SupplierID değerleri desteklemek NULLCategoryID için, değeri temsil NULL etmek için her DropDownList'e başka bir ListItem tane eklememiz gerekir. DropDownList ile Ana/Ayrıntı Filtreleme öğreticisinde, DropDownList'inAppendDataBoundItems özelliğini olarak ayarlamayı ve ekleri el ile eklemeyi içeren bir databound DropDownList'e true nasıl ekleneceğini ListItemListItemgördük. Ancak önceki öğreticide ile bir Value-1ekledikListItem. Ancak ASP.NET'daki veri bağlama mantığı, boş bir dizeyi otomatik olarak bir NULL değere dönüştürür ve tam tersi de geçerlidir. Bu nedenle, bu öğretici için 'Valuelerinin ListItemboş bir dize olmasını istiyoruz.

DropDownLists'in AppendDataBoundItems özelliğini olarak trueayarlayarak başlayın. Ardından, bildirim temelli işaretlemenin NULLListItem şuna benzemesi için her DropDownList öğesine aşağıdaki <asp:ListItem> öğeyi ekleyerek öğesini ekleyin:

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

Bunun ListItemMetin değeri olarak "(Hiçbiri)" kullanmayı seçtim, ancak isterseniz bunu boş bir dize olarak da değiştirebilirsiniz.

Not

DropDownList ile Ana/Ayrıntı Filtreleme öğreticisinde gördüğümüz gibi, ListItem Özellikler penceresi DropDownList'in Items özelliğine (Koleksiyon Düzenleyici görüntülenecekListItem) tıklayarak Tasarım Aracı aracılığıyla DropDownList'e eklenebilir. Ancak, bildirim temelli söz dizimi aracılığıyla bu öğretici için öğesini eklediğinizden NULLListItem emin olun. Koleksiyon Düzenleyici kullanırsanızListItem, oluşturulan bildirim temelli söz dizimi boş bir dize atandığında ayarı tamamen atlar Value ve şöyle bildirim temelli işaretleme oluşturur: <asp:ListItem>(None)</asp:ListItem>. Bu zararsız görünse de, eksik Değer DropDownList özelliğinin Text yerine özellik değerini kullanmasına neden olur. Başka bir deyişle, bu NULLListItem seçilirse "(Hiçbiri)" değeri öğesine atanmaya CategoryIDçalışılır ve bu da bir özel durumla sonuçlanır. açıkça ayarlandığındaValue="", seçildiğinde değerine CategoryIDNULLListItem bir NULL değer atanır.

Tedarikçiler DropDownList için bu adımları yineleyin.

Bu ek ListItemile düzenleme arabirimi artık Şekil 12'de CategoryID gösterildiği gibi bir Ürünün ve SupplierID alanlarının değerlerini atayabilirNULL.

Bir Ürünün Kategorisi veya Sağlayıcısı için NULL Değer Atamak için (Yok) seçeneğini belirleyin

Şekil 12: Bir Ürünün Kategorisine veya Sağlayıcısına Değer Atamak NULL için (Hiçbiri) öğesini seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

4. Adım: Durdurulan Durum için RadioButtons Kullanma

Şu anda ürünlerin Discontinued veri alanı, salt okunur satırlar için devre dışı bırakılmış bir onay kutusunu ve düzenlenmekte olan satır için etkin bir onay kutusunu işleyen bir CheckBoxField kullanılarak ifade edilir. Bu kullanıcı arabirimi genellikle uygun olsa da, gerekirse TemplateField kullanarak özelleştirebiliriz. Bu öğretici için CheckBoxField'i, kullanıcının ürünün Discontinued değerini belirtebileceği iki "Etkin" ve "Sonlandırıldı" seçeneğine sahip bir RadioButtonList denetimi kullanan bir TemplateField olarak değiştirelim.

Başlangıç olarak CheckBoxField'i Discontinued TemplateField'e dönüştürerek başlayın. Bu, ve EditItemTemplateile ItemTemplate bir TemplateField oluşturur. Her iki şablon da özelliği veri alanına bağlı bir CheckBox Checked içerir; ikisi arasındaki tek fark, 's CheckBox'ın Enabled özelliğinin ItemTemplateolarak falseayarlanmasıdır.Discontinued

Hem hem de ItemTemplate içindeki CheckBox değerini RadioButtonList denetimiyle değiştirin ve her iki RadioButtonLists'in ID özelliklerini olarak DiscontinuedChoiceEditItemTemplate ayarlayın. Ardından, RadioButtonLists'in her biri "False" değerine sahip "Etkin" ve biri de "True" değeriyle "Sonlandırıldı" etiketli iki radyo düğmesi içermesi gerektiğini belirtin. Bunu yapmak için öğeleri doğrudan bildirim temelli söz dizimi aracılığıyla girebilir <asp:ListItem> veya Tasarım Aracı Koleksiyon Düzenleyici kullanabilirsinizListItem. Şekil 13'deListItem, iki radyo düğmesi seçeneği belirtildikten sonra Koleksiyon Düzenleyici gösterilmektedir.

Ekle

Şekil 13: RadioButtonList'e "Etkin" ve "Sonlandırıldı" Seçenekleri ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

içindeki ItemTemplate RadioButtonList düzenlenebilir olmaması gerektiğinden, özelliğini falseolarak ayarlayın ve içindeki RadioButtonList EditItemTemplateiçin özelliğini true (varsayılan) olarak bırakın EnabledEnabled. Bu, düzenlenemeyen satırdaki radyo düğmelerini salt okunur yapar, ancak kullanıcının düzenlenen satır için RadioButton değerlerini değiştirmesine izin verir.

Ürünün veri alanına göre Discontinued uygun radyo düğmesinin seçilmesi için RadioButtonList denetimlerinin SelectedValue özelliklerini atamamız gerekiyor. Bu öğreticinin önceki bölümlerinde incelenen DropDownLists'te olduğu gibi, bu veri bağlama söz dizimi doğrudan bildirim temelli işaretlemeye veya RadioButtonLists'in akıllı etiketlerindeki DataBindings'i Düzenle bağlantısı aracılığıyla eklenebilir.

İki RadioButtonList ekledikten ve yapılandırdıktan sonra TemplateField'in Discontinued bildirim temelli işaretlemesi şöyle görünmelidir:

<asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
    <ItemTemplate>
        <asp:RadioButtonList ID="DiscontinuedChoice" runat="server"
          Enabled="False" SelectedValue='<%# Bind("Discontinued") %>'>
            <asp:ListItem Value="False">Active</asp:ListItem>
            <asp:ListItem Value="True">Discontinued</asp:ListItem>
        </asp:RadioButtonList>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:RadioButtonList ID="DiscontinuedChoice" runat="server"
            SelectedValue='<%# Bind("Discontinued") %>'>
            <asp:ListItem Value="False">Active</asp:ListItem>
            <asp:ListItem Value="True">Discontinued</asp:ListItem>
        </asp:RadioButtonList>
    </EditItemTemplate>
</asp:TemplateField>

Bu değişikliklerle Discontinued , sütun onay kutuları listesinden radyo düğmesi çiftleri listesine dönüştürüldü (bkz. Şekil 14). Bir ürünü düzenlerken uygun radyo düğmesi seçilir ve diğer radyo düğmesi seçilerek ve Güncelleştir'e tıklanarak ürünün kullanımdan kaldırılan durumu güncelleştirilebilir.

Durdurulan Onay Kutuları Radyo Düğmesi Çiftleri ile Değiştirildi

Şekil 14: Sonlandırılan Onay Kutuları Radyo Düğmesi Çiftleri ile Değiştirildi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Veritabanındaki Discontinued sütun değere Products sahip NULL olamayacağından, arabirimdeki bilgileri yakalama NULL konusunda endişelenmemiz gerekmez. Ancak sütunda değerler bulunabiliyorsaNULL, Discontinued kategori ve sağlayıcı DropDownLists'te olduğu gibi boş dize ()Value="" olarak ayarlanmış listeye Value üçüncü bir radyo düğmesi eklemek isteyebiliriz.

Özet

BoundField ve CheckBoxField otomatik olarak salt okunur, düzenleme ve ekleme arabirimleri oluştururken, özelleştirme yeteneğine sahip değillerdir. Ancak genellikle düzenleme veya ekleme arabirimini özelleştirmemiz, belki de doğrulama denetimleri eklememiz (önceki öğreticide gördüğümüz gibi) veya veri toplama kullanıcı arabirimini özelleştirerek (bu öğreticide gördüğümüz gibi) gerekir. Arabirimin TemplateField ile özelleştirilmesi aşağıdaki adımlarda özetlenebilir:

  1. TemplateField ekleme veya var olan bir BoundField veya CheckBoxField'i TemplateField'e dönüştürme
  2. Arabirimi gerektiği gibi büyütme
  3. İki yönlü veri bağlamayı kullanarak uygun veri alanlarını yeni eklenen Web denetimlerine bağlama

Yerleşik ASP.NET Web denetimlerini kullanmanın yanı sıra, templateField şablonlarını özel, derlenmiş sunucu denetimleri ve Kullanıcı Denetimleri ile de özelleştirebilirsiniz.

Mutlu Programlama!

Yazar hakkında

Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.