Veri Değişikliği Arabirimini Özelleştirme (C#)
tarafından Scott Mitchell
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ı".
Ş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: UygunUpdateProduct
Aşı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 ProductID
beş 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:
- Belirtilen
ProductID
için veritabanından ürün bilgilerini alın. - , ,
SupplierID
CategoryID
ve alanlarını güncelleştirin veDiscontinued
ProductName
- 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 ProductBLL
GetProducts()
ü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.
Ş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 , ,
CategoryName
SupplierName
BoundFields veDiscontinued
CheckBoxField değerlerini içerirProductName
CategoryName
CheckBoxField'dan önce görünecek veSupplierName
alanları (sol tarafta)Discontinued
CategoryName
veSupplierName
BoundFields'ınHeaderText
ö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.
Ş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.
Ş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 false
ayarlarsanı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
, SupplierID
ve Suppliers
özelliklerini içerdiğini CategoryID
Categories
hatırlayın. ProductRow
ve CategoryID
SupplierID
ö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 true
ayarlanmış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
veyaCategoryName
alanları yokturSupplierName
, ancakSupplierID
veCategoryID
. 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 ItemTemplate
SupplierName
ve kullanılabilir kategorileri ve EditItemTemplate
tedarikçileri listelemek için DropDownList denetimi kullanan TemplateField'lere CategoryName
dönüştürmemiz SupplierName
gerekir.
Categories
veSuppliers
DropDownLists 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 EditItemTemplate
TemplateField 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 (CategoryName
yukarıdaki söz diziminde). Etiket Web denetimini DropDownList denetimiyle değiştirerek üzerinde değişiklik EditItemTemplate
yapmamı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 EditItemTemplate
ile çalışmayı seçin. Label Web denetimini kaldırın ve DropDownList denetimiyle değiştirip DropDownList'in ID özelliğini olarak Categories
ayarlayın.
Ş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ı CategoriesDataSource
yeni bir ObjectDataSource oluşturmayı tercih edin.
Ş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.
Şekil 7: ObjectDataSource'unu CategoriesBLL
GetCategories()
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.
Ş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 SuppliersBLL
GetSuppliers()
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).
Ş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 NULL
ayarlandığı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'iCategoryID
veSupplierID
Veri 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.
Ş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.
Ş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 olmayan
NULL
bir kategoriye değiştirmek içinNULL
arabirimimizi kullanamaz - Bir ürünün veya
SupplierID
değeriNULL
CategoryID
varsa, Düzenle düğmesine tıklanması bir özel durumla sonuçlanır. Bunun nedeni, deyiminde (veyaSupplierID
) tarafındanCategoryID
döndürülen değerinBind()
NULL
DropDownList içindeki bir değerle eşlenmemesidir (DropDownList özelliği liste öğeleri koleksiyonunda olmayan bir değere ayarlandığında bir özel durumSelectedValue
oluşturur).
Değerleri ve SupplierID
değerleri desteklemek NULL
CategoryID
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 ListItem
ListItem
gördük. Ancak önceki öğreticide ile bir Value
-1
ekledikListItem
. 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 'Value
lerinin ListItem
boş bir dize olmasını istiyoruz.
DropDownLists'in AppendDataBoundItems
özelliğini olarak true
ayarlayarak başlayın. Ardından, bildirim temelli işaretlemenin NULL
ListItem
ş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 ListItem
Metin 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 NULL
ListItem
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 NULL
ListItem
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 CategoryID
NULL
ListItem
bir NULL
değer atanır.
Tedarikçiler DropDownList için bu adımları yineleyin.
Bu ek ListItem
ile 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
.
Ş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 EditItemTemplate
ile 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 ItemTemplate
olarak false
ayarlanması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 DiscontinuedChoice
EditItemTemplate
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.
Ş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 false
olarak ayarlayın ve içindeki RadioButtonList EditItemTemplate
için özelliğini true
(varsayılan) olarak bırakın Enabled
Enabled
. 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.
Ş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:
- TemplateField ekleme veya var olan bir BoundField veya CheckBoxField'i TemplateField'e dönüştürme
- Arabirimi gerektiği gibi büyütme
- İ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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin