none
怎样实现如下操作。 RRS feed

  • 问题

  • 我要实现这样一个操作,窗体上有一个table控件,和button控件,,通过编程,当我按下button控件时,服务器会在table中创建了一个row,row中有两个cell,其中一个cell是linkbutton控件,一个cell显示字符,linkbutton控件有个事件,可以改写row的第一个cell的值。

    但目前的问题是:按下窗体上的button没问题,可以正常显示出row中的cell和linkbutoon控件,但是我一按下linkbutton控件执行事件后,整个表都不见了。

    正确的编程方法应该是怎样啊,急啊。。。。研究了6个小时都没研究出来,头痛。

    当我按下linkbutton后,后台到底发生了一些什么事件导致表都不见了????

    当我把 button_click中的代码放到page_load中就没有问题,为什么啊。。

    我的table控件状态为什么没保存下来。

     

    Partial Class _Default
        Inherits System.Web.UI.Page
    
        Dim cell1 As New TableCell
        Dim cell2 As New TableCell
    
    
        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim row As New TableRow
            cell1.Text = "事件还未引发"
            row.Cells.Add(cell1)
    
            Dim mycon As New LinkButton
            mycon.Text = "测试"
            cell2.Controls.Add(mycon)
            row.Cells.Add(cell2)
            AddHandler mycon.Click,AddressOf  clickevent
    
            Table1.Rows.Add(row)
        End Sub
    
        Protected Sub clickevent()
            Table1.Rows(0).Cells(1).Text = "事件已经引发"
        End Sub
    
    End Class
    
    2010年4月13日 6:03

答案

  • 你好!

    我写了一个示例,希望对你有帮助。

    前台代码:

    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
    <asp:Table ID="Table1" runat="server" ></asp:Table>

    后台代码:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
        ' 动态创建的控件,不能放在 if (!IsPostBack) 判断中。
        Me.CreateControls()
    End Sub
    
    Private Sub CreateControls()
        For i As Integer = 0 To RowCount - 1
            Me.CreateNewRow(Me.Table1, i)
        Next
    End Sub
    
    Private Sub CreateNewRow(ByVal table As Table, ByVal rowIndex As Integer)
        Dim row As New TableRow()
        Dim cell1 As New TableCell()
        Dim cell2 As New TableCell()
        
        cell1.Text = String.Format("row:{0}&nbsp;cell:1", rowIndex)
        Dim linkButton As New LinkButton()
        linkButton.Text = String.Format("LinkButton{0}", rowIndex)
        AddHandler linkButton.Click, AddressOf linkButton_Click
        cell2.Controls.Add(linkButton)
        
        row.Cells.Add(cell1)
        row.Cells.Add(cell2)
        table.Rows.Add(row)
    End Sub
    
    Private Sub linkButton_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim button As LinkButton = DirectCast(sender, LinkButton)
        Dim row As TableRow = DirectCast(button.Parent.Parent, TableRow)
        ' 第一个 parent 是 TableCell 第二个是 TableRow
        row.Cells(0).Text = String.Format("update by control '{0}'", button.Text)
    End Sub
    
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.RowCount += 1
        Me.CreateNewRow(Me.Table1, Me.RowCount - 1)
    End Sub
    
    Public Property RowCount() As Integer
        Get
            If ViewState("RowCount") Is Nothing Then
                ViewState("RowCount") = 0
            End If
            Return CInt(ViewState("RowCount"))
        End Get
        Set(ByVal value As Integer)
            ViewState("RowCount") = CInt(ViewState("RowCount")) + 1
        End Set
    End Property
    


    知识改变命运,奋斗成就人生!
    2010年4月13日 7:51
    版主
  • 理解正确。


    Microsoft Online Community Support
    2010年4月15日 2:12

全部回复

  • 你好!

    我写了一个示例,希望对你有帮助。

    前台代码:

    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
    <asp:Table ID="Table1" runat="server" ></asp:Table>

    后台代码:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
        ' 动态创建的控件,不能放在 if (!IsPostBack) 判断中。
        Me.CreateControls()
    End Sub
    
    Private Sub CreateControls()
        For i As Integer = 0 To RowCount - 1
            Me.CreateNewRow(Me.Table1, i)
        Next
    End Sub
    
    Private Sub CreateNewRow(ByVal table As Table, ByVal rowIndex As Integer)
        Dim row As New TableRow()
        Dim cell1 As New TableCell()
        Dim cell2 As New TableCell()
        
        cell1.Text = String.Format("row:{0}&nbsp;cell:1", rowIndex)
        Dim linkButton As New LinkButton()
        linkButton.Text = String.Format("LinkButton{0}", rowIndex)
        AddHandler linkButton.Click, AddressOf linkButton_Click
        cell2.Controls.Add(linkButton)
        
        row.Cells.Add(cell1)
        row.Cells.Add(cell2)
        table.Rows.Add(row)
    End Sub
    
    Private Sub linkButton_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim button As LinkButton = DirectCast(sender, LinkButton)
        Dim row As TableRow = DirectCast(button.Parent.Parent, TableRow)
        ' 第一个 parent 是 TableCell 第二个是 TableRow
        row.Cells(0).Text = String.Format("update by control '{0}'", button.Text)
    End Sub
    
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.RowCount += 1
        Me.CreateNewRow(Me.Table1, Me.RowCount - 1)
    End Sub
    
    Public Property RowCount() As Integer
        Get
            If ViewState("RowCount") Is Nothing Then
                ViewState("RowCount") = 0
            End If
            Return CInt(ViewState("RowCount"))
        End Get
        Set(ByVal value As Integer)
            ViewState("RowCount") = CInt(ViewState("RowCount")) + 1
        End Set
    End Property
    


    知识改变命运,奋斗成就人生!
    2010年4月13日 7:51
    版主
  • 你的代码出来的效果不合我的要求,和我开始没有描述清楚有关系sorry,因为点了linkbutton控件后,tablerow会消失。

    我突然意识到我的动态控件编程的想法有些地方不对。

    button事件创建一个tablerow,这个bablerow控件中还有一个控件linkbutton.

    由于linkbutton是由button_clik事件建的,当我点击了linkbutton,页面回发后,系统不会在次自动重新构建linkbutton和tablerow,所以我的表内容都不见了。

    回发的控件视图状态态保存的只是控件的属性,而不是控件本身(table控件中的tablerow和tablecell实际上都是做为控件存在的,而不是做为table的属性存在的),控件本身。只能在特定的页面生存周期中生成。

    就是说动态生成的控件正常编程方法是应该在页面的生存周期的初始化阶段生成,及载入的阶段生成。 也就是page_load 和 page_int 和 page_reint 事件中中生成。

    不知道这么理解是否正确。

    2010年4月14日 3:56
  • 理解正确。


    Microsoft Online Community Support
    2010年4月15日 2:12