我有一个可编辑GridView控件,它在XML文件之外起作用。GridView包含一个空的数据模板,因为xml文件在页面加载时不包含任何数据。空数据模板由两个文本框控件和一个用于将数据放入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>
<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是通过条件语句构建出来的。我无法理解的是,为什么数据集变量(oD),即使在调试模式下查看时反映了pos表,仍然会生成与对象引用相关的错误。请提供一些指导,说明我在这里可能做错了什么,或者我是否遗漏了什么。感谢
问题是当xml文件没有'po'节点时。可以将节点移动到新节点方法类似:
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