Avatar billede jaffafo Nybegynder
11. august 2004 - 16:32 Der er 24 kommentarer og
1 løsning

Hjælp til dropdownlister

Jeg har 3 dropdownlister.

I den første vælger jeg sprog.

Derefter henter den næste drpdwn Menupunkter efter det valgte sprog.

Nå man så vælger et menupunkt skal den trejde drpdwn hente undersider efter det valgte menupunkt.

Men det virker ikke..  Jeg kan godt vælge sprog og fylder Menupunkterlisten, men derefter er det ligesom at menupunktlisten "glemmer" indholdet.

hjælp?
Avatar billede jaffafo Nybegynder
11. august 2004 - 16:34 #1
try
            DataOleDB.opendb("CitoMedic")
                DataOleDB.DanData("SELECT * from Sprog")
                drpAdminredigersprog.items.clear
                drpAdminredigersprog.items.add(New ListItem("asdasf",nothing))
                Do while DataOleDb.Data.Read()
                    drpAdminredigersprog.items.add(New ListItem(DataOleDb.Data("Sprog"),DataOleDb.Data("sprogID")))
                loop       
            DataOleDB.closedb()
        catch ex as exception
            response.write(ex.tostring())
        end try

her fylder jeg den første dropdown (den med sprog)
Avatar billede jaffafo Nybegynder
11. august 2004 - 16:36 #2
try
            DataOleDB.opendb("CitoMedic")
                DataOleDB.DanData("SELECT * from MENU where Sprogid = " & sprog & ";")
                drpAdminredigerHovedmenupunkt.items.clear
                drpAdminredigerHovedmenupunkt.items.add("Vælg her:")
                Do while DataOleDb.Data.Read()
                    drpAdminredigerHovedmenupunkt.items.add(New ListItem(DataOleDb.Data("Navn"),DataOleDb.Data("sprogID")))
                loop       
            DataOleDB.closedb()
        catch ex as exception
            response.write(ex.tostring())
        end try

her fylder jeg den næste dropdown (den med menupunkter)
Avatar billede jaffafo Nybegynder
11. august 2004 - 16:37 #3
try
            DataOleDB.opendb("CitoMedic")
                DataOleDB.DanData("SELECT * from SIDER where Menuid = " & menu & ";")
                response.write(menu & " hah")
                drpAdminredigerUnderside.items.clear
                drpAdminredigerUnderside.items.add("Vælg her:")
                Do while DataOleDb.Data.Read()
                    drpAdminredigerUnderside.items.add(New ListItem(DataOleDb.Data("Navn"),DataOleDb.Data("MenuID")))
                loop       
            DataOleDB.closedb()
        catch ex as exception
            response.write(ex.tostring())
        end try

