高手啊,高手,帮帮小弟吧
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