Avatar billede Kim Neesgaard Seniormester
14. juni 2006 - 11:05 Der er 26 kommentarer og
1 løsning

IsPostBack problem i en brugerkontrol

Jeg har en Default.aspx og i denne har jeg indsat en brugerkontrol, der indeholder en textbox og en knap. Hvis jeg i denne brugerkontrol (.ascx) indsætter følgende kode:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not IsPostBack Then
            TextBox1.Text = "x"
        Else
            TextBox1.Text = "y"
        End If
End Sub

så indsættes x ved første kørsel, men hvis jeg klikker på knappen (som jeg pr. standard giver en postback), så skifter indholdet i textboxen ikke til y - hvordan kan det være?

Hvis jeg laver en .aspx side med samme kode, så skifter undholdet til y ved klik på knappen.
Avatar billede snepnet Nybegynder
14. juni 2006 - 11:51 #1
Redirecter du mon istedet... Eller klikker på et link til siden?
... Der er ikke noget galt med det du har lavet, så fejlen ligger et andet sted.
Cacher du måske kontrollen?
Hvis du debugger... Eksekverer det så som forventet?
Mvh
Avatar billede Kim Neesgaard Seniormester
14. juni 2006 - 12:01 #2
Jeg redirecter ikke og klikker ikke på et link - jeg klikker kun på knappen (der pt. ikke har noget kode).

Hvis jeg lægger en label ind, kan den godt skifte til y (faktisk samme fænomen som på min 'rigtige' side, hvor jeg heller ikke kunne få tekstboksen til at skifte).

Dette kører desværre på min VS 1.0, som ikke er i stand til at debugge, men eftersom label ændrer sig, så må koden jo gennemløbes.
Avatar billede snepnet Nybegynder
14. juni 2006 - 12:16 #3
Prøv at vis mig hele koden.
Mvh
Avatar billede Kim Neesgaard Seniormester
14. juni 2006 - 12:32 #4
Her er den:

Public MustInherit Class Test
    Inherits System.Web.UI.UserControl
    Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
    Protected WithEvents Label1 As System.Web.UI.WebControls.Label
    Protected WithEvents Button1 As System.Web.UI.WebControls.Button

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not IsPostBack Then
            TextBox1.Text = "x"
            Label1.Text = "x"
        Else
            TextBox1.Text = "y"
            Label1.Text = "y"
        End If
    End Sub

End Class

<%@ Control Language="vb" AutoEventWireup="false" Codebehind="Test.ascx.vb" Inherits="Promis_II.Test" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
<asp:Label id="Label1" runat="server">Label</asp:Label>
Avatar billede mikkel_sommer Nybegynder
14. juni 2006 - 15:05 #5
Lyder mærkeligt det virker fint her, koden jeg har brugt er:

WebForm1.aspx:

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="testpage.WebForm1"%>
<%@ Register TagPrefix="uc1" TagName="WebUserControl1" Src="WebUserControl1.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <title>WebForm1</title>
        <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
            <uc1:WebUserControl1 id="WebUserControl11" runat="server"></uc1:WebUserControl1>
        </form>
    </body>
</HTML>


WebForm1.aspx.vb:

Public Class WebForm1
    Inherits System.Web.UI.Page

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    'NOTE: The following placeholder declaration is required by the Web Form Designer.
    'Do not delete or move it.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

End Class


WebUserControl1.ascx:

<%@ Control Language="vb" AutoEventWireup="false" Codebehind="WebUserControl1.ascx.vb" Inherits="testpage.WebUserControl1" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
<asp:Label id="Label1" runat="server">Label</asp:Label>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>



WebUserControl1.ascx.vb:

Public Class WebUserControl1
    Inherits System.Web.UI.UserControl

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub
    Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
    Protected WithEvents Label1 As System.Web.UI.WebControls.Label
    Protected WithEvents Button1 As System.Web.UI.WebControls.Button

    'NOTE: The following placeholder declaration is required by the Web Form Designer.
    'Do not delete or move it.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not IsPostBack Then
            TextBox1.Text = "x"
            Label1.Text = "x"
        Else
            TextBox1.Text = "y"
            Label1.Text = "y"
        End If
    End Sub

End Class
Avatar billede Kim Neesgaard Seniormester
14. juni 2006 - 16:21 #6
Har prøvet, men får fejl i Private Sub InitializeComponent()

End Sub

og Page_Init: Method Page_Init has multiple definitions with identical signatures?
Avatar billede mikkel_sommer Nybegynder
14. juni 2006 - 21:17 #7
du er med på at koden skal ind i 4 forskellige filer ikk?
Avatar billede snepnet Nybegynder
15. juni 2006 - 13:47 #8
Kompileren fortæller dig at du har den samme metode flere gange i samme klasse, og det går ikke.
Mvh
Avatar billede mikkel_sommer Nybegynder
15. juni 2006 - 13:55 #9
Ja præcis, kunne evt. være hvis du har sat alt koden ind i en enkelt fil, der af mit spørgsmål vedr. de 4 filer.
Avatar billede Kim Neesgaard Seniormester
15. juni 2006 - 21:59 #10
Ja - jeg satte kun koden ind i .ascx og .ascx.vb filerne. Jeg tjekker de 2 andre også.
Avatar billede mikkel_sommer Nybegynder
16. juni 2006 - 12:50 #11
ok men husk på at der er jo en html og en codebehind fil for både siden og usercontrolen
Avatar billede Kim Neesgaard Seniormester
16. juni 2006 - 14:13 #12
Codebehind ok, men hvad er det for et html fil?
Avatar billede snepnet Nybegynder
16. juni 2006 - 18:01 #13
Din ascx-fil.
Mvh
Avatar billede Kim Neesgaard Seniormester
16. juni 2006 - 18:05 #14
Ok.

Når jeg indsætter koden i .aspx.vb filen, får jeg samme fejl med  InitializeComponent() og den står ikke to gange i class, så vidt jeg kan se? Hvad gør Region-koden? Jeg mener ikke VS selv sætter den ind, når man opretter filen?
Avatar billede mikkel_sommer Nybegynder
16. juni 2006 - 20:36 #15
Region gør bare at du kan kolapse dele af koden så klassen bliver mere overskuelig, du kan se at der ude til venstre for region starten er et lille plus, ganske som dem vs selv laver ved eksempelvis metoder.
Avatar billede Kim Neesgaard Seniormester
16. juni 2006 - 20:58 #16
Ok - men hvad tror du, at fejlen skyldes?
Avatar billede mikkel_sommer Nybegynder
19. juni 2006 - 08:50 #17
Har du taget den kode jeg pastede til dig og puttet ind i de omtalte 4 filer:

- .aspx
- .aspx.vb
- .ascx
- .ascx.vb

???
Avatar billede Kim Neesgaard Seniormester
19. juni 2006 - 19:33 #18
Jeg forsøger at nå at prøve det i morgen.
Avatar billede Kim Neesgaard Seniormester
18. juli 2006 - 13:28 #19
Jeg har haft ferie og har først kunnet nå det nu.

Nu har jeg ført al kode ind i de 4 filer (dog ikke Regionafsnittet, da det giver fejl), men stadig er det kun label1, der skifter værdi?
Avatar billede Kim Neesgaard Seniormester
18. juli 2006 - 13:43 #20
snepnet -> Jeg havde faktisk Regionafsnittet inde een gang, så fejlen var ganske rigtigt et forsøg på at gentage.
Avatar billede Kim Neesgaard Seniormester
18. juli 2006 - 13:56 #21
Der var faktisk stadig en forskel i koden: jeg havde placeret en placeholder i Default.aspx og brugt Placeholder.Controls.Add(LoadControl("Test.ascx")) til at vise brugerkontrollen og i denne situation vil textboxen ikke skifte værdi.

Placerer jeg brugerkontrollen direkte med <uc1:Test id="Test" runat="server"></uc1:Test> kan tekstboxen godt skifte værdi.

Men burde man ikke kunne bruge en placeholder og indsætte en user control i denne? Det forekommer da mest fleksibelt.
Avatar billede snepnet Nybegynder
18. juli 2006 - 15:03 #22
Jo - det kan du godt, men prøv at gør det i init istedet... Så skal det nok gå godt.
Mvh
Avatar billede snepnet Nybegynder
18. juli 2006 - 15:03 #23
Altså:
protected override void OnInit(EventArgs e)
{
    // koden du benytter til at loade kontrollen
    base.OnInit(e);
}
Mvh
Avatar billede Kim Neesgaard Seniormester
18. juli 2006 - 15:21 #24
I VB er det så:

Protected Overrides Sub OnInit(ByVal e As EventArgs)
        ' koden du benytter til at loade kontrollen
        phPromis.Controls.Add(LoadControl("Test.ascx"))
        MyBase.OnInit(e)
End Sub 'OnInit

og det virker: nu skifter både label og textbox!!

Hvad gør MyBase.OnInit(e)?
Avatar billede snepnet Nybegynder
18. juli 2006 - 15:32 #25
Kalder basens implementering af OnInit(e), og den implementering kan du bedst se, hvis du benytter et værktøj som lutz roeders reflector som du kan hente her:
http://www.aisto.com/roeder/dotnet/
Mvh
Avatar billede Kim Neesgaard Seniormester
19. december 2010 - 16:28 #26
snepnet -> vil du lægge et svar?
Avatar billede Kim Neesgaard Seniormester
04. august 2011 - 18:22 #27
Har ikke modtaget et svar, så jeg lukker selv.
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