我有一个asp.net页面,它加载了两个控件,即控件A和控件B.控件A有一些通用的表单提交和清除按钮,在其自己的代码中触发点击事件,后面使用反射来调用更新函数控制B有几个输入字段。我调试了这个,然而一切似乎都井井有条;当调用控件B中的更新函数时,输入字段在使用inputname.text或me.inputname.text时不返回值。有没有人有任何想法为什么这不起作用?任何指导都将不胜感激。
这是Control A的代码隐藏中的代码,它在控件B的代码中调用更新方法
Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSave.Click
Try
Dim lctlControl = Session("SelectedQstnCtl")
Dim methodObj = lctlControl.GetType().GetMethod("UpdateGenInfo", BindingFlags.NonPublic Or BindingFlags.Instance)
' Execute UpdateGenInfo method to update the data
methodObj.Invoke(lctlControl, Nothing)
Catch ex As Exception
'TODO: check for concurrency error here
End Try
End Sub
这是正在调用的控件B中的更新功能。正在传递会话值,但表单字段不是。
Protected Sub UpdateGenInfo()
Dim lclUtil As New clUtility
Dim genInfo As New clGenInfo
Try
Dim dt As Integer
'Update Data for 1-2
dt = genInfo.UpdateGenInfo_E1_01_02(Session("ConnStrEP"), Me.varLastUpdate, Session("AppNo"), Session("RevNo"), _
Me.txtPrName.Text, Me.txtPrAddr1.Text, Me.txtPrAddr2.Text, _
Me.txtPrCity.Text, Me.txtPrState.Text, Me.txtPrZip.Text)
Catch ex As Exception
'Display error
lclUtil.DisplayMsg(Me.lblErrMsg, String.Format("Error Location: Sub LoadGenInfo (ctlE1_01_02) {0}", ex.Message))
End Try
End Sub
答案 0 :(得分:1)
最可能的原因是存储在会话中的控件实例不是当前页面上的控件实例。例如,如果您在首次加载页面时将控件实例存储在会话中,并在回发后检索它,则它将是一个不同的实例。
如果您无法为Control A提供对Control B的直接引用,请更改您的代码以将引用存储在Page.Items
集合中:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
Page.Items("SelectedQstnCtl") = TheSelectedQstnCtl
End Sub
Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSave.Click
Dim lctlControl = DirectCast(Page.Items("SelectedQstnCtl"), YourControlClass)
lctlControl.UpdateGenInfo()
End Sub
答案 1 :(得分:0)
我看到你正在使用反射,这可能对该任务有点过分。尝试直接引用控件中的方法。然后将方法UpdateGenInfo公开,然后像这样引用它。
Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSave.Click
Try
Dim lctlControl = CType(Session("SelectedQstnCtl"),YourControlClass)
lctlControl.UpdateGenInfo()
Catch ex As Exception
End Sub
Public Function UpdateGenInfo()
'your code here
Catch ex As Exception
End Try
End Function
通过这种方式,您可以轻松追踪您的价值观丢失的位置。让我知道它是怎么回事。
尝试另一种简单的方法来演示演示here
在控制中
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim testb1 = CType(Me.NamingContainer.FindControl("testb1"), testb)
testb1.UpdateGenInfo()
End Sub
在对照b中
Public Function UpdateGenInfo()
Try
Dim a = Me.TextBox1.Text
Catch ex As Exception
End Try
End Function
Aspx 父页面
<uc1:testa ID="testa1" runat="server" />
<uc2:testb ID="testb1" runat="server" />
testb中的控件位于更新面板中。试试这个并告诉我这是否有效。