当前位置:编程学习 > C#/ASP.NET >>

高手啊,高手,帮帮小弟吧

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    ......

     Case 5

     Dim btnB As New LinkButton
     btnB.Text = "修  改"
     AddHandler btnB.Click, AddressOf Me.edit_Clicked
    ......                 

     end sub



Sub edit_Clicked(ByVal sender As Object, ByVal e As EventArgs)
     
    ......

        Dim btnC As New LinkButton
        AddHandler btnC.Click, AddressOf Me.Submit_Clicked
        Dim btnD As New LinkButton
        btnC.Text = "确  定"
        btnD.Text = "取  消"
    ......

end sub



Submit_Clicked(ByVal sender As Object, ByVal e As EventArgs)

' do something

end sub



现在点击修改后,可以出来“确定”和“取消”按钮,但是点击“确定”却又回到初始页面,不能执行Submit_Clicked,这到底该怎么修改呢?

--------------------编程问答-------------------- 不知道你“Case 5”之前省略什么,不过以剩下的代码看,逻辑根本不对,page_load应该根据状态(ViewState)来决定应该重建什么控件,而不是总是初始化。 --------------------编程问答-------------------- 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的代码,请楼主自己转换一下

一定可以。 --------------------编程问答-------------------- 之前就从数据库读出的各条记录,然后用一个表格去装载他们,在每一行的最后一个单元格内装载一个按钮,单击这个按钮后 执行对应的事件处理程序edit_clicked,在里面又生成两个按钮,一个用来确定编辑,一个用来取消!然后再定义一个事件处理函数对应"确定"按钮

前面的都很好,就是确定编辑后没有任何反应,到底是怎么回事啊 --------------------编程问答-------------------- 大致应该这样设计程序逻辑:

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 property

bool MySubControlsCreated as boolean=false

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 = "取  消"
      ......
  else
      Dim btnB As New LinkButton
      btnB.Text = "修  改"
      AddHandler btnB.Click, AddressOf Me.edit_Clicked
      ......                 
  end if
  MySubControlsCreated =true
end sub

Protected Sub Page_Load(.....) Handles Me.Load
  if not MySubControlsCreated then call createMySubcontrols()
end Sub

Protected Sub Page_PreRender(.....) Handles Me.PreRender
  if not MySubControlsCreated then call createMySubcontrols()
end Sub

Sub edit_Clicked(ByVal sender As Object, ByVal e As EventArgs)
  isEdit=true
end sub
--------------------编程问答-------------------- 3楼你指的是 把

Protected Sub Page_Load该成 OnInit ??? --------------------编程问答-------------------- 上面少了关键的一句:

  property set(value as boolean)
    ViewState("edt")=value
    MySubControlsCreated =false  '在本次PreRender和下一次Load的时候起作用。
  end set

我不太记得vb.net了,如果有语法错误,自己修改吧。理解了思路就行了。 --------------------编程问答-------------------- 如果可以放在“OnInit”中创建子控件,那么其实就没有什么意义了,完全可以放到aspx设计代码中去,用鼠标拖进控件进行设计。

Init根本不能取得ViewState值。因此,一旦我们看到“在Init时期创建子控件”的那些设计,就知道设计者其实还没有去认真考虑到“根据什么来创建子控件”就奢谈创建子控件了。 --------------------编程问答-------------------- 看清楚个跟你的程序的逻辑区别。

你最好对一个程序多考虑几种语言实现形式。抛掉语言概念,看清楚设计逻辑。 --------------------编程问答-------------------- 另外,要特别重视的要点之一是那个“edit_Clicked”的逻辑。

不要更新控件,应该更新this对象上的数据属性。只有即将将控件输出成html的时候才需要重建子控件,之前都不需要更改或者创建子控件。不要用asp.net控件去保存业务数据(这太奢侈了),应该使用数据状态。 --------------------编程问答-------------------- 不太懂C#,哎, 我不太明白为什么第一次按修改的时候,可以执行他对应的事件处理函数,----- 可以出现确定和取消按钮,但是,当我们按确定的时候,为什么不能执行对应的事件处理函数了呢? --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 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解决后把解决的方法贴出来已供参考 --------------------编程问答-------------------- 我大概明白了 sp1234(为什么有钱人总喜欢传教)  所说的意思,但我确实不太明白

property IsEdit as boolean

end  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时,就会把按钮出现在标题的位置。真不明白是为什么!
--------------------编程问答-------------------- 首先在第一楼我贴出的代码中,为什么第一次我们可以点“修改”按钮可以引发处理事情,

但出现 “确定”和“取消”按钮,按“确定”按钮却无法印发确定按钮对应的事件,为什么呢 --------------------编程问答-------------------- 到底为什么呢,否则我们也不需要这么费神的去修改代码了
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,