her fylder jeg den sidste dropdown (den med undersider)
Avatar billede snepnet Nybegynder
11. august 2004 - 17:59 #4
Hej jaffafo... kan du ikke lægge lidt kode ud der viser hvornår ovenstående bliver kaldt.
Og "glemmer indholdet" - betyder det at de simpelthen bliver tomme ?
Avatar billede guidmaster Nybegynder
11. august 2004 - 18:45 #5
Har vi styr på postback ?
Avatar billede jaffafo Nybegynder
11. august 2004 - 22:12 #6
guidmaster:  nej ikke hvis det er det som er galt
Avatar billede jaffafo Nybegynder
11. august 2004 - 22:13 #7
Public Class redigerunderside : Inherits usercontrol
   
    Dim DataOleDB as new DataBaseOleDB()
    Protected lbladminredigerUndersideID As System.Web.UI.Webcontrols.label
    Protected txtadminredigerUndersideNavn As System.Web.UI.Webcontrols.textbox
    Protected txtadminredigerUndersideTekst As System.Web.UI.Webcontrols.textbox
    Protected drpAdminredigerHovedmenupunkt As System.Web.UI.Webcontrols.dropdownlist
    Protected drpAdminredigerUnderside As System.Web.UI.Webcontrols.dropdownlist
    Protected drpAdminredigersprog As System.Web.UI.Webcontrols.dropdownlist
    Protected lblbesked As System.Web.UI.Webcontrols.label

    Public sub Page_Load(Source as Object, E as EventArgs)
        If not page.ispostback
            fyldsprogdropdown()
        end if
    end sub

    Public sub valg(Source as Object, E as EventArgs)
        session("valg") = drpAdminredigerHovedmenupunkt.selecteditem.value
        'fyldundersidedropdown()
        response.write(session("valg"))
    end sub

    Public sub valgUnderside(Source as Object, E as EventArgs)

    end sub
   
    Public sub click_gem(Source as Object, E as EventArgs)

    end sub

    Public sub sprogvalg(Source as Object, E as EventArgs)
        'response.write(drpAdminredigersprog.selecteditem.text)
        fyldmenupunktdropdown(drpAdminredigersprog.selecteditem.value)
    end sub
   
    Public sub click_annuller(Source as Object, E as EventArgs)
        response.redirect(request.path & "?sid=2")
    end sub

    function fyldundersidedropdown(menu as integer) as integer
        try
            DataOleDB.opendb("CitoMedic")
                DataOleDB.DanData("SELECT * from SIDER where Menuid = " & menu & ";")
                response.write(menu & " hah")
                drpAdminredigerUnderside.items.clear
                drpAdminredigerUnderside.items.add(New ListItem("Vælg her:",nothing))
                Do while DataOleDb.Data.Read()
                    drpAdminredigerUnderside.items.add(New ListItem(DataOleDb.Data("Navn"),DataOleDb.Data("MenuID")))
                loop       
            DataOleDB.closedb()
        catch ex as exception
            response.write(ex.tostring())
        end try
    end function

    function fyldmenupunktdropdown(sprog as integer) as integer
        try
            DataOleDB.opendb("CitoMedic")
                DataOleDB.DanData("SELECT * from MENU where Sprogid = " & sprog & ";")
                drpAdminredigerHovedmenupunkt.items.clear
                drpAdminredigerHovedmenupunkt.items.add(New ListItem("Vælg her:",nothing))
                Do while DataOleDb.Data.Read()
                    drpAdminredigerHovedmenupunkt.items.add(New ListItem(DataOleDb.Data("Navn"),DataOleDb.Data("sprogID")))
                loop       
            DataOleDB.closedb()
        catch ex as exception
            response.write(ex.tostring())
        end try
    end function

    function fyldsprogdropdown() as integer
        try
            DataOleDB.opendb("CitoMedic")
                DataOleDB.DanData("SELECT * from Sprog")
                drpAdminredigersprog.items.clear
                drpAdminredigersprog.items.add(New ListItem("Vælg her:",nothing))
                Do while DataOleDb.Data.Read()
                    drpAdminredigersprog.items.add(New ListItem(DataOleDb.Data("Sprog"),DataOleDb.Data("sprogID")))
                loop       
            DataOleDB.closedb()
        catch ex as exception
            response.write(ex.tostring())
        end try
    end function
   
end Class
Avatar billede jaffafo Nybegynder
12. august 2004 - 04:10 #8
snepnet:

hej igen ;)

Nej de bliver ikke tomme, men når jeg vælger Menupunkt (dvs i den næste dropdown) kan den ikke hente data ud. Denne data skal jeg bruge for at smide data ind i den sidste dropdown.  forstår du hvad jeg mener?
Avatar billede jaffafo Nybegynder
12. august 2004 - 20:35 #9
hej igen..  nogen der har et forslag? 

