[vb.net] Caching cached ook selected items in dropdown

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

  • jp
  • Registratie: November 2000
  • Laatst online: 03-07 15:30
Ik wil de performance van mijn webapplicatie verhogen, dus ik dacht bepaalde waardes uit de database te cachen.

Het idee is als volgt: Een medewerker kan zowel een assistent als een chef hebben en beide waardes komen uit dezelfde tabel. (Empoyee). Dus dacht ik om die lijst te cachen.

Nu cached hij echter ook, om voor mij onduidelijke redenen de huidige selected value.

Visual Basic .NET:
1
2
3
4
5
iactShared.DropDown.GetEmployeeList(Me.drpBoss, True)
iactShared.DropDown.GetEmployeeList(Me.drpAssistent, True)
' ...
Me.drpAssistent.SelectedValue = insEmployee._AssistentId
Me.drpBoss.SelectedValue = insEmployee._SuperiorId


En de functie die het geheel vult:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Public Shared Sub GetEmployeeList(ByRef DropDown As System.Web.UI.WebControls.DropDownList, Optional ByVal InsertEmpty As Boolean = False, Optional ByVal DepartmentId As Integer = 0, Optional ByVal Defaulttext As String = "")
   IACTLibrary.TraceWrite.WithoutLevel("iactshared.DropDown.GetEmployeeList", "Begin")
   IACTLibrary.TraceWrite.WithoutLevel("iactshared.DropDown.GetEmployeeList:DepartmentId", DepartmentId)

   Dim drpItems As ArrayList
   Dim strCacheName As String = "GetEmployeeList" & "|" & DepartmentId
   Dim intCacheDuration As Integer = Settings.Caching.Dropdown.CacheDuration

   DropDown.Items.Clear()
   If InsertEmpty Then iactShared.DropDown.InsertEmpty(DropDown, Defaulttext)

      drpItems = HttpContext.Current.Cache(strCacheName)
         If drpItems Is Nothing Or True Then 'cache temporary turned off
            ' items not found in cache
            IACTLibrary.TraceWarn.WithoutLevel("GetEmployeeList", "Not found in cache, retrieving from database")

            drpItems = New ArrayList ' place to store the items in

            Dim EmployeeAdapter As New dsWylanceTableAdapters.dsEmployeeTableAdapter
            Dim EmployeeData As dsWylance.dsEmployeeDataTable
            Dim strFullname As String = ""

            If Not DepartmentId > 0 Then
               IACTLibrary.TraceWrite.WithoutLevel("iactshared.DropDown.GetEmployeeList:DepartmentId=0", "Department is 0 or < 0, getting all employees")
               EmployeeData = EmployeeAdapter.GetEmployeeList()
            Else
               IACTLibrary.TraceWrite.WithoutLevel("iactshared.DropDown.GetEmployeeList:DepartmentId>0", "Getting all employees for this company")
               EmployeeData = EmployeeAdapter.GetEmployeeByDepartment(DepartmentId)
            End If

            IACTLibrary.TraceWrite.WithoutLevel("iactshared.DropDown.GetEmployeeList:EmployeeData", EmployeeData.Count)

            For Each row As dsWylance.dsEmployeeRow In EmployeeData
               strFullname = row.Surname & ", " & row.Firstname
               Dim s As New ListItem(strFullname, row.Id)
               DropDown.Items.Add(s)
               drpItems.Add(s)
            Next

            HttpContext.Current.Cache.Insert(strCacheName, drpItems, Nothing, DateTime.Now.AddSeconds(intCacheDuration), System.Web.Caching.Cache.NoSlidingExpiration)
         Else
            ' item was found in cache
            IACTLibrary.TraceWrite.WithoutLevel("GetEmployeeList", "Retrieving values from cache")
            For Each s As ListItem In drpItems
               DropDown.Items.Add(s)
            Next
         End If

         IACTLibrary.TraceWrite.WithoutLevel("iactshared.DropDown.GetEmployeeList", "End")
End Sub


Volgens mij doe ik het cachen "by the book" , maar hij cached dus ook de selected value van de dropdown... en ik niet dnap....

[ Voor 72% gewijzigd door jp op 05-12-2006 14:16 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:39

gorgi_19

Kruimeltjes zijn weer op :9

Waarom gebruik je geen outputcache?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • jp
  • Registratie: November 2000
  • Laatst online: 03-07 15:30
Bij een output cache bind ik (voor zover ik weer) het cachen aan 1 specifieke control (dropdownbox). En ik wil dat hij de gecachte waardes ook kan delen tussen twee controls.

De hele output wil ik niet cachen, want we hebben het over editpagina's, en die waardes wil ik dus niet cachen...

  • jp
  • Registratie: November 2000
  • Laatst online: 03-07 15:30
***schop***

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Je cacht de ListItems. Eén van de properties van een ListItem is Selected. Je cacht dat gewoon mee. Daarom kun je beter de onderliggende datatable cachen.

Daarnaast, waarom gebruik je eigenlijk geen databind?

  • jp
  • Registratie: November 2000
  • Laatst online: 03-07 15:30
Ik cache de Listitems, maar voorzocer ik weet cache ik de listitems VOORDAT er wordt ingesteld dat een van die listitems selected zou zijn.

Geen databind... goeie vraag, maar een tikkie laat om nu nog aan te passen, tenzij het enorm veel beter is/zou zijn :$

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

jp schreef op donderdag 07 december 2006 @ 13:29:
Ik cache de Listitems, maar voorzocer ik weet cache ik de listitems VOORDAT er wordt ingesteld dat een van die listitems selected zou zijn.
Klopt. Maar je DropDown list en je cache verwijzen naar dezelfde objecten. Dus als je een item in je dropdownlist selecteert, is dat dezelfde item die in de cache staat.
Geen databind... goeie vraag, maar een tikkie laat om nu nog aan te passen, tenzij het enorm veel beter is/zou zijn :$
En daarom is het dus beter om een databind te gebruiken. Je slaat dan je data op de de cache, niet de listitems die allemaal extra zaken opslaan.

In beide gevallen moet je trouwens voorzichtig zijn om dezelfde listitems of dataset voor meerdere lijsten te gebruiken. Ook in je huidige geval zul je lijkt me tegen het probleem aanlopen dat de twee lijsten altijd dezelfde selected item hebben. (hebben ze altijde beide de waarde van SuperiorID?).

De oplossing is om een dataset te maken van je gegevens en voor beide lijsten een DataView hierop te definiëren, en die dataview aan je dropdownlist te binden.

Succes :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

ALs je ze in je cache opslaat maakt hij er geen kopie van lijkt me. Je hebt de objecten dus gewoon twee referenties naar hetzelfde object. Als je dan vervolgens een object selected maakt dan zal ook de versie in de cache selected worden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1