Avatar billede simm Nybegynder
11. februar 2008 - 08:20 Der er 31 kommentarer og
1 løsning

[ASP 2.0 Ajax] Listbox selectedindex altid på 0 ved postback

Hej jeg bruger MS' AJAX Extension 1.0 på et website - på det website har jeg en listbox-control. Hvis jeg vælger det fjerde index i listbox'en, så kan jeg være sikker på at den ved postback konsekvent ryger tilbage på index 0. Hvordan kan det være? Hvordan fastholder jeg det valgte?
Avatar billede jokkejensen Novice
11. februar 2008 - 08:26 #1
Det er nok fordi du databinder til den dropdown liste i page_load...

Du skal lige wrappe din databind ind i en if(!Page.IsPostBack)

Så vil den ikke 0 stille sig ved hvert request.

/JJ
Avatar billede simm Nybegynder
11. februar 2008 - 08:38 #2
Hej Jokke,

Hmm.. nej det har jeg allerede gjort :)
Avatar billede jokkejensen Novice
11. februar 2008 - 09:44 #3
Hey,

Du skriver "hvis jeg vælger det 4." er det konsekvent kun index 4 der returnere 0 ?

/JJ
Avatar billede simm Nybegynder
11. februar 2008 - 10:08 #4
Nej det gælder også andre indexes. Så det har nok noget at gøre med postback'en .. det mærkelige er bare, at jeg har nogle dropdown-kontroller, som virker fint.
Avatar billede jokkejensen Novice
11. februar 2008 - 10:14 #5
Kan du smide lidt af det kode der generere databinder, og din event..

/JJ
Avatar billede jokkejensen Novice
11. februar 2008 - 10:14 #6
-generere
Avatar billede simm Nybegynder
11. februar 2008 - 10:19 #7
protected void Page_Load(Object Src, EventArgs E)
        {
            if (!Page.IsPostBack)
            {
                BindTilKontrol();
                FyldDessinDropdown();
            }
        }

        protected void FyldDessinDropdown()
        {
            SqlConnection sqlConnect = new SqlConnection(umbraco.GlobalSettings.DbDSN);
            SqlCommand myCommand = new SqlCommand("Select dessinnr, prisgruppe from excel_dessinnumre order by dessinnr", sqlConnect);

            try
            {
                sqlConnect.Open();
                SqlDataReader sqldreader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
               
                while (sqldreader.Read())
                {
                    ListItem lbListitem = new ListItem((string)sqldreader["dessinnr"], (string)sqldreader["prisgruppe"]);
                    lbDessinnr.Items.Add(lbListitem);
                }
            }
            catch (SqlException)
            {
                Literal1.Text = "Der opstod en uventet databasefejl";
            }
            finally
            {
                sqlConnect.Close();
            }
        }
Avatar billede simm Nybegynder
11. februar 2008 - 10:21 #8
Den skulle være lige ud af landevejen.. :)
Avatar billede jokkejensen Novice
11. februar 2008 - 10:26 #9
Har du også koden der afvikles, hvor du får 0 fra lbDessinnr ?

Mener forresten godt du kan benytte en dataReader som datasource, så i stedet for:

    while (sqldreader.Read())
                {
                    ListItem lbListitem = new ListItem((string)sqldreader["dessinnr"], (string)sqldreader["prisgruppe"]);
                    lbDessinnr.Items.Add(lbListitem);
                }

burde du kunne skrive noget ala:

lbDessinnr.DataSource = sqldreader;
lbDessinnr.DataValueField = "dessinnr";
lbDessinnr.DataTextField = "dessinnr";
lbDessinnr.DataBind();
Avatar billede jokkejensen Novice
11. februar 2008 - 10:27 #10
try
            {
                sqlConnect.Open();
                SqlDataReader sqldreader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
             
                while (sqldreader.Read())
                {
                    ListItem lbListitem = new ListItem((string)sqldreader["dessinnr"], (string)sqldreader["prisgruppe"]);
                    lbDessinnr.Items.Add(lbListitem);
                }

// Prøv lige at databinde her:
lbDessinnr.DataBind();
            }
Avatar billede jokkejensen Novice
11. februar 2008 - 10:31 #11
http://support.microsoft.com/kb/307860 <-- tryk på datareader class i summary :)
Avatar billede simm Nybegynder
11. februar 2008 - 10:48 #12
Koden der afvikles? Der afvikles ikke rigtig noget, men jeg overvejer om man vha. OnSelectedIndexChanged eventen kunne gemme index'et?

Jo man kan sagtens binde datareadere direkte til datasovsen. Måske jeg skulle gøre det i stedet for at cast'e :)

Der sker ikke noget ved at databinde til sidst.
Avatar billede simm Nybegynder
11. februar 2008 - 10:53 #13
Nice, tak for linket.. altid godt med lidt guldkorn :D
Man burde egentlig oprette en liste med good practices... Jeg savner i hvertfald sommetider en oversigt over, hvordan man bedst kommer ud af en given kodesituation. Det gælder vel om at spare ressourcer hvor man nu kan :)
Avatar billede jokkejensen Novice
11. februar 2008 - 11:01 #14
Prøv lige at tildele den en event.

<asp:dropdownlist runat="server" id="lbDessinnr" onselectedindexchange="writeValue" />

