0

我有一个可编辑的 GridView 控件,它的功能来自 XML 文件。鉴于 xml 文件不包含页面加载数据,GridView 包含一个空数据模板。empty-data-template 由两个文本框控件和一个用于将数据放入 xml 文件的链接按钮组成,因此应该会导致 Gridview 显示。我的问题是,当我单击链接按钮时,我收到一个与对象引用相关的错误以响应此行:Dim oDr As DataRow = oDs.Tables("po").NewRow ...完整的事件处理程序,我提供以下:

后面的代码:

Public Sub writeStartpoNum()
        Dim startpoNumID As String = DirectCast(gvPurchaseOrderNum.Controls(0).Controls(0).FindControl("txtStartpoNumID"), TextBox).Text
        Dim startpoNum As String = DirectCast(gvPurchaseOrderNum.Controls(0).Controls(0).FindControl("txtStartpoNum"), TextBox).Text
        Dim oDs As New DataSet()
        Dim xmlPath As String = MapPath("~/xml/newShipment.xml")
        If Not System.IO.File.Exists(xmlPath) Then
            oDs.DataSetName = "newShipmentNotification"
            oDs.Tables.Add("pos")
            oDs.Tables("pos").Columns.Add("pos_Id")
            oDs.Tables("pos").Columns("pos_Id").ColumnMapping = MappingType.Hidden
            oDs.Tables.Add("po")
            oDs.Tables("po").Columns.Add("ponumberID")
            oDs.Tables("po").Columns.Add("pos_Id")
            oDs.Tables("po").Columns("pos_Id").ColumnMapping = MappingType.Hidden
            oDs.Tables("po").Columns.Add("ponumber")
            Dim pos_po As DataRelation = oDs.Relations.Add("pos_po", oDs.Tables("pos").Columns("pos_Id"), _
            oDs.Tables("po").Columns("pos_Id"))
            pos_po.Nested = True
            Dim oDrs As DataRow = oDs.Tables("pos").NewRow
            oDrs("pos_Id") = 0
            oDs.Tables("pos").Rows.Add(oDrs)
        Else
            oDs.ReadXml(Server.MapPath("~/xml/newShipment.xml"))
        End If
        Dim oDr As DataRow = oDs.Tables("po").NewRow
        oDr("ponumberID") = startpoNumID
        oDr("ponumber") = startpoNum
        oDr("pos_Id") = 0
        oDs.Tables("po").Rows.Add(oDr)
        oDs.WriteXml(Server.MapPath("~/xml/newShipment.xml"))
        gvPurchaseOrderNum.DataSource = oDs.Tables("po")
        gvPurchaseOrderNum.DataBind()
    End Sub

...这是 Gridview 中空数据模板的设计:

<emptydatatemplate>
<b>Enter Purchase Order Number:</b> <br /> 
<asp:TextBox ID="txtStartpoNumID" runat="server"></asp:TextBox>&nbsp;
<asp:TextBox ID="txtStartpoNum" runat="server"></asp:TextBox><br />
<asp:LinkButton ID="lnkpro" runat="server" OnClick="writeStartpoNum"  Text="Add Purchase order Number"></asp:LinkButton> 
<br /><br />
</emptydatatemplate> 

...这就是 xml 反映页面加载的方式,这是一个函数的结果,如果 xml 文件包含页面加载数据,则该函数会清除 xml 文件中的任何数据。

<?xml version="1.0" standalone="yes"?>
<newShipmentNotification>
  <pos />
</newShipmentNotification>

...正如我所提到的,在调试时 - 问题源于以下行

Dim oDr As DataRow = oDs.Tables("po").NewRow

xml 是通过条件语句构建的。我想不通的是为什么数据集变量 (oDs),即使它在调试模式下查看时反映了pos表,仍然会产生与对象引用相关的错误。请提供一些指导,说明我在这里可能做错了什么,或者我是否遗漏了一些东西。谢谢

4

1 回答 1

0

问题是当您拥有没有“po”节点的 xml 文件时。您可以将节点移动到新方法,例如:

Private Function CreatePOSDataset() As DataSet
        Dim oDs As New DataSet()
        oDs.DataSetName = "newshipmentnotification"
        oDs.Tables.Add("pos")
        oDs.Tables("pos").Columns.Add("pos_Id")
        oDs.Tables("pos").Columns("pos_Id").ColumnMapping = MappingType.Hidden
        oDs.Tables.Add("po")
        oDs.Tables("po").Columns.Add("ponumberID")
        oDs.Tables("po").Columns.Add("pos_Id")
        oDs.Tables("po").Columns("pos_Id").ColumnMapping = MappingType.Hidden
        oDs.Tables("po").Columns.Add("ponumber")

        Dim pos_po As DataRelation = oDs.Relations.Add("pos_po", oDs.Tables("pos").Columns("pos_Id"), _
        oDs.Tables("po").Columns("pos_Id"))
        pos_po.Nested = True

        Dim oDrs As DataRow = oDs.Tables("pos").NewRow
        oDrs("pos_Id") = 0
        oDs.Tables("pos").Rows.Add(oDrs)
        CreatePOSDataset = oDs
    End Function

并在“po”节点不存在时调用该方法:

Public Sub writeStartpoNum(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim startpoNumID As String = DirectCast(gvPurchaseOrderNum.Controls(0).Controls(0).FindControl("txtStartpoNumID"), TextBox).Text
        Dim startpoNum As String = DirectCast(gvPurchaseOrderNum.Controls(0).Controls(0).FindControl("txtStartpoNum"), TextBox).Text

    Dim oDs As New DataSet()
    Dim xmlPath As String = MapPath("~/xml/newshipmentnotification.xml")

    If Not System.IO.File.Exists(xmlPath) Then
        oDs = CreatePOSDataset()
    Else
        oDs.ReadXml(Server.MapPath("~/xml/newshipmentnotification.xml"))
        If oDs.Tables("po") Is Nothing Then
            oDs = CreatePOSDataset()
        End If
    End If
    Dim oDr As DataRow = oDs.Tables("po").NewRow
    oDr("ponumberID") = startpoNumID
    oDr("ponumber") = startpoNum
    oDr("pos_Id") = 0
    oDs.Tables("po").Rows.Add(oDr)
    oDs.WriteXml(Server.MapPath("~/xml/newshipmentnotification.xml"))
    gvPurchaseOrderNum.DataSource = oDs.Tables("po")
    gvPurchaseOrderNum.DataBind()
End Sub
于 2013-08-22T17:11:34.050 回答