jeg har lidt travlt og kan ikke komme videre.. :(
Avatar billede snepnet Nybegynder
12. august 2004 - 21:36 #10
Hej jaffafo.... undskyld men jeg har haft lidt småtravlt.

Jeg tror du mere skal over i noget hvor du sørger for at synkronisere dine værdimængder til dine dropdowns, og så databinde når der sker en selectionchange.

hvis du har sådan en her :
// værdimængden kan på det nærmeste være hvilken som helst slags liste
string[] dd1Values = {"hej","med","dig"};

kan du databinde sådan her :
dd1.DataSource = dd1Values;
dd1.DataBind();

med dine 3 dropdowns - kunne man forestille sig noget i denne stil :
(nu bruger jeg bare nogle stringarrays til værdimængderne, men det er bare for at illustrere det).

string[] dd1Values = null, dd2Values=null, dd3Values=null;

// ved load fyldes så den første dropdown - f.eks. ved
if(!IsPostBack)
    fill_dd1();

Og så metoden :

fill_dd1()
{
  dd1Values = Getdd1Values();
  dd1.DataSource = dd1Values;
  dd1.DataBind();
}

dd1-selectionchange(object sender, System.EventArgs e)
{
  dd2Values = Getdd2Values(dd1.SelectedValue);
  dd2.DataSource = dd2Values;
  dd2.DataBind(); 
}

dd2-selectionchange(object sender, System.EventArgs e)
{
  dd3Values = Getdd3Values(dd2.SelectedValue);
  dd3.DataSource = dd3Values;
  dd3.DataBind();
}

dd3-selectionchange(object sender, System.EventArgs e)
{
  // hvad der så skal ske her :
}

Kan du se hvad jeg mener ?
Avatar billede jaffafo Nybegynder
12. august 2004 - 22:39 #11
hmm  jeg er ikke helt med her...

f.eks. den her:

try
    DataOleDB.opendb("CitoMedic")
        DataOleDB.DanData("SELECT * from MENU where Sprogid = " & sprog & ";")
        drpAdminredigerHovedmenupunkt.items.clear
        drpAdminredigerHovedmenupunkt.items.add(New ListItem("Vælg her:",nothing))
        Do while DataOleDb.Data.Read()
            drpAdminredigerHovedmenupunkt.items.add(New ListItem(DataOleDb.Data("Navn"),DataOleDb.Data("sprogID")))
        loop       
    DataOleDB.closedb()
    drpAdminredigerHovedmenupunkt.Databind()
catch ex as exception
    response.write(ex.tostring())
end try

kan du ikke lige hjælpe mig med at "omskrive" det?.. f.eks. hvordan ville du gøre?
Avatar billede snepnet Nybegynder
12. august 2004 - 23:22 #12
har du prøvet det jeg sendte dig ? ... jeg har lige kigget det igennem - det burde sådan set kunne køre (der er ingen garantier... det er bare skrevet herude).

du kan sagtens sætte datasource til en reader (jeg går ud fra at DataOleDb.Data.Read()) returnerer dig en DataReader.

Du skal så bare sørge for at sætte
dd1.DataValueField = "Navn";
dd1.DataTextField = "Sprog";

På den måde kan du sådan i store træk kopiere den kode jeg sendte dig direkte.... Jeg tror det vil være det nemmeste for dig.
Avatar billede snepnet Nybegynder
12. august 2004 - 23:26 #13
undskyld.... lige en fejl :
DataOleDb.Data.Read() returnerer dig selvfølgelig ikke en reader, men DataOleDb.Date ser ud til at være en reader, så mon ikke du kan gøre sådan her :

dd1.DataSource = DataOleDb.Data;
dd1.DataValueField = "Navn";
dd1.DataTextField = "Sprog";
dd1.DataBind();
Avatar billede jaffafo Nybegynder
13. august 2004 - 00:12 #14
System.Web.HttpException: DataBinder.Eval: 'System.Data.Common.DbDataRecord' does not contain a property with the name Navn. at System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName) at System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName, String format) at System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e) at System.Web.UI.Control.DataBind() at redigerunderside.fyldsprogdropdown() in E:\Projects\Helle\admin\sider\adminredigerunderside.ascx.vb:line 97


linje 97:

