Visual Basic - 读取xml错误“无法创建字段的子列表”

时间:2013-05-30 13:32:38

标签: xml vb.net datagridview xml-parsing readxml

我试图创建一个小型桌面应用程序(使用Visual Studio)从游戏资源文件中读取xml文件。这些文件以XML格式存储。当我尝试将文件读入datagridview时,我收到一个错误:

System.ArgumentException: Child list for field SpaceUnitsCapital cannot be created.
at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)
at System.Windows.Forms.DataGridView.DataGridViewDataConnection.SetDataConnection(Object dataSource, String dataMember)
at System.Windows.Forms.DataGridView.set_DataMember(String value)
at SWFOC.Form1.clk(Object sender, EventArgs e) in C:\Users\Number6\documents\visual studio 2012\Projects\SWFOC\SWFOC\Form1.vb:line 37

我尝试使用的代码是:

Dim URL As String = "C:\Program Files (x86)\LucasArts\Star Wars Empire at War Forces of Corruption\Data\XML\Spaceunitscapital.xml"
    Dim ds As DataSet = New DataSet()
    Dim fsReadXml As System.IO.FileStream = New System.IO.FileStream(URL, System.IO.FileMode.Open)

    Try
        ds.ReadXml(fsReadXml)
        DataGridView1.DataSource = ds
        DataGridView1.DataMember = "SpaceUnitsCapital"
    Catch Err As Exception
        RichTextBox1.Text = Err.ToString
    Finally
        fsReadXml.Close()
    End Try

以下是xml文件的示例:

<?xml version="1.0"?>
<SpaceUnitsCapital>

<SpaceUnit Name="Calamari_Cruiser">
    <Text_ID>TEXT_UNIT_CALAMARI_CRUISER</Text_ID>
    <Encyclopedia_Good_Against> Victory_Destroyer Acclamator_Assault_Ship Interceptor4_Frigate </Encyclopedia_Good_Against>
    <Encyclopedia_Vulnerable_To> TIE_Bomber Skipray_Blastboat </Encyclopedia_Vulnerable_To>
    <GUI_Row> 1 </GUI_Row>
    <Space_Model_Name>RV_MONCALCRUISER.ALO</Space_Model_Name>
    <Select_Box_Scale>600</Select_Box_Scale>
    <Select_Box_Z_Adjust>-50</Select_Box_Z_Adjust>
    <Mass>0.995</Mass>
    <Scale_Factor>1.1</Scale_Factor>
    <Damage>60</Damage>
    <Dense_FOW_Reveal_Range_Multiplier>0.24</Dense_FOW_Reveal_Range_Multiplier>
    <Visible_On_Radar_When_Fogged>true</Visible_On_Radar_When_Fogged>
    <Multisample_FOW_Check>Yes</Multisample_FOW_Check>
    <Ranking_In_Category>5</Ranking_In_Category>
    <Max_Speed>1.5</Max_Speed>
    <Max_Rate_Of_Turn>0.4</Max_Rate_Of_Turn>
    <MovementClass> Space </MovementClass>
    <Space_Layer> Capital </Space_Layer>
    <Layer_Z_Adjust>-290.0</Layer_Z_Adjust>
    <OverrideAcceleration> .02 </OverrideAcceleration>
    <OverrideDeceleration> .02 </OverrideDeceleration>

    <Armor_Type> Armor_Calamari_Cruiser </Armor_Type>
    <Shield_Armor_Type>Shield_Capital</Shield_Armor_Type>
    <Max_Rate_Of_Roll>0.2</Max_Rate_Of_Roll>
    <Bank_Turn_Angle>25</Bank_Turn_Angle>   
    <Max_Thrust>0.2</Max_Thrust>
    <Hyperspace>Yes</Hyperspace>
    <Hyperspace_Speed>1</Hyperspace_Speed>
    <Maintenance_Cost>0.3</Maintenance_Cost>
</SpaceUnit>
</SpaceUnitsCapital>

如果我尝试在没有填充数据库的行的情况下运行代码,它不会引发错误,但它也没有做任何其他事情。它永远不会填充DGV。

有谁知道我怎么能避免这个错误?最终的结果是以某种形式将字段填充到应用程序中,以便然后可以对它们进行编辑和保存,这样如果有人有任何想法,我会对其他方法持开放态度。

提前致谢,   克里斯

2 个答案:

答案 0 :(得分:2)

根据您的评论,我的评论有效,我在此重复我的解决方案:

DataGridView1.DataSource = ds.Tables(0)

你的问题为什么我的代码工作实际上是一个关于数据集和数据表之间差异的问题 您可以认为数据集是一组数据表,或者换句话说,数据集就像数据库一样,数据表就是数据库中的表。
因此,您应该将数据源设置为网格数据源,而不是一组表

答案 1 :(得分:0)

我收到此消息是因为我在控件属性中使用DataSet指定要使用的数据源,然后(因为我忘记了),我尝试在代码中分配一个DataSource。

然后我发现属性中指定的DataSet不正确。然后我删除了控件属性中的绑定,然后它工作了。

如果收到此消息,请检查绑定到控件的数据集是否存在问题。