protected void writeValue(object o, EventArgs e)
{
Response.Write("Drop down list fired:" + lbDessinnr.SelectedValue);
}
Avatar billede simm Nybegynder
11. februar 2008 - 11:08 #15
Den fyrer altid index 0 afsted :/
Avatar billede jokkejensen Novice
11. februar 2008 - 11:17 #16
Prøv lige :

protected void Page_Load(Object Src, EventArgs E)
        {
            if (!Page.IsPostBack)
            {
                BindTilKontrol();
                FyldDessinDropdown();
Page.DataBind();
            }


        }
Avatar billede simm Nybegynder
11. februar 2008 - 11:20 #17
Så får jeg en

Invalid attempt to call FieldCount when reader is closed.

Exception Details: System.InvalidOperationException: Invalid attempt to call FieldCount when reader is closed.
Avatar billede jokkejensen Novice
11. februar 2008 - 11:25 #18
Ja, okay fair nok.

Page.Databind binder alle kontrollerne på siden til sine data, men din datareader lukker når den har læst til enden...

Virkede det før du installerede ajax.net ?

/JJ
Avatar billede simm Nybegynder
11. februar 2008 - 11:31 #19
Det ved jeg faktisk ikke, for det har hele tiden været meningen at jeg skulle bruge AJAX.. men jeg kan da lige prøve uden :)
Avatar billede simm Nybegynder
11. februar 2008 - 11:36 #20
Nej det er det samme. Jeg har også prøvet at slå autopostback fra på kontrollen. Mærkeligt.
Avatar billede jokkejensen Novice
11. februar 2008 - 12:56 #21
Virker det her hos dig :

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
    <script language="C#" runat="server">
        protected void Page_Load(Object o, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                DataBindDDL();
                ddl.AutoPostBack = true;   
            }

            ddl.SelectedIndexChanged += new System.EventHandler(writeValue);
        }

        protected void DataBindDDL()
        {
            for (int i = 0; i < 5; i++)
            {
                ListItem Li = new ListItem(i.ToString(), i.ToString());
                ddl.Items.Add(Li);
            }

            ddl.DataBind();
        }

        public void writeValue(object o, EventArgs e)
        {
            Response.Write(s);
        }
       


        protected string s
        {
            get { return ddl.SelectedIndex.ToString();}
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList runat="server" ID="ddl"></asp:DropDownList>
    </div>
    </form>
</body>
</html>
Avatar billede simm Nybegynder
11. februar 2008 - 13:16 #22
jeps det virker :)
Avatar billede jokkejensen Novice
11. februar 2008 - 13:29 #23
Er du i stand til selv at se forskellen ?

Ellers skal jeg bruge dit kode, men mener at du gennem ovenstående eksempel burde kunne merge det med dit :)

/JJ
Avatar billede simm Nybegynder
11. februar 2008 - 14:42 #24
Jeps jeg kan godt se forskellen, men jeg ender med samme resultat som før.

Jeg kan dog se nu at index'et af en eller anden årsag er helt f**** up... Hvis jeg klikker på en ListItem i toppen, viser SelectedIndex 0 .. men klikker jeg i bunden viser den 11?!
Avatar billede simm Nybegynder
11. februar 2008 - 14:46 #25
Nu har jeg sat flg kode ind så jeg selv styrer index'et:
                int i=0;
                while (sqldreader.Read())
                {
                   
                    ListItem Li = new ListItem(sqldreader["dessinnr"].ToString(), sqldreader["prisgruppe"].ToString());
                    lbDessinnr.Items.Insert(i,Li);
                    i++;
                }
                lbDessinnr.DataBind();
Avatar billede simm Nybegynder
11. februar 2008 - 14:46 #26
.. det hjalp heller ikke meget .. wauh.. neverending story her.. haha
Avatar billede jokkejensen Novice
11. februar 2008 - 14:56 #27
Index kan du "ikke" selv styre.... det starter altid med 0 og kører opaf..

Når du opretter et ListItem er syntaxen ListItem = new ListItem([value], [text]);

Du skal derfor bare trække SelectedIndex.Value

/JJ
Avatar billede simm Nybegynder
11. februar 2008 - 15:19 #28
I know, blev bare lige småforvirret .. brænder snart sammen her *GG*
Avatar billede simm Nybegynder
11. februar 2008 - 16:35 #29
Yes! Problem solved..

Brugte den her igen
lbDessinnr.DataSource = sqldreader;
lbDessinnr.DataValueField = "dessinnr";
lbDessinnr.DataTextField = "dessinnr";
lbDessinnr.DataBind();

Men sætter jeg DataValueField til "prisgrupper" (prisgrupperne er egentlig bare en int, fra 1-4, så sker der skumle ting og sager?

Jokke, sender du lige et svar?
Tak for hjælpen :)
Avatar billede jokkejensen Novice
11. februar 2008 - 16:42 #30
glad for det lykkedes :)

Du skal også skrive "prisgruppe" og ikke "prisgrupper".. (jfør:sqldreader["prisgruppe"].ToString())

/JJ
Avatar billede jokkejensen Novice
11. februar 2008 - 16:42 #31
svar
Avatar billede simm Nybegynder
11. februar 2008 - 16:50 #32
hehe, det var egentlig også det jeg mente :p Den er godt nok ikke glad for alt andet end unikke værdier.. hmm...
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