İki DropDownList ile Ana/Ayrıntı Filtreleme (C#)Master/Detail Filtering With Two DropDownLists (C#)

Scott Mitchell tarafındanby Scott Mitchell

Örnek uygulamayı indirin veya PDF 'yi indirinDownload Sample App or Download PDF

Bu öğretici, istenen üst ve alt üst kayıtları seçmek için iki DropDownList denetimi kullanarak üçüncü bir katman eklemek üzere ana/ayrıntı ilişkisini genişletir.This tutorial expands the master/detail relationship to add a third layer, using two DropDownList controls to select the desired parent and grandparent records.

GirişIntroduction

Önceki öğreticide , Kategoriler ve seçili kategoriye ait ürünleri gösteren bir GridView ile doldurulmuş tek bir DropDownList kullanarak basit bir ana/Ayrıntılar raporunun nasıl görüntüleneceğini inceledik.In the previous tutorial we examined how to display a simple master/details report using a single DropDownList populated with the categories and a GridView showing those products that belong to the selected category. Bu rapor stili, bire çok ilişkisine sahip kayıtları görüntülerken iyi çalışır ve birden çok çoktan çoğa ilişki içeren senaryolarda kolayca çalışmak üzere genişletilebilir.This report pattern works well when displaying records that have a one-to-many relationship and can easily be extended to work for scenarios that include multiple one-to-many relationships. Örneğin, bir sipariş giriş sisteminin müşterilere, siparişlere ve sipariş satırı öğelerine karşılık gelen tabloları vardır.For example, an order entry system would have tables that correspond to customers, orders, and order line items. Belirli bir müşterinin birden çok öğeden oluşan her sipariş ile birden çok siparişi olabilir.A given customer may have multiple orders with each order consisting of multiple items. Bu tür veriler kullanıcıya iki DropDownLists ve bir GridView ile sunulabilir.Such data can be presented to the user with two DropDownLists and a GridView. İlk DropDownList, veritabanındaki her müşteri için bir liste öğesine, ikinci birinin içerikleri seçili müşteri tarafından yerleştirilmiş olan emirlerle aynı olacaktır.The first DropDownList would have a list item for each customer in the database with the second one's contents being the orders placed by the selected customer. GridView, seçili siparişten satır öğelerini listeler.A GridView would list the line items from the selected order.

Northwind veritabanı Customers, Ordersve Order Details tablolarında kurallı müşteri/sipariş/sipariş ayrıntıları bilgilerini içerirken, bu tablolar mimarimizde yakalanmaz.While the Northwind database include the canonical customer/order/order details information in its Customers, Orders, and Order Details tables, these tables aren't captured in our architecture. Nonetheless, hala iki bağımlı DropDownLists kullanmayı göstermeye devam edebilir.Nonetheless, we can still illustrate using two dependent DropDownLists. İlk DropDownList, kategorileri ve seçili kategoriye ait olan ürünleri listeler.The first DropDownList will list the categories and the second the products belonging to the selected category. Daha sonra bir DetailsView seçili ürünün ayrıntılarını listeler.A DetailsView will then list the details of the selected product.

Adım 1: kategorileri oluşturma ve doldurma DropDownListStep 1: Creating and Populating the Categories DropDownList

İlk hedefiniz, kategorileri listeleyen DropDownList 'i eklemektir.Our first goal is to add the DropDownList that lists the categories. Bu adımlar, önceki öğreticide ayrıntılı olarak incelendi, ancak tamamlanma açısından burada özetlenmiştir.These steps were examined in detail in the preceding tutorial, but are summarized here for completeness.

Filtering klasöründeki MasterDetailsDetails.aspx sayfasını açın, sayfaya bir DropDownList ekleyin, ID özelliğini Categoriesolarak ayarlayın ve ardından akıllı etiketinde veri kaynağını Yapılandır bağlantısına tıklayın.Open the MasterDetailsDetails.aspx page in the Filtering folder, add a DropDownList to the page, set its ID property to Categories, and then click the Configure Data Source link in its smart tag. Veri kaynağı Yapılandırma Sihirbazı ' ndan yeni bir veri kaynağı eklemeyi seçin.From the Data Source Configuration Wizard choose to add a new data source.

DropDownList için yeni bir veri kaynağı eklemek Add a New Data Source for the DropDownList

Şekil 1: DropDownList için yeni bir veri kaynağı ekleme (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 1: Add a New Data Source for the DropDownList (Click to view full-size image)

Yeni veri kaynağı doğal olarak bir ObjectDataSource olmalıdır.The new data source should, naturally, be an ObjectDataSource. Bu yeni ObjectDataSource CategoriesDataSource adlandırın ve CategoriesBLL nesnenin GetCategories() metodunu çağırmasını sağlayabilirsiniz.Name this new ObjectDataSource CategoriesDataSource and have it invoke the CategoriesBLL object's GetCategories() method.

Kategorilerbll sınıfını kullanmayı seçinChoose to Use the CategoriesBLL Class

Şekil 2: CategoriesBLL sınıfını kullanmayı seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 2: Choose to Use the CategoriesBLL Class (Click to view full-size image)

, GetCategories () yöntemini kullanmak için ObjectDataSource 'ı yapılandırmaConfigure the ObjectDataSource to Use the GetCategories() Method

Şekil 3: GetCategories() 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)Figure 3: Configure the ObjectDataSource to Use the GetCategories() Method (Click to view full-size image)

ObjectDataSource yapılandırıldıktan sonra hala Categories DropDownList içinde hangi veri kaynağı alanının görüntüleneceğini ve hangilerinin liste öğesi için değer olarak yapılandırılması gerektiğini belirtmemiz gerekir.After configuring the ObjectDataSource we still need to specify which data source field should be displayed in the Categories DropDownList and which one should be configured as the value for the list item. CategoryName alanını görüntüleme ve CategoryID her liste öğesi için değer olarak ayarlayın.Set the CategoryName field as the display and CategoryID as the value for each list item.

DropDownList 'In CategoryName alanını görüntülemesi ve değer olarak CategoryID 'yi kullanması Have the DropDownList Display the CategoryName Field and Use CategoryID as the Value

Şekil 4: DropDownList 'In CategoryName alanı göstermesini ve değer olarak CategoryID kullanmasınaizin vermek (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 4: Have the DropDownList Display the CategoryName Field and Use CategoryID as the Value (Click to view full-size image)

Bu noktada, Categories tablosundaki kayıtlarla doldurulmuş bir DropDownList Control (Categories) vardır.At this point we have a DropDownList control (Categories) that's populated with the records from the Categories table. Kullanıcı DropDownList 'den yeni bir kategori seçtiğinde adım 2 ' de oluşturacağımız ürün DropDownList 'sini yenilemek için bir geri gönderme işleminin gerçekleşmesini istiyoruz.When the user chooses a new category from the DropDownList we'll want a postback to occur in order to refresh the product DropDownList that we're going to create in Step 2. Bu nedenle, categories DropDownList 'in akıllı etiketindeki AutoPostBack 'ı etkinleştir seçeneğini işaretleyin.Therefore, check the Enable AutoPostBack option from the categories DropDownList's smart tag.

DropDownList için AutoPostBack 'ı etkinleştirinEnable AutoPostBack for the Categories DropDownList

Şekil 5: Categories DropDownList Için AutoPostBack 'ı etkinleştirin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 5: Enable AutoPostBack for the Categories DropDownList (Click to view full-size image)

2. Adım: seçili kategorinin ürünlerini Ikinci bir DropDownList içinde görüntülemeStep 2: Displaying the Selected Category's Products in a Second DropDownList

Categories DropDownList tamamlandıysa, sonraki adımınız seçili kategoriye ait bir ürün DropDownList 'ı görüntülemektir.With the Categories DropDownList completed, our next step is to display a DropDownList of products belonging to the selected category. Bunu gerçekleştirmek için, ProductsByCategoryadlı sayfaya başka bir DropDownList ekleyin.To accomplish this, add another DropDownList to the page named ProductsByCategory. Categories DropDownList 'de olduğu gibi, ProductsByCategoryDataSourceadlı ProductsByCategory DropDownList için yeni bir ObjectDataSource oluşturun.As with the Categories DropDownList, create a new ObjectDataSource for the ProductsByCategory DropDownList named ProductsByCategoryDataSource.

ProductsByCategory DropDownList için yeni bir veri kaynağı eklemeAdd a New Data Source for the ProductsByCategory DropDownList

Şekil 6: ProductsByCategory DropDownList için yeni bir veri kaynağı ekleme (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 6: Add a New Data Source for the ProductsByCategory DropDownList (Click to view full-size image)

ProductsByCategoryDataSource adlı yeni bir ObjectDataSource oluşturmaCreate a New ObjectDataSource Named ProductsByCategoryDataSource

Şekil 7: ProductsByCategoryDataSource adlı yeni bir ObjectDataSource oluşturun (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 7: Create a New ObjectDataSource Named ProductsByCategoryDataSource (Click to view full-size image)

ProductsByCategory DropDownList 'in yalnızca seçili kategoriye ait olan ürünleri görüntülemesi gerektiğinden, ObjectDataSource ProductsBLL nesnesinden GetProductsByCategoryID(categoryID) yöntemini çağırsın.Since the ProductsByCategory DropDownList needs to display just those products belonging to the selected category, have the ObjectDataSource invoke the GetProductsByCategoryID(categoryID) method from the ProductsBLL object.

ProductsBLL sınıfını kullanmayı seçinChoose to Use the ProductsBLL Class

Şekil 8: ProductsBLL sınıfını kullanmayı seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 8: Choose to Use the ProductsBLL Class (Click to view full-size image)

ObjectDataSource 'ı Getproductsbycategoryıd (CategoryID) yöntemini kullanacak şekilde yapılandırma Configure the ObjectDataSource to Use the GetProductsByCategoryID(categoryID) Method

Şekil 9: GetProductsByCategoryID(categoryID) 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)Figure 9: Configure the ObjectDataSource to Use the GetProductsByCategoryID(categoryID) Method (Click to view full-size image)

Sihirbazın son adımında categoryID parametresinin değerini belirtmemiz gerekir.In the final step of the wizard we need to specify the value of the categoryID parameter. Bu parametreyi Categories DropDownList öğesinden seçili öğeye atayın.Assign this parameter to the selected item from the Categories DropDownList.

kategorisinden CategoryID parametre değerini çekinPull the categoryID Parameter Value from the Categories DropDownList

Şekil 10: Categories DropDownList öğesinden categoryID parametre değerini çekme (tam boyutlu görüntüyü görüntülemek için tıklatın)Figure 10: Pull the categoryID Parameter Value from the Categories DropDownList (Click to view full-size image)

Yapılandırılmış ObjectDataSource ile, her şey, DropDownList öğelerinin görüntüleme ve değeri için hangi veri kaynağı alanlarının kullanılacağını belirtmektir.With the ObjectDataSource configured, all that remains is to specify what data source fields are used for the display and value of the DropDownList's items. ProductName alanını görüntüleyin ve ProductID alanını değer olarak kullanın.Display the ProductName field and use the ProductID field as the value.

DropDownList 'in ListItems değerinin metin ve değer özellikleri için kullanılan veri kaynağı alanlarını belirtin Specify the Data Source Fields Used for the DropDownList's ListItems' Text and Value Properties

Şekil 11: DropDownList 'in ListItem s ' Text ve Value özellikleri Için kullanılan veri kaynağı alanlarını belirtin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 11: Specify the Data Source Fields Used for the DropDownList's ListItem s' Text and Value Properties (Click to view full-size image)

ObjectDataSource ve ProductsByCategory DropDownList 'in yapılandırıldığı sayfada iki DropDownList görüntülenir: İkincisi, seçili kategoriye ait olan ürünleri listelediğinden, ilki tüm kategorileri listelecektir.With the ObjectDataSource and ProductsByCategory DropDownList configured our page will display two DropDownLists: the first will list all of the categories while the second will list those products belonging to the selected category. Kullanıcı ilk DropDownList 'den yeni bir kategori seçtiğinde, geri gönderme yapılır ve ikinci DropDownList, yeni seçilen kategoriye ait olan ürünleri gösterecek şekilde yeniden bağlanacaktır.When the user selects a new category from the first DropDownList, a postback will ensue and the second DropDownList will be rebound, showing those products that belong to the newly selected category. Şekil 12 ve 13 bir tarayıcıdan görüntülendiğinde MasterDetailsDetails.aspx eylem içinde göster.Figures 12 and 13 show MasterDetailsDetails.aspx in action when viewed through a browser.

Sayfayı Ilk ziyaret eden , Içecek kategorisi seçilirWhen First Visiting the Page, the Beverages Category is Selected

Şekil 12: sayfayı ilk ziyaret edildiğinde, Içecek kategorisi seçilir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 12: When First Visiting the Page, the Beverages Category is Selected (Click to view full-size image)

Farklı bir kategori seçmek , yeni kategorinin ürünlerini görüntülerChoosing a Different Category Displays the New Category's Products

Şekil 13: farklı bir kategori seçilmesi yeni kategorinin ürünlerini görüntüler (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 13: Choosing a Different Category Displays the New Category's Products (Click to view full-size image)

Şu anda productsByCategory DropDownList, değiştirildiğinde geri göndermeye neden olmaz .Currently the productsByCategory DropDownList, when changed, does not cause a postback. Ancak, seçilen ürünün ayrıntılarını (3. adım) göstermek için bir DetailsView eklediğimiz bir kez geri gönderme gerçekleşmemiz gerekir.However, we will want a postback to occur once we add a DetailsView to display the selected product's details (Step 3). Bu nedenle, productsByCategory DropDownList 'in akıllı etiketindeki AutoPostBack seçeneğini etkinleştir onay kutusunu işaretleyin.Therefore, check the Enable AutoPostBack checkbox from the productsByCategory DropDownList's smart tag.

productsByCategory DropDownList için AutoPostBack özelliğini etkinleştirmek Enable the AutoPostBack Feature for the productsByCategory DropDownList

Şekil 14: productsByCategory DropDownList Için AutoPostBack özelliğini etkinleştirin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 14: Enable the AutoPostBack Feature for the productsByCategory DropDownList (Click to view full-size image)

3. Adım: seçili ürünün ayrıntılarını göstermek için bir DetailsView kullanmaStep 3: Using a DetailsView to Display Details for the Selected Product

Son adım, bir DetailsView içindeki seçili ürüne ilişkin ayrıntıları görüntülemektir.The final step is to display the details for the selected product in a DetailsView. Bunu gerçekleştirmek için, sayfaya bir DetailsView ekleyin, ID özelliğini ProductDetailsolarak ayarlayın ve bunun için yeni bir ObjectDataSource oluşturun.To accomplish this, add a DetailsView to the page, set its ID property to ProductDetails, and create a new ObjectDataSource for it. Bu ObjectDataSource 'un, productID parametresi değeri Için ProductsByCategory DropDownList 'in seçili değerini kullanarak verilerini ProductsBLL sınıfının GetProductByProductID(productID) yönteminden çekmek üzere yapılandırın.Configure this ObjectDataSource to pull its data from the ProductsBLL class's GetProductByProductID(productID) method using the selected value of the ProductsByCategory DropDownList for the value of the productID parameter.

ProductsBLL sınıfını kullanmayı seçinChoose to Use the ProductsBLL Class

Şekil 15: ProductsBLL sınıfını kullanmayı seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 15: Choose to Use the ProductsBLL Class (Click to view full-size image)

GetProductByProductID (ProductID) yöntemini kullanmak için ObjectDataSource 'ı yapılandırma Configure the ObjectDataSource to Use the GetProductByProductID(productID) Method

Şekil 16: GetProductByProductID(productID) 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)Figure 16: Configure the ObjectDataSource to Use the GetProductByProductID(productID) Method (Click to view full-size image)

ProductsByCategory DropDownList öğesinden ProductID parametre değerini çekinPull the productID Parameter Value from the ProductsByCategory DropDownList

Şekil 17: ProductsByCategory DropDownList öğesinden productID parametre değerini çekme (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 17: Pull the productID Parameter Value from the ProductsByCategory DropDownList (Click to view full-size image)

DetailsView 'da kullanılabilir alanlardan herhangi birini görüntülemeyi seçebilirsiniz.You can choose to display any of the available fields in the DetailsView. ProductID, SupplierIDve CategoryID alanları kaldırmak ve kalan alanları yeniden oluşturup biçimledim.I've opted to remove the ProductID, SupplierID, and CategoryID fields and reordered and formatted the remaining fields. Ayrıca, DetailsView 'un Height ve Width özelliklerini temizlerim ve DetailsView 'un, verileri belirtilen bir boyutla sınırlandırmak yerine en iyi şekilde görüntülemesi için gereken genişliğe genişlemesine izin verir.In addition, I cleared out the DetailsView's Height and Width properties, allowing the DetailsView to expand to the width needed to best display its data rather than having it constrained to a specified size. Tam biçimlendirme aşağıda görünür:The full markup appears below:

<asp:DetailsView ID="ProductDetails" runat="server"
    AutoGenerateRows="False" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" EnableViewState="False">
    <Fields>
        <asp:BoundField DataField="ProductName"
          HeaderText="Product" SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName"
          HeaderText="Category" ReadOnly="True"
          SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName"
          HeaderText="Supplier" ReadOnly="True"
          SortExpression="SupplierName" />
        <asp:BoundField DataField="QuantityPerUnit"
          HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice"
          DataFormatString="{0:c}" HeaderText="Price"
          HtmlEncode="False" SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock"
          HeaderText="UnitsInStock" SortExpression="Units In Stock" />
        <asp:BoundField DataField="UnitsOnOrder"
          HeaderText="UnitsOnOrder" SortExpression="Units On Order" />
        <asp:BoundField DataField="ReorderLevel"
          HeaderText="ReorderLevel" SortExpression="Reorder Level" />
        <asp:CheckBoxField DataField="Discontinued"
          HeaderText="Discontinued" SortExpression="Discontinued" />
    </Fields>
</asp:DetailsView>

Bir tarayıcıda MasterDetailsDetails.aspx sayfasını denemek için bir dakikanızı ayırın.Take a moment to try out the MasterDetailsDetails.aspx page in a browser. İlk bakışta her şeyin istendiği gibi çalıştığını, ancak hafif bir sorun olduğunu fark edebilirsiniz.At first glance it may appear that everything is working as desired, but there's a subtle problem. Yeni bir kategori seçtiğinizde ProductsByCategory DropDownList, seçili kategori için bu ürünleri içerecek şekilde güncelleştirilir, ancak DetailsView ProductDetails önceki ürün bilgilerini göstermeye devam eder.When you choose a new category the ProductsByCategory DropDownList is updated to include those products for the selected category, but the ProductDetails DetailsView continued to show the previous product information. DetailsView, seçili kategori için farklı bir ürün seçerken güncelleştirilir.The DetailsView is updated when choosing a different product for the selected category. Ayrıca, yeterince kapsamlı bir test yaparsanız, sürekli olarak yeni kategoriler (Categories DropDownList 'den meşrular ' ı seçme, sonra da koşullu) ve sonra da diğer her kategori seçimi, ProductDetails DetailsView 'un yenilenmesine neden olur.Furthermore, if you test thoroughly enough, you'll find that if you continually choose new categories (such as choosing Beverages from the Categories DropDownList, then Condiments, then Confections) every other category selection causes the ProductDetails DetailsView to be refreshed.

Bu sorunu gidermek için, belirli bir örneğe bakalım.To help concretize this problem, let's look at a specific example. Sayfayı ilk kez ziyaret ettiğinizde, Içecek kategorisi seçilir ve ilgili ürünler ProductsByCategory DropDownList 'e yüklenir.When you first visit the page the Beverages category is selected and the related products are loaded in the ProductsByCategory DropDownList. Chai seçili ürün ve ayrıntılar, Şekil 18 ' de gösterildiği gibi ProductDetails DetailsView içinde görüntülenir.Chai is the selected product and its details are displayed in the ProductDetails DetailsView, as shown in Figure 18.

seçili ürünün ayrıntıları bir DetailsView içinde görüntülenirThe Selected Product's Details are Displayed in a DetailsView

Şekil 18: seçili ürünün ayrıntıları bir DetailsView 'da görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 18: The Selected Product's Details are Displayed in a DetailsView (Click to view full-size image)

Kategori seçimini Alkollardan koşullu olarak değiştirirseniz, bir geri gönderme gerçekleşir ve ProductsByCategory DropDownList, buna göre güncelleştirilir, ancak DetailsView yine de Chai 'nin ayrıntılarını görüntüler.If you change the category selection from Beverages to Condiments, a postback occurs and the ProductsByCategory DropDownList is updated accordingly, but the DetailsView still displays details for Chai.

daha önce seçilen ürünün ayrıntıları hala gösteriliyorThe Previously Selected Product's Details are Still Displayed

Şekil 19: daha önce seçilen ürünün ayrıntıları hala görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 19: The Previously Selected Product's Details are Still Displayed (Click to view full-size image)

Listeden yeni bir ürün seçmek, DetailsView 'ı beklendiği gibi yeniler.Picking a new product from the list refreshes the DetailsView as expected. Ürünü değiştirdikten sonra yeni bir kategori seçerseniz, DetailsView yeniden yenilenmez.If you pick a new category after changing the product, the DetailsView again won't refresh. Ancak, yeni bir ürün seçmek yerine yeni bir kategori seçtiyseniz, DetailsView yenilenir.However, if instead of choosing a new product you selected a new category, the DetailsView would refresh. Dünyayı burada bulabilirsiniz?What in the world is going on here?

Sorun, sayfanın yaşam döngüsünün bir zamanlama sorunudur.The problem is a timing issue in the page's lifecycle. Her sayfa istendiğinde, işleme kadar birkaç adım üzerinden ilerler.Whenever a page is requested it proceeds through a number of steps as its rendering. Bu adımlardan birinde, ObjectDataSource, SelectParameters değerlerinden herhangi birinin değişip değişmediğini görmek için denetimi denetler.In one of these steps the ObjectDataSource controls check to see if any of their SelectParameters values have changed. Bu durumda, ObjectDataSource 'a bağlanan veri Web denetimi, görüntüsünü yenilemesi gerektiğini bilir.If so, the data Web control bound to the ObjectDataSource knows that it needs to refresh its display. Örneğin, yeni bir kategori seçildiğinde ProductsByCategoryDataSource ObjectDataSource, parametre değerlerinin değiştiğini algılar ve ProductsByCategory DropDownList 'in kendisini yeniden bağladığını algılar ve seçili kategori için ürünleri elde eder.For example, when a new category is selected, the ProductsByCategoryDataSource ObjectDataSource detects that its parameter values have changed and the ProductsByCategory DropDownList rebinds itself, getting the products for the selected category.

Bu durumda ortaya çıkan sorun, sayfa yaşam döngüsünün, nesne veri kaynaklarının değiştirilen parametreleri denetlemesini, ilişkili veri Web denetimlerinin yeniden bağlamasının önce meydana gelmesinden kaynaklanır.The problem that arises in this situation is that the point in the page lifecycle that the ObjectDataSources check for changed parameters occurs before the rebinding of the associated data Web controls. Bu nedenle, yeni bir kategori seçerken ProductsByCategoryDataSource ObjectDataSource, parametre değerindeki bir değişikliği algılar.Therefore, when selecting a new category the ProductsByCategoryDataSource ObjectDataSource detects a change in its parameter's value. Ancak ProductDetails DetailsView tarafından kullanılan ObjectDataSource, ProductsByCategory DropDownList 'in henüz yeniden bağlanamadığı için bu tür bir değişikliği yapmaz.The ObjectDataSource used by the ProductDetails DetailsView, however, doesn't note any such changes because the ProductsByCategory DropDownList has yet to be rebound. Yaşam döngüsünün ilerleyen kısımlarında ProductsByCategory DropDownList, yeni seçilen kategori için ürünleri yakalayıp.Later in the lifecycle the ProductsByCategory DropDownList rebinds to its ObjectDataSource, grabbing the products for the newly selected category. ProductsByCategory DropDownList 'in değeri değiştiği sırada, ProductDetails DetailsView 'un ObjectDataSource, parametre değeri denetimini zaten tamamladınız; Bu nedenle, DetailsView önceki sonuçları görüntüler.While the ProductsByCategory DropDownList's value has changed, the ProductDetails DetailsView's ObjectDataSource has already done its parameter value check; therefore, the DetailsView displays its previous results. Bu etkileşim şekil 20 ' de gösterilmiştir.This interaction is depicted in Figure 20.

ProductDetails DetailsView 'un ObjectDataSource, değişiklikleri kontrol ettikten sonra ProductsByCategory DropDownList değeri değişikliklerini The ProductsByCategory DropDownList Value Changes After the ProductDetails DetailsView's ObjectDataSource Checks for Changes

Şekil 20: ProductsByCategory DropDownList değeri, ProductDetails DetailsView 'un ObjectDataSource değişiklikler Için denetim kurulduktan sonra değişir (tam boyutlu görüntüyü görüntülemek için tıklatın)Figure 20: The ProductsByCategory DropDownList Value Changes After the ProductDetails DetailsView's ObjectDataSource Checks for Changes (Click to view full-size image)

Bu sorunu gidermek için, ProductsByCategory DropDownList bağlandıktan sonra ProductDetails DetailsView 'ı açıkça yeniden bağlamanız gerekir.To remedy this we need to explicitly rebind the ProductDetails DetailsView after the ProductsByCategory DropDownList has been bound. Bunu, ProductsByCategory DropDownList 'in DataBound olayı tetiklendiğinde ProductDetails DetailsView 'un DataBind() yöntemini çağırarak gerçekleştirebiliriz.We can accomplish this by calling the ProductDetails DetailsView's DataBind() method when the ProductsByCategory DropDownList's DataBound event fires. Aşağıdaki olay işleyici kodunu MasterDetailsDetails.aspx sayfanın arka plan kod sınıfına ekleyin (olay işleyicisi ekleme hakkında bir tartışma için "ObjectDataSource 'un parametre değerlerini programlı olarak ayarlama" bölümüne bakın):Add the following event handler code to the MasterDetailsDetails.aspx page's code-behind class (refer to the "Programmatically Setting the ObjectDataSource's Parameter Values" for a discussion on how to add an event handler):

protected void ProductsByCategory_DataBound(object sender, EventArgs e)
{
    ProductDetails.DataBind();
}

ProductDetails DetailsView 'un DataBind() yöntemine yönelik bu açık çağrıdan sonra öğretici beklendiği gibi çalışmaktadır.After this explicit call to the ProductDetails DetailsView's DataBind() method has been added, the tutorial works as expected. Şekil 21 bu sorunun nasıl değiştiğini vurgular.Figure 21 highlights how this changed remedied our earlier problem.

ProductDetails DetailsView , ProductsByCategory DropDownList 'in veri bağlama olayı tetiklendiğindeThe ProductDetails DetailsView is Explicitly Refreshed When the ProductsByCategory DropDownList's DataBound Event Fires

Şekil 21: ProductsByCategory DropDownList 'In DataBound olayı tetiklendiğinde ProductDetails DetailsView açıkça yenilenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 21: The ProductDetails DetailsView is Explicitly Refreshed When the ProductsByCategory DropDownList's DataBound Event Fires (Click to view full-size image)

ÖzetSummary

DropDownList, ana ve ayrıntı kayıtları arasında bire çok ilişki olduğu ana/ayrıntı raporlarında ideal bir kullanıcı arabirimi öğesi görevi görür.The DropDownList serves as an ideal user interface element for master/detail reports where there is a one-to-many relationship between the master and detail records. Önceki öğreticide, Seçili Kategori tarafından görünen ürünleri filtrelemek için tek bir DropDownList 'in nasıl kullanılacağını gördük.In the preceding tutorial we saw how to use a single DropDownList to filter the products displayed by the selected category. Bu öğreticide, ürünlerin GridView 'u bir DropDownList ile değiştirdik ve seçilen ürünün ayrıntılarını göstermek için bir DetailsView kullandınız.In this tutorial we replaced the GridView of products with a DropDownList, and used a DetailsView to display the details of the selected product. Bu öğreticide ele alınan kavramlar, müşteriler, siparişler ve sipariş öğeleri gibi birden çok bire çok ilişkiyi kapsayan veri modellerine kolayca genişletilebilir.The concepts discussed in this tutorial can easily be extended to data models involving multiple one-to-many relationships, such as customers, orders, and order items. Genel olarak, bire çok ilişkilerde "bir" varlıkların her biri için her zaman bir DropDownList ekleyebilirsiniz.In general, you can always add a DropDownList for each of the "one" entities in the one-to-many relationships.

Programlamanın kutlu olsun!Happy Programming!

Yazar hakkındaAbout the Author

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 Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.comadresinden erişilebilir .He can be reached at mitchell@4GuysFromRolla.com. ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.or via his blog, which can be found at http://ScottOnWriting.NET.

Özel olarak teşekkürlerSpecial Thanks To

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Bu öğretici için müşteri adayı gözden geçireni Giesenow.Lead reviewer for this tutorial was Hilton Giesenow. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .If so, drop me a line at mitchell@4GuysFromRolla.com.