Veritabanı ile CascadingDropDown Kullanma (VB)

Christian Wenz tarafından

PDF’yi İndir

AJAX Denetim Araç Seti'ndeki CascadingDropDown denetimi, DropDownList denetimini genişleterek bir DropDownList'teki değişikliklerin ilişkili değerleri başka bir DropDownList'e yüklemesini sağlar. Bunun çalışması için özel bir web hizmeti oluşturulmalıdır.

Genel Bakış

AJAX Denetim Araç Seti'ndeki CascadingDropDown denetimi, DropDownList denetimini genişleterek bir DropDownList'teki değişikliklerin ilişkili değerleri başka bir DropDownList'e yüklemesini sağlar. (Örneğin, bir liste ABD eyaletlerinin listesini sağlar ve bir sonraki liste de bu eyaletteki büyük şehirlerle doldurulur.) Bunun çalışması için özel bir web hizmeti oluşturulmalıdır.

Adımlar

Her şeyden önce, bir veri kaynağı gereklidir. Bu örnekte AdventureWorks veritabanı ve Microsoft SQL Server 2005 Express Sürüm kullanılır. Veritabanı, Visual Studio yüklemesinin isteğe bağlı bir parçasıdır (express edition dahil) ve altında https://go.microsoft.com/fwlink/?LinkId=64064ayrı bir indirme olarak da kullanılabilir. AdventureWorks veritabanı, SQL Server 2005 Örnekleri ve Örnek Veritabanlarının bir parçasıdır (adresinden https://www.microsoft.com/download/details.aspx?id=10679indirin). Veritabanını ayarlamanın en kolay yolu Microsoft SQL Server Management Studio (/sql/ssms/download-sql-server-management-studio-ssms) kullanmak ve veritabanı dosyasını eklemektirAdventureWorks.mdf.

Bu örnek için, SQL Server 2005 Express Sürüm örneğinin çağrıldığını SQLEXPRESS ve web sunucusuyla aynı makinede bulunduğunu varsayarız; bu aynı zamanda varsayılan kurulumdur. Kurulumunuz farklıysa, veritabanı için bağlantı bilgilerini uyarlamanız gerekir.

ASP.NET AJAX ve Denetim Araç Seti'nin işlevselliğini etkinleştirmek için, ScriptManager denetim sayfanın herhangi bir yerine (ancak öğesi içinde <form> ) yerleştirilmelidir:

<asp:ScriptManager ID="asm" runat="server" />

Sonraki adımda iki DropDownList denetimi gerekir. Bu örnekte AdventureWorks'teki satıcı ve iletişim bilgilerini kullanırız, bu nedenle kullanılabilir satıcılar için bir liste ve kullanılabilir kişiler için bir liste oluştururuz:

<div>
 Vendor: <asp:DropDownList ID="VendorsList" runat="server"/><br />
 Contacts: <asp:DropDownList ID="ContactsList" runat="server"/><br />
</div>

Ardından, sayfaya iki CascadingDropDown genişletici eklenmelidir. Biri ilk (satıcılar) listesini, diğeri de ikinci (kişiler) listesini doldurur. Aşağıdaki öznitelikler ayarlanmalıdır:

  • ServicePath: Liste girdilerini teslim eden bir web hizmetinin URL'si
  • ServiceMethod: Liste girdilerini teslim eden web yöntemi
  • TargetControlID: Açılan listenin kimliği
  • Category: Çağrıldığında web yöntemine gönderilen kategori bilgileri
  • PromptText: Liste verileri sunucudan zaman uyumsuz olarak yüklenirken görüntülenen metin
  • ParentControlID: (isteğe bağlı) geçerli listenin yüklenmesini tetikleyen üst açılan liste

Kullanılan programlama diline bağlı olarak, söz konusu web hizmetinin adı değişir, ancak diğer tüm öznitelik değerleri aynıdır. İlk açılan listenin CascadingDropDown öğesi aşağıdadır:

<ajaxToolkit:CascadingDropDown ID="ccd1" runat="server"
 ServicePath="CascadingDropdown1.vb.asmx" ServiceMethod="GetVendors"
 TargetControlID="VendorsList" Category="Vendor"
 PromptText="Select Vendor" />

İkinci listenin denetim genişleticilerinin özniteliğini ParentControlID ayarlaması gerekir; böylece satıcı listesinden bir giriş seçildiğinde kişi listesindeki ilişkili öğelerin yüklenmesi tetiklenebilir.

<ajaxToolkit:CascadingDropDown ID="ccd2" runat="server"
 ServicePath="CascadingDropdown1.vb.asmx" ServiceMethod="GetContactsForVendor"
 TargetControlID="ContactsList" ParentControlID="VendorsList"
 Category="Contact"
 PromptText="Select Contact" />

