0

我有一个加载两个控件,控件 A 和控件 B 的 asp.net 页面。控件 A 有一些通用的表单提交和清除按钮,它们在其自己的代码中触发点击事件,后面使用反射来调用控件 B 中的更新函数有几个输入字段。我已经对此进行了调试,但是一切似乎都井井有条;当调用控件 B 中的更新函数时,输入字段在使用 inputname.text 或 me.inputname.text 时不返回值。有谁知道为什么这不起作用?任何指导将不胜感激。

这是控件 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
4

2 回答 2

1

最可能的原因是会话中存储的控件实例不是当前页面上的控件实例。例如,如果您在第一次加载页面时将控件实例存储在会话中,并在回发时检索它,它将是一个不同的实例。

如果您不能为控件 A 提供对控件 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
于 2013-05-02T15:06:03.647 回答
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

通过这种方式,您可以轻松追踪您的价值观在哪里丢失。让我知道它是怎么回事。

在此处尝试另一种简单的工作演示

在控制一个

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 中的控件位于更新面板中。试试这个,让我知道这是否有效。

于 2013-05-02T14:04:42.667 回答