1

@Angkor Wat のおかげで、目標に向かって大きな一歩を踏み出すことができました。しかし、解決できない別の問題に遭遇しました。

スクリプトは次のとおりです。

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="addtostring.aspx.vb" Inherits="demo_addtostring" %>
<!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>
        <p><asp:textbox id="tb" runat="server"></asp:textbox></p>
        <asp:Panel ID="tbPanel" runat="server"></asp:Panel>
    </div>
    </form>
</body>
</html>

これは背後にあるコードです:

Partial Class demo_addtostring
    Inherits System.Web.UI.Page

    Public Property gesStr As String
        Set(value As String)
            ViewState("gesStr") = value
        End Set
        Get
            Dim o As Object = ViewState("gesStr")
            If o Is Nothing Then
                Return ""
            Else
                Return o
            End If
        End Get
    End Property

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        If Page.IsPostBack Then
        Else
            gesStr = "1;"
        End If
        tb.Text = gesStr
        Dim iButton As New Button
        iButton.Text = "add"
        iButton.CommandArgument = "1;"
        iButton.CommandName = "1;"
        AddHandler iButton.Click, AddressOf add
        tbPanel.Controls.Add(iButton)

        If Page.IsPostBack Then
        Else
            anzeige()
        End If
    End Sub

    Private Sub add(ByVal sender As Object, ByVal e As EventArgs)
        Dim myButton As Button = DirectCast(sender, Button)
        Dim addString As String = myButton.CommandArgument
        gesStr += addString
        tb.Text = gesStr
        anzeige()
    End Sub

    Private Sub anzeige()
        Dim gesArray As Array = Split(gesStr, ";")
        For xLauf As Integer = 0 To UBound(gesArray) - 1
            Dim anzeigeDiv As New System.Web.UI.HtmlControls.HtmlGenericControl("div")
            Dim anzLabel As New Label
            anzLabel.Text = gesArray(xLauf)
            anzeigeDiv.Controls.Add(anzLabel)
            Dim iButton2 As New Button
            iButton2.Text = xLauf.ToString
            iButton2.ID = "test" & xLauf.ToString
            iButton2.CommandArgument = "1;"
            iButton2.CommandName = "1;"
            AddHandler iButton2.Click, AddressOf add
            anzeigeDiv.Controls.Add(iButton2)
            tbPanel.Controls.Add(anzeigeDiv)
        Next
    End Sub
End Class

追加ボタンをクリックすると、「1;」が追加されます。to gesStr- 動的なループ生成ボタンも同じようにする必要があります -.- アイデアはありますか? 私は助けてくれてとても感謝しています...

4

2 に答える 2

1

ポストバックがボタンからのイベント ハンドラーを認識できるようにするには、ハンドラーが呼び出されるライフサイクル ポイントの前にボタンを再作成する必要があります。つまり、常に Page_Load 内でボタンを再作成する必要があります。

動作するコードの変更は次のとおりです。

<form id="form1" runat="server">
<div>
    <p><asp:textbox id="tb" runat="server"></asp:textbox></p>
    <br />
    <asp:Button runat="server" ID="btnAdd" Text="add" CommandArgument="1;" />
    <asp:Panel ID="tbPanel" runat="server"></asp:Panel>
</div>
</form>

コードビハインド:

Public Property gesStr As String
    Get
        Dim o As Object = ViewState("gesStr")
        If o Is Nothing Then
            Return ""
        Else
            Return DirectCast(o, String)
        End If
    End Get
    Set(value As String)
        ViewState("gesStr") = value
    End Set
End Property

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        gesStr = "1;"
    End If

    tb.Text = gesStr
End Sub

Private Sub add(ByVal sender As Object, ByVal e As CommandEventArgs) Handles btnAdd.Command
    Dim addString As String = e.CommandArgument
    gesStr += addString
    tb.Text = gesStr
    CreateNewButton(tbPanel.Controls.Count, addString.Substring(0, addString.Length - 1))
End Sub

Protected Overrides Sub CreateChildControls()
    MyBase.CreateChildControls()

    Dim gesArray As Array = Split(gesStr, ";")
    For xLauf As Integer = 0 To UBound(gesArray) - 1
        CreateNewButton(xLauf, gesArray(xLauf))
    Next
End Sub

Private Sub CreateNewButton(ByVal xLauf As Integer, ByVal labelText As String)
    Dim anzeigeDiv As New Panel
    anzeigeDiv.ID = "div" & xLauf.ToString()

    Dim anzLabel As New Label
    anzLabel.Text = labelText
    anzeigeDiv.Controls.Add(anzLabel)

    Dim iButton2 As New Button
    iButton2.Text = xLauf.ToString
    iButton2.ID = "test" & xLauf.ToString()
    iButton2.CommandArgument = "1;"
    iButton2.CommandName = "1;"
    AddHandler iButton2.Command, AddressOf add
    anzeigeDiv.Controls.Add(iButton2)

    tbPanel.Controls.Add(anzeigeDiv)
End Sub

gesStr常に存在する追加ボタンを aspx ページに移動して、動的パネルに値に基づいて追加されたボタンのみが含まれるようにしました。

于 2012-07-17T14:25:46.703 に答える
0

ダイナミック コントロールは、すべてのポストバックで再作成する必要があります。詳細については、この記事を参照してください。

于 2012-07-17T11:06:54.850 に答える