Avatar billede jps6kb Novice
12. maj 2007 - 19:22 Der er 54 kommentarer og
2 løsninger

DropDownList autopostback altid 0

Hej,

En klassiker..
Jeg har en dropdownlist (ddl) som jeg har givet autopostback = true.

Mit problem er, at når jeg prøver at få fat i SelectedItem, så er den null.

Når den har postback'et gemmer den altså ikke værdien.
Hvor'n er det nu man gør. Det er jo så simpelt, og så pinligt. *G*
Avatar billede neoman Novice
12. maj 2007 - 19:34 #1
sidder den måske inde i en container som har .enableviewstate=false ? eller binder du den til noget på hver postback ?
Avatar billede jps6kb Novice
12. maj 2007 - 19:38 #2
Det ser ud til at min ddl_SelectedIndexChanged() ikke bliver kaldt... ??

B b;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            b = null;
            DataBindDdl();
        }
        else
        {
            lblBTitel.Text = b.Titel;
        }
    }

    private void DataBindDdl()
    {
        ArrayList bs = SQLData.HentBs("test");
        foreach (B b in bs)
        {
            ddl.Items.Add(new ListItem(b.Titel, b.Id.ToString()));
        }
        ddl.SelectedIndex = 0;
    }

    protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
    {
        b = SQLData.HentB(Convert.ToInt32(ddl.SelectedItem.Value));
    }


Det er her:
lblBTitel.Text = b.Titel;
Den fejler, i min Page_Load.

b er ikke instansiteret påstår den.
Avatar billede jps6kb Novice
12. maj 2007 - 19:39 #3
Den er ikke inde i noget som helst faktisk.. skulle jeg ikke mene da.
Avatar billede jps6kb Novice
12. maj 2007 - 19:40 #4
Eller, en ContentPlaceHolder, men den har også viewstate = true.
Avatar billede neoman Novice
12. maj 2007 - 19:45 #5
nårh ja - i page life cycle kører page load før alle event handlers, og dvs når du loader siden så findes b ikke, fordi systemet husker jo intet fra den forrige gang - den får først tilskrevet en værdi når SelecetdIndexChanged har kørt (efter at PageLoad har kørt)

Hvis du flytter lblBTitel.Text = b.Titel; ned til sidens PreRender event (som kører efter alle handlerne har kørt), eller f.eks. tilføjer den til din ddl_SelectedIndexChanged handler, så burde det køre.
Avatar billede jps6kb Novice
12. maj 2007 - 19:51 #6
ddl_SelectedIndexChanged bliver jo aldrig kaldt.. det er det der er lidt mærkeligt.
Jeg har prøvet at lave en filewriter, så jeg kunne se hvad den lavede.. og det der stod i ddl_SelectedIndexChanged kom aldrig med i filen.. alt det andet gjorde..

Gi'r det mening? Jeg synes det jo ikke :)
Avatar billede neoman Novice
12. maj 2007 - 19:54 #7
hvis du kigger i din aspx side, på <asp:dropdownlist ... står SelectedIndexChanged der ?
Avatar billede jps6kb Novice
12. maj 2007 - 19:56 #8
Ja, det gør den. Den står som den skal. :) Jeg har både selv skrevet den, og ladet VS 2005 generere den.
Avatar billede neoman Novice
12. maj 2007 - 20:00 #9
The mystery deepens ..er du sikker den ik bliver kaldt ? du kunne sætte et break point inde i den og se om du kommer forbi eller ej - du ved - den brune klat :-) bare klik på den GRÅ vertikale bjælke alleryderst udfor  b = SQLData.HentB(Convert.ToInt32(ddl.SelectedItem.Value));
Avatar billede jps6kb Novice
12. maj 2007 - 20:04 #10
Der skete bare det samme igen.
"Object reference not set to an instance of an object. " på samme linie som før.. så den bliver ikke kaldt.

<asp:DropDownList ID="" runat="server" Width="232px" AutoPostBack="True" OnSelectedIndexChanged="ddl_SelectedIndexChanged">