Gerçek iş daha sonra web hizmetinde yapılır ve bu işlem aşağıdaki gibi ayarlanır. Özniteliğin [ScriptService] kullanıldığını, aksi takdirde ASP.NET AJAX'ın istemci tarafı betik kodundan web yöntemlerine erişmek için JavaScript proxy'sini oluşturamadığını unutmayın.

<%@ WebService Language="VB" Class="CascadingDropdown1" %>
Imports System.Web.Script.Services
Imports AjaxControlToolkit
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Collections.Generic
Imports System.Collections.Specialized
Imports System.Data.SqlClient
<ScriptService()> _
Public Class CascadingDropdown1
 Inherits System.Web.Services.WebService
 ' ...
End Class

CascadingDropDown tarafından çağrılan web yöntemlerinin imzası aşağıdaki gibidir:

Public Function MethodNameHere(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()

Bu nedenle dönüş değeri, Denetim Araç Seti tarafından tanımlanan türde CascadingDropDownNameValue bir dizi olmalıdır. Yöntemin GetVendors() uygulanması oldukça kolaydır: Kod AdventureWorks veritabanına bağlanır ve ilk 25 satıcıyı sorgular. Oluşturucudaki CascadingDropDownNameValue ilk parametre, liste girdisinin başlık, ikincisi değeridir (HTML'nin <option> öğesindeki değer özniteliği). Kod aşağıdaki gibidir:

<WebMethod()> _
Public Function GetVendors(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
 Dim conn As New SqlConnection("server=(local)\SQLEXPRESS; Integrated Security=true; Initial Catalog=AdventureWorks")
 conn.Open()
 Dim comm As New SqlCommand( _
 "SELECT TOP 25 VendorID, Name FROM Purchasing.Vendor", conn)
 Dim dr As SqlDataReader = comm.ExecuteReader()
 Dim l As New List(Of CascadingDropDownNameValue)
 While (dr.Read())
 l.Add(New CascadingDropDownNameValue(dr("Name").ToString(),dr("VendorID").ToString()))
 End While
 conn.Close()
 Return l.ToArray()
End Function

Bir satıcı için ilişkili kişileri almak (yöntem adı: GetContactsForVendor()) biraz daha karmaşıktır. Her şeyden önce, ilk açılan listede seçilen satıcı belirlenmelidir. Denetim Araç Seti bu görev için bir yardımcı yöntem tanımlar: ParseKnownCategoryValuesString() yöntemi, açılan verileri içeren bir StringDictionary öğe döndürür:

<WebMethod()> _
Public Function GetContactsForVendor(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
 Dim VendorID As Integer
 CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues)

Güvenlik nedeniyle önce bu verilerin doğrulanması gerekir. Dolayısıyla bir Satıcı girişi varsa ( Category ilk CascadingDropDown öğesinin özelliği olarak ayarlandığından "Vendor"), seçili satıcının kimliği alınabilir:

If Not kv.ContainsKey("Vendor") Or Not Int32.TryParse(kv("Vendor"),VendorID) Then
 Throw New ArgumentException("Couldn't find vendor.")
 End If

Yöntemin geri kalanı oldukça düzdür, o zaman. Satıcının kimliği, ilgili satıcıyla ilişkili tüm ilgili kişileri alan bir SQL sorgusu için parametre olarak kullanılır. Yöntemi bir kez daha türünde CascadingDropDownNameValuebir dizi döndürür.

Dim conn As New SqlConnection("server=(local)\SQLEXPRESS; Integrated Security=true; Initial Catalog=AdventureWorks")
 conn.Open()
 Dim comm As New SqlCommand("SELECT Person.Contact.ContactID, FirstName, LastName FROM Person.Contact,Purchasing.VendorContact WHERE VendorID=@VendorID AND Person.Contact.ContactID=Purchasing.VendorContact.ContactID",conn)
 comm.Parameters.AddWithValue("@VendorID", VendorID)
 Dim dr As SqlDataReader = comm.ExecuteReader()
 Dim l As New List(Of CascadingDropDownNameValue)
 While (dr.Read())
 l.Add(New CascadingDropDownNameValue(dr("FirstName").ToString() & " " & dr("LastName").ToString(),dr("ContactID").ToString()))
 End While
 conn.Close()
 Return l.ToArray()
End Function

ASP.NET sayfasını yükleyin ve kısa bir süre sonra satıcı listesi 25 girişle doldurulur. Bir giriş seçin ve ikinci açılan listenin verilerle nasıl doldurulduğuna dikkat edin.

İlk liste otomatik olarak doldurulur

İlk liste otomatik olarak doldurulur (Tam boyutlu görüntüyü görüntülemek için tıklayın)

İkinci liste, ilk listedeki seçime göre doldurulur

İkinci liste, ilk listedeki seçime göre doldurulur (Tam boyutlu görüntüyü görüntülemek için tıklayın)