drpAdminredigersprog.DataBind()
Avatar billede jaffafo Nybegynder
13. august 2004 - 00:16 #15
Ignorer det sidste..  er løst

men et nyt problem..  der mangler det ene sprog.. :(

"Dansk" mangler..  det er det første i tabellen (har ID: 1)  koden er her:

    function fyldsprogdropdown() as integer
        try
            DataOleDB.opendb("CitoMedic")
                DataOleDB.DanData("SELECT * from Sprog")
                drpAdminredigersprog.items.clear
                drpAdminredigersprog.items.add(New ListItem("Vælg her:",nothing))
                if DataOleDb.Data.Read()
                    drpAdminredigersprog.DataSource = DataOleDb.Data
                    drpAdminredigersprog.DataValueField = "SprogID"
                    drpAdminredigersprog.DataTextField = "Langsprog"
                    drpAdminredigersprog.DataBind()
                end if
            DataOleDB.closedb()
        catch ex as exception
            response.write(ex.tostring())
        end try
    end function
Avatar billede snepnet Nybegynder
13. august 2004 - 00:48 #16
Du skal ikke kalde den her - så "suger" du den første række inden du databinder :
DataOleDb.Data.Read()
Avatar billede jaffafo Nybegynder
13. august 2004 - 00:57 #17
Hejsa  det fungere udmærket nu..  kun et lille problem mere.. 

Jeg var lavet det sådan at når jeg smider data i DB'en så erstatter den ' tegnet med &test;

Hvordan kan jeg smide denne:  .Replace("&test;","'")  på så den erstatter &test; med ' inden den fylder dropdownlisterne?

jeg skal nok smide et par 100 points på.. :)
Avatar billede jaffafo Nybegynder
13. august 2004 - 01:00 #18
og..  jeg har smidt den her ind..

drpAdminredigersprog.items.add(New ListItem("Vælg her:",nothing))

men der kommer ingen linje i toppen?
Avatar billede snepnet Nybegynder
13. august 2004 - 08:06 #19
Ja - jeg hoppede så i æsken :o) Du kan godt tilføje linier til listerne. Du skal bare sørge for at gøre det efter du databinder (hvis du gerne vil have den i toppen kan du altid lave en
drpAdminredigersprog.Items.AddAt(0, ...);

Istedet for det med trixe en ' om til &test; kan du bare sætte en ekstra ind, således at :
"en go' cigar"
bliver til
"en go'' cigar"

Så escaper du karakteren, hvilket din insert vil acceptere, og du vi få karakteren med op når du suger i basen, så det ser rigtigt ud på skærmen.
mvh
Avatar billede jaffafo Nybegynder
13. august 2004 - 13:02 #20
hej igen.. 

den kan ikke genkende "AddAt":

Compiler Error Message: BC30456: 'AddAt' is not a member of 'System.Web.UI.WebControls.ListItemCollection'.

Source Error:



Line 93:     drpAdminredigersprog.DataTextField = "Langsprog"
Line 94:     drpAdminredigersprog.DataBind()
Line 95:     drpAdminredigersprog.Items.AddAt(0, "Vælg her:")
Line 96:    
Line 97:     DataOleDB.closedb
Avatar billede snepnet Nybegynder
13. august 2004 - 13:18 #21
Sorry - Insert(...) er nok bedre :o)
Avatar billede jaffafo Nybegynder
13. august 2004 - 17:51 #22
hejsa  smid et svar

det virker super nu..  :o)
Avatar billede snepnet Nybegynder
13. august 2004 - 18:02 #23
hej jaffafo - fint det virker, vi skrives nok ved ;o)
Mvh
Avatar billede jaffafo Nybegynder
13. august 2004 - 18:11 #24
ja mon ikke.. :)

jeg takker for din hjælp..  det har hjulpet mig meget og jeg har lært meget af det.. :)
Avatar billede snepnet Nybegynder
13. august 2004 - 18:33 #25
mange tak for de pæne ord - og en venlig hilsen herfra :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester