开发者

Dynamically created button requires 2 clicks to return view state

开发者 https://www.devze.com 2023-04-05 08:02 出处:网络
I\'m trying to create a page dynamically, but I falling at the first herdle.I have create the below after reading may blogs/post/articles.The problem I have is when I click the first buttons I created

I'm trying to create a page dynamically, but I falling at the first herdle. I have create the below after reading may blogs/post/articles. The problem I have is when I click the first buttons I created nothing happend, if I then click it again it works.

Can any one tell me where I'm going wrong?

Thanks

ASP Page:

<%@ Page Title="Create / Amend Quotes" Language="vb" AutoEventWireup="false" CodeBehind="Quote.aspx.vb" Inherits="BIS.Quote" %>

 <!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 id="Head1" runat="server">
     <title></title>
 </head>
 <body>

    <form id="form1" runat="server">
     <div>
         <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>     

    </div>
     </form>
 </body>
 </html>

VB

Imports System.Data
 Imports System.Data.SqlClient
 Public Class Quote
     Inherits System.Web.UI.Page

    Const CREATE_SELECTION As String = "create"
     Const AMEND_SELECTION As String = "amend"
     Const VIEWSTATEKEY_DYNCONTROL As String = "VS_Controls"

    Protected Property VS_Controls() As String
         Get
             Dim result As String = ViewState.Item(VIEWSTATEKEY_DYNCONTROL)
             If result Is Nothing Then
                 Return String.Empty
             Else
                 Return result
             End If
         End Get
         Set(ByVal value As String)
             ViewState.Item(VIEWSTATEKEY_DYNCONTROL) = value
         End Set

    End Property

    Private Sub Quote_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
         PlaceHolder1.Controls.Clear()

    End Sub

    Private Sub Quote_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Select Case Me.VS_Controls
             Case CREATE_SELECTION
                 Dim Lab As New Label
                 Lab.ID = "Tester"
                 Lab.Text = "Create"
                 Me.PlaceHolder1.Controls.Add(Lab)

            Case AMEND_SELECTION
                 Dim Lab As New Label
                 Lab.ID = "Tester_2"
                 Lab.Text = "Amend"
                 Me.PlaceHolder1.Controls.Add(Lab)

            Case Else
                 Dim btn_create As New Button
                 Dim btn_Amend As New Button
                 Dim Label1 As New Label

                btn_create.ID = "but_Create"
                 btn_create.开发者_运维技巧Text = "Create"
                 btn_create.CommandName = "Create"
                 AddHandler btn_create.Click, AddressOf onClick

                btn_Amend.ID = "but_Amend"
                 btn_Amend.Text = "Amend"
                 btn_Amend.CommandName = "Amend"
                 AddHandler btn_Amend.Click, AddressOf onClick

                Label1.id = "lab1"

                Label1.Text = VS_Controls

                Me.PlaceHolder1.Controls.Add(btn_create)
                 Me.PlaceHolder1.Controls.Add(New LiteralControl(" ")) 'space them out
                 Me.PlaceHolder1.Controls.Add(btn_Amend)
                 Me.PlaceHolder1.Controls.Add(New LiteralControl(" ")) 'space them out
                 Me.PlaceHolder1.Controls.Add(Label1)
         End Select

    End Sub

    Private Sub onClick(ByVal sender As Object, ByVal e As EventArgs)

        Dim From As Button = DirectCast(sender, Button)
         Dim But_String As String = From.ID

        If But_String = "but_Create" Then
             Me.VS_Controls = CREATE_SELECTION
             ' Me.VS_Controls = "create"
             ' ViewState("create_amend") = "create"
         ElseIf But_String = "but_Amend" Then
             Me.VS_Controls = AMEND_SELECTION
             'ViewState("create_amend") = "amend"
         End If

    End Sub

    Private Sub Quote_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender





    End Sub
 End Class


you need to check is page is in post back mode.....

if(!Page.IsPostBack){}


In the ASP.NET page life cycle (http://msdn.microsoft.com/en-us/library/ms178472.aspx), Page_Load happens before events are processed. So your viewstate isn't getting modified until after the labels have been created. You should put your logic to create the labels in Page_PreRender instead (or a separate method that can be called from the click event, or from Page_Load if IsPostback is false).


Create the button and assign the event handler during OnInit. ViewState has already loaded by the time you hit Page_Load.

0

精彩评论

暂无评论...
验证码 换一张
取 消