Web控件不使用VB.NET在ASP.NET中相互通信

时间:2013-05-02 13:10:19

标签: asp.net vb.net

我有一个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

2 个答案:

答案 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中的控件位于更新面板中。试试这个并告诉我这是否有效。