不知道你“Case 5”之前省略什么,不过以剩下的代码看,逻辑根本不对,page_load应该根据状态(ViewState)来决定应该重建什么控件,而不是总是初始化。

解决方案 »

  1.   

    Case 5     Dim btnB As New LinkButton
         btnB.Text = "修  改"
         AddHandler btnB.Click, AddressOf Me.edit_Clicked
    请将这段代码放置
    public override void OnInit(Object sender As Object,EventArgs e)
    中执行。
    如果是VB的代码,请楼主自己转换一下一定可以。
      

  2.   

    之前就从数据库读出的各条记录,然后用一个表格去装载他们,在每一行的最后一个单元格内装载一个按钮,单击这个按钮后 执行对应的事件处理程序edit_clicked,在里面又生成两个按钮,一个用来确定编辑,一个用来取消!然后再定义一个事件处理函数对应"确定"按钮前面的都很好,就是确定编辑后没有任何反应,到底是怎么回事啊
      

  3.   

    大致应该这样设计程序逻辑:property IsEdit as boolean
      property get
         if ViewState("edt") is nothing then
           return false
         else
           return ViewState("edt")
         end if
      end get
      property set(value as boolean)
        ViewState("edt")=value;
      end set
    end propertybool MySubControlsCreated as boolean=falsesub createMySubcontrols()
      '首先删除原有子控件
      if isEdit then
          Dim btnC As New LinkButton
          AddHandler btnC.Click, AddressOf Me.Submit_Clicked
          Dim btnD As New LinkButton
          btnC.Text = "确  定"
          btnD.Text = "取  消"
          ......
      else
          Dim btnB As New LinkButton
          btnB.Text = "修  改"
          AddHandler btnB.Click, AddressOf Me.edit_Clicked
          ......                 
      end if
      MySubControlsCreated =true
    end subProtected Sub Page_Load(.....) Handles Me.Load
      if not MySubControlsCreated then call createMySubcontrols()
    end SubProtected Sub Page_PreRender(.....) Handles Me.PreRender
      if not MySubControlsCreated then call createMySubcontrols()
    end SubSub edit_Clicked(ByVal sender As Object, ByVal e As EventArgs)
      isEdit=true
    end sub
      

  4.   

    3楼你指的是 把Protected Sub Page_Load该成 OnInit ???
      

  5.   

    上面少了关键的一句:  property set(value as boolean)
        ViewState("edt")=value
        MySubControlsCreated =false  '在本次PreRender和下一次Load的时候起作用。
      end set我不太记得vb.net了,如果有语法错误,自己修改吧。理解了思路就行了。
      

  6.   

    如果可以放在“OnInit”中创建子控件,那么其实就没有什么意义了,完全可以放到aspx设计代码中去,用鼠标拖进控件进行设计。Init根本不能取得ViewState值。因此,一旦我们看到“在Init时期创建子控件”的那些设计,就知道设计者其实还没有去认真考虑到“根据什么来创建子控件”就奢谈创建子控件了。
      

  7.   

    另外,要特别重视的要点之一是那个“edit_Clicked”的逻辑。不要更新控件,应该更新this对象上的数据属性。只有即将将控件输出成html的时候才需要重建子控件,之前都不需要更改或者创建子控件。不要用asp.net控件去保存业务数据(这太奢侈了),应该使用数据状态。
      

  8.   

    LinkButton?这不是回传是干什么?
    按钮的事件应该是在页面初始化的时候生成的吧?
    sub createMySubcontrols()
      '首先删除原有子控件
      if isEdit then
          Dim btnC As New LinkButton
          AddHandler btnC.Click, AddressOf Me.Submit_Clicked
          Dim btnD As New LinkButton
          btnC.Text = "确  定"
          btnD.Text = "取  消"
    我想这样做是肯定不行的,因为你页面没有再次load,不能给他重新加载事件.如果load你就又回到原始事件...所以..换个方法来写吧第一次遇到这样的代码,不是很清楚.lz解决后把解决的方法贴出来已供参考
      

  9.   

    我大概明白了 sp1234(为什么有钱人总喜欢传教)  所说的意思,但我确实不太明白property IsEdit as booleanend  property 这一段代码,只能一知半解去做了
    这个办法我试了下是可行的,大致就是定义了一个ViewState("edt")来判断是否点击了编辑,首次页面打开时,我们定义它为ViewState("edt")为false, 然后在程序中呼叫
    ......
         Case 5
         Call createMySubcontrols(i)
    ......下面定义  Sub createMySubcontrols(ByVal i As Integer)
            If ViewState("edt") Then
                Dim btnA As New LinkButton
                Dim btnC As New LinkButton
                          btnA.Text = "确   定<br>"
                btnC.Text = "取  消"
                AddHandler btnA.Click, AddressOf Me.updata_Clicked            Table1.Rows(i).Cells(10).Controls.Add(btnA)
                Table1.Rows(i).Cells(10).Controls.Add(btnC)
            Else
                Dim btnB As New LinkButton
                btnB.Text = "修  改"
                Table1.Rows(i).Cells(10).Controls.Add(btnB)
                AddHandler btnB.Click, AddressOf Me.test_Clicked
            End If
        End Sub
    大家注意到上面,我传进去了一个i,它的主要用途是根据目前的循环取得记录的行位置,好确定我们动态产生的按钮是插进那一行去的,但这却产生了一个问题。以后再讲/首先,因为首次ViewState("edt")是false,所以它会执行"修改"按钮这一段代码,然后我们在"修改"按钮对应的test_Clicked事件
    里把ViewState("edt")=true ,那么当表单按钮(这里的"修改"按钮)被提交的时候,会重新发生page_laod事件,-------------其实我并不太肯定当表单按钮(这里的"修改"按钮)被提交的时候,会不会再重新发生page_laod事件,所以问题也就出来了。---------------假设它促使page_laod发生,然后页面再次执行到createMySubcontrols(i)这个函数时,这次因为是true,会执行产生“确定”和“取消”的代码。现在按照这种办法,必须点两次修改才会变成“确定”和“取消” 按钮,同时,“确定”按钮也必须按两次才能回到修改。为什么呢同时,还有上面所说的i的问题,因为i是从0开始,而我们的表格虽然第一行是0,但它通常用来做标题了,所以真正的数据显示是从第1行开始的,所以要用一个i+1来显示正确的按钮应该产生的位置。这在没有用这个方法之前i+1是完全正确的,但在这里,会出现一个超出index范围的错误,但如果我们用i,当i=0时,就会把按钮出现在标题的位置。真不明白是为什么!