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
.
精彩评论