Den skulle jo stå rigtigt efter min overbevisning.
Avatar billede neoman Novice
12. maj 2007 - 20:09 #11
hrmpf ..jeg er ude på et overdrev her, fordi jeg bruegr VB normalt - hos mig er en tilsvarende handler sådan :
    Protected Sub ddlSelectProfile_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlSelectProfile.SelectedIndexChanged

med sådan en "handles" tingest ... og jeg har
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="AssignTasks.aspx.vb" Inherits="Admin_AssignTasks" MasterPageFile="~/Roster.master"  Title="Untitled page" %>

hvor AutoEventWireup="false" er den vigtige ting - hvordan ser det ud hos dig ?

Og i øvrigt - uanset om den bliver kaldt eller ej så burde du få den fejl du får, jvf.  indlægget 19:45:55

Og hvis du har sat et break point og der intet skete , ja - så bliver den ikke kaldt.
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 20:11 #12
du skal sætte et ID.
AutoEventWireup skal være true.
Ellers skal du binde events manuelt.
Avatar billede jps6kb Novice
12. maj 2007 - 20:11 #13
Den var sat til true ved mig.. jeg har sat den til false, og nu kommer der ikke data i min ddl.. såeh.. jeg tror det er forkert *G*
Avatar billede neoman Novice
12. maj 2007 - 20:12 #14
hehe - og naturligvis bliv er den ikke kaldt, fordi din kode har nået at fejle inden du når til den ! :) prøv nu at flytte lblBTitel.Text = b.Titel; til
  protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
    {
        b = SQLData.HentB(Convert.ToInt32(ddl.SelectedItem.Value));
lblBTitel.Text = b.Titel;
    }
Avatar billede jps6kb Novice
12. maj 2007 - 20:14 #15
Jeg har givet den et ID.. og sat autoeventwireup til true igen, og nu er det som da vi startede igen. ;)
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 20:15 #16
paste lige koden til aspx og codebehind.
Avatar billede jps6kb Novice
12. maj 2007 - 20:16 #17
Det hele??
Avatar billede neoman Novice
12. maj 2007 - 20:17 #18
prøv lige smække det ind i din handler - din b er jo ikke defieneret til noget FØR den ahr været forbi handleren
Avatar billede jps6kb Novice
12. maj 2007 - 20:18 #19
Smække hvad ind i hvilken handler.. ? Er lige tabt to sekunder. Hehe.
Avatar billede neoman Novice
12. maj 2007 - 20:20 #20
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
    {
        b = SQLData.HentB(Convert.ToInt32(ddl.SelectedItem.Value));
lblBTitel.Text = b.Titel;
    }

og fjern den lblB... tingest fra din pageload - b er ikke defineret FØR ddlSelectedIndexCHanged har kørt - det er derfor koden fejler jo
Avatar billede jps6kb Novice
12. maj 2007 - 20:26 #21
Ja, så er der ingen exception mere..
Jeg har en break i onindexchanged og ingenting..

ddl husker ikke hvilken en jeg valgte og går i nul når siden er loadet igen.

Virkelig mærkeligt.
Avatar billede neoman Novice
12. maj 2007 - 20:29 #22
hmm er du sikker - på din break har den ikke kørt den endnu så værdierne kommer først frem på den næste statement .. eller , hvis du bare trykker på den grønne "continue" så burde det da fungere
Avatar billede jps6kb Novice
12. maj 2007 - 20:31 #23
Jamen, der sker intet med den event.. jeg har lige prøvet at sætte min filewriter ind i page_load og i onindexchanged.

På page_load skriver den "Page_Load" .. men der står ikke "OnIndexChanged" i min log... så den bliver bare ikke kaldt.
Avatar billede neoman Novice
12. maj 2007 - 20:33 #24
hvis den stoppede på din break point så VAR du inde i den, uanset hvad din filewriter siger...
Avatar billede jps6kb Novice
12. maj 2007 - 20:34 #25
Det gør den ikke.. der sker ikke noget.
Avatar billede neoman Novice
12. maj 2007 - 20:35 #26
og hvis den ikke stoppede så var du der ikke .. så hvad skete der egentligt ? fik du sat en break som foreslået og stoppede eksekveringen der eller ej ?
Avatar billede neoman Novice
12. maj 2007 - 20:36 #27
ok - forfra - har du en brun klat udfor  b = SQLData.HentB(Convert.ToInt32(ddl.SelectedItem.Value)); ?
Avatar billede jps6kb Novice
12. maj 2007 - 20:37 #28
Jaeh.. eller.. sådan en rød cirkel. :)
Avatar billede neoman Novice
12. maj 2007 - 20:39 #29
hmmm rød cirkel ??? .. og du har debug=true i din web.config eller på siden i  ??
Avatar billede neoman Novice
12. maj 2007 - 20:39 #30
fordi det SKAL være en brun klat :)
Avatar billede jps6kb Novice
12. maj 2007 - 20:40 #31
<compilation debug="true" /> i web.config

Når jeg klikker på den grå streg i siden kommer der en mørkerød cirkel og linien selv får mørkerød baggrund.
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 20:40 #32
prøv at smide hele din kilde kode.
Avatar billede jps6kb Novice
12. maj 2007 - 20:41 #33
Det er den.. det er den samme der kommer frem hvis jeg højreklikker og vælger "Insert Breakpoint"
Avatar billede neoman Novice
12. maj 2007 - 20:41 #34
yeah .. det er dybt mystisk - så gør som dr_chaos siger
Avatar billede neoman Novice
12. maj 2007 - 20:43 #35
hehe brun ( i mit sprog) er vist mørkerød i dit, tror jeg
Avatar billede jps6kb Novice
12. maj 2007 - 20:43 #36
Okay.. i får lige den rigtige.. den første var en test.. så navnene er lidt anderledes.


default.aspx

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Battle_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<center><table class="tblContent" cellpadding="0" cellspacing="0">
        <tr>
            <td class="tdContentHeaderCbg1" style="height: 113px">
                <img src="../Grafik/Titles/t_battle.jpg" alt=""/></td>
        </tr>
        <tr>
            <td class="tdContent" style="text-align: left">
                <br />
                <strong>
                Mine battles:<br />
                </strong>
                <asp:DropDownList ID="ddlBattles" runat="server" Width="232px" AutoPostBack="True" OnSelectedIndexChanged="ddlBattles_SelectedIndexChanged">
                </asp:DropDownList><br />
                <br />
                <br />
                <asp:Label ID="lblBattleTitel" runat="server" Font-Bold="True" Font-Size="14px"></asp:Label><br />
                <br />
                <asp:TextBox ID="txtInput" runat="server" Height="81px" TextMode="MultiLine" Width="394px"></asp:TextBox><br />
                <asp:Button ID="Button1" runat="server" Text="OK" Width="80px" /><br />
                <br />
                <br />
                <asp:FormView ID="FormView1" runat="server" DataKeyNames="id" DataSourceID="SqlDataSource1"
                    Width="594px" AllowPaging="True">
                    <EditItemTemplate>
                        id:
                        <asp:Label ID="idLabel1" runat="server" Text='<%# Eval("id") %>'></asp:Label><br />
                        bruger:
                        <asp:TextBox ID="brugerTextBox" runat="server" Text='<%# Bind("bruger") %>'>
                        </asp:TextBox><br />
                        dato:
                        <asp:TextBox ID="datoTextBox" runat="server" Text='<%# Bind("dato") %>'>
                        </asp:TextBox><br />
                        tekst:
                        <asp:TextBox ID="tekstTextBox" runat="server" Text='<%# Bind("tekst") %>'>
                        </asp:TextBox><br />
                        <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
                            Text="Update">
                        </asp:LinkButton>
                        <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
                            Text="Cancel">
                        </asp:LinkButton>
                    </EditItemTemplate>
                    <InsertItemTemplate>
                        bruger:
                        <asp:TextBox ID="brugerTextBox" runat="server" Text='<%# Bind("bruger") %>'>
                        </asp:TextBox><br />
                        dato:
                        <asp:TextBox ID="datoTextBox" runat="server" Text='<%# Bind("dato") %>'>
                        </asp:TextBox><br />
                        tekst:
                        <asp:TextBox ID="tekstTextBox" runat="server" Text='<%# Bind("tekst") %>'>
                        </asp:TextBox><br />
                        <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert"
                            Text="Insert">
                        </asp:LinkButton>
                        <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
                            Text="Cancel">
                        </asp:LinkButton>
                    </InsertItemTemplate>
                    <ItemTemplate>
                        <table style="width: 100%;" cellpadding="0" cellspacing="0">
                            <tr>
                                <td style="width: 50%;" class="tdIndlaeg">
                                    <asp:Label ID="brugerLabel" runat="server" Text='<%# Bind("bruger") %>'></asp:Label>
                                </td>
                                <td style="width: 50%; text-align: right;" class="tdIndlaeg">
                                    <asp:Label ID="datoLabel" runat="server" Text='<%# Bind("dato") %>'></asp:Label>
                                </td>
                            </tr>
                            <tr>
                                <td colspan="2" style="padding: 14px;">
                                    <asp:Label ID="tekstLabel" runat="server" Text='<%# Bind("tekst") %>'></asp:Label>
                                </td>
                            </tr>
                        </table>
                    </ItemTemplate>
                    <PagerSettings Mode="NumericFirstLast" />
                </asp:FormView>
                <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                    SelectCommand="SELECT [id], [bruger], [dato], [tekst] FROM [BattleIndlaeg] WHERE (([aktiv] = @aktiv) AND ([battle] = @battle)) ORDER BY id DESC">
                    <SelectParameters>
                        <asp:Parameter DefaultValue="1" Name="aktiv" Type="Int32" />
                        <asp:ControlParameter ControlID="ddlBattles" Name="battle" PropertyName="SelectedValue"
                            Type="Int32" />
                    </SelectParameters>
                </asp:SqlDataSource>
            </td>
        </tr>
        <tr>
            <td class="tdContentFooter">
            </td>
        </tr>
    </table></center>
</asp:Content>


----------------------------------------

default.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Battle_Default : System.Web.UI.Page
{
    Battle b;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            b = null;
            DataBindDdlBattles();
        }
        else
        {
            //b = SQLData.HentBattle(Convert.ToInt32(ddlBattles.SelectedItem.Value));
           
        }
    }

    private void DataBindDdlBattles()
    {
        ArrayList battles = SQLData.HentBattles("kim");
        foreach (Battle b in battles)
        {
            ddlBattles.Items.Add(new ListItem(b.Titel, b.Id.ToString()));
        }
        ddlBattles.SelectedIndex = 0;
        ddlBattles.DataBind();
    }

    protected void ddlBattles_SelectedIndexChanged(object sender, EventArgs e)
    {
        b = SQLData.HentBattle(Convert.ToInt32(ddlBattles.SelectedItem.Value));
        lblBattleTitel.Text = b.Titel;
    }
}
Avatar billede neoman Novice
12. maj 2007 - 20:51 #37
udover at ddlBattles.SelectedItem.Value er det samme som ddlBattles.SelectedValue så kan jeg ellers ikke lige se noget som jeg ville have gjort anderledes...
Avatar billede jps6kb Novice
12. maj 2007 - 20:54 #38
Jeg havde også SelectedValue først.. det var mere for at prøve det, fordi det var i et MSDN eksempel jeg kiggede i.
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 21:02 #39
prøv lige med:
  protected void ddlBattles_SelectedIndexChanged(object sender, EventArgs e)
    {
      Response.Write "ffffffffffffffff";
        b = SQLData.HentBattle(Convert.ToInt32(ddlBattles.SelectedItem.Value));
        lblBattleTitel.Text = b.Titel;
    }
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 21:04 #40
Så kan det være at du kan se at den kommer derind.
Avatar billede jps6kb Novice
12. maj 2007 - 21:06 #41
Der kommer intet.. det var jo det samme jeg prøvede med min filewriter.. :)
Avatar billede neoman Novice
12. maj 2007 - 21:14 #42
hmm - jeg kan ikke være med mere for skal ud nu - men jeg håber det lykkes for dig, ellers klør vi på i morgen
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 21:23 #43
Kommer du ind i :
page_load ?
Avatar billede jps6kb Novice
12. maj 2007 - 22:06 #44
Ja, det gør jeg.. og der kan jeg også godt få den til at opføre sig som den skal.. burde, med at binde ved !IsPostBack... men den ryger stadig tilbage til index 0 hver gang.
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 22:16 #45
ok den kode du pastede er det den du bruger ?

prøv lige at tilføje:
enableviewstate="true" på din aspx side i:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Battle_Default" Title="Untitled Page" %>
Avatar billede jps6kb Novice
12. maj 2007 - 22:28 #46
Det giver ingen forskel.
Avatar billede jps6kb Novice
12. maj 2007 - 22:32 #47
Jeg har lige nulstillet alt.. altså slettet alt kode og lavet det forfra.. så nu har jeg kun ddl og så en label.

Jeg prøvede at lave to statiske ListItem' på den. og det virkede bare fint.
Så prøvede jeg både med, at binde til en ArrayList med Battle objekter OG geneerere ListItem' med en foreach.. begge fejlede.. den husker intet. Ligesom før.
Avatar billede jps6kb Novice
12. maj 2007 - 22:36 #48
Det vil sige:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ArrayList battles = SQLData.HentBattles("kim"); // RET MEMBERSHIP
            foreach (Battle b in battles)
            {
                ddlBattles.Items.Add(new ListItem(b.Titel, b.Id.ToString()));
            }
        }
    }

Virker ikke..!!


protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ddlBattles.Items.Add(new ListItem("Test1", "Test1"));
            ddlBattles.Items.Add(new ListItem("Test2", "Test2"));
            //ArrayList battles = SQLData.HentBattles("kim"); // RET MEMBERSHIP
            //foreach (Battle b in battles)
            //{
            //    ddlBattles.Items.Add(new ListItem(b.Titel, b.Id.ToString()));
            //}
        }
    }

Det virker !! .. jeg fatter det ikke.
Avatar billede jps6kb Novice
12. maj 2007 - 22:41 #49
ARJ! Ehm.. smid lige et svar dem der har været med.. problemet ligger et helt andet sted..

Min database klasse trækker ikke id med ud.. eller.. det burde den gøre, men id er 0 .. altså null.

Jeg prøvede lige at bruge title som felt på både text og value.. så virker det. :p
Nej nej, det er da slet ikke pinligt *G*
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 22:42 #50
lol.
Jeg var ellers igang med at skrive jeg giver op posten :D
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 22:43 #51
//me giver jps6kb et lille dumme slag :)
Avatar billede jps6kb Novice
12. maj 2007 - 22:51 #52
Damn..
Jeg havde misset en this.id = id i min Battle klasse i en af konstruktørerne.. hehe.. tager rundhåndet imod dit dummeslag :D
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 23:00 #53
Det var godt :)
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 23:01 #54
Neoman har tydligt vis andet at lave en at sidde og kode på denne tid af døgnet.
Han må næsten have et liv :)
Avatar billede jps6kb Novice
13. maj 2007 - 08:57 #55
Hehe.. det kunne man faktisk godt fristes til at tro.
Jeg valgte at simulere et liv, mere så jeg slap for at kode mere den dag. Tænkte at jeg vist havde lavet skade nok for en dag. :oP
Avatar billede neoman Novice
13. maj 2007 - 12:23 #56
svar - godt du fandt ud  af det, hehe
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