Infragistics.UltraTree奇怪的行为

时间:2013-08-12 09:25:08

标签: xml data-binding infragistics

我使用UltraTree方法SetDataBinding来显示xml树结构。 Xml是这样的:

<?xml version="1.0" encoding="utf-8"?>
<StructDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Document">
<List>  
    <StructElement Name="Number">
        <List/>
    </StructElement>    
    <StructElement Name="Author">
        <List>
            <StructElement Name="Name">
                <List>
                    <StructElement Name="FullName">
                        <List/>
                    </StructElement>
                    <StructElement Name="Adress">
                        <List/>
                    </StructElement>
                    <StructElement Name="Email">
                        <List/>
                    </StructElement>
                </List>
            </StructElement>
        </List>
    </StructElement>
</List>
</StructDocument>

我得到以下内容:enter image description here

如您所见,“Name”元素列表中缺少子元素。但是当我像这样更改xml时(只需更改“Number”和“Author”元素顺序):

<?xml version="1.0" encoding="utf-8"?>
<StructDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Document">
<List>      
    <StructElement Name="Author">
        <List>
            <StructElement Name="Name">
                <List>
                    <StructElement Name="FullName">
                        <List/>
                    </StructElement>
                    <StructElement Name="Adress">
                        <List/>
                    </StructElement>
                    <StructElement Name="Email">
                        <List/>
                    </StructElement>
                </List>
            </StructElement>
        </List>
    </StructElement>
    <StructElement Name="Number">
        <List/>
    </StructElement>
</List>
</StructDocument>

,我得到以下内容:enter image description here

即。现在我看到了所需的行为,所有的xml元素都在屏幕上。我想问一下如何在不改变xml的情况下实现这个目标?

1 个答案:

答案 0 :(得分:3)

我尝试使用您的XML文件在一个小样本中重现您的场景,并且在两种情况下(使用两个XML文件)我得到异常“名为'List'的列已经属于此DataTable:无法设置嵌套表名称为同名。“(可能是因为我的场景有点不同)

请查看附带的示例,如果您认为我没有重现您的方案,请随时修改此示例并将其还原给我。我很乐意为你研究它。

同时最好在我们的网站http://www.infragistics.com/community/forums/上发布您的问题。我们很乐意为您提供帮助。

以下是我的测试样本的结果

enter image description here

这是我的XML文件

<?xml version="1.0" encoding="utf-8"?>
<StructDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Document" Description="">
  <StructElement Name="Number" Description ="Number of books 100">
  </StructElement>
  <StructElement Name="Author">
    <StructElement Name="Name" Description ="Stephen King">
      <StructElement Name="FullName" Description ="Stephen King full name">
      </StructElement>
      <StructElement Name="Adress" Description ="Stephen King address">
      </StructElement>
      <StructElement Name="Email" Description ="Stephen King email">
      </StructElement>
    </StructElement>
  </StructElement>
  <StructElement Name="Number" Description ="Number of books 20">
  </StructElement>
  <StructElement Name="Author">
    <StructElement Name="Name" Description ="George R. R. Martin">
      <StructElement Name="FullName" Description ="George R. R. Martin full name">
      </StructElement>
      <StructElement Name="Adress" Description ="George R. R. Martin address">
      </StructElement>
      <StructElement Name="Email" Description ="George R. R. Martin email">
      </StructElement>
    </StructElement>
  </StructElement>
</StructDocument>

和源代码

 private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            DataSet ds = new DataSet();
            ds.ReadXml("..\\..\\XMLFile1.xml");
            ultraTree1.DataSource = ds.Tables[0];
            ultraTree1.ExpandAll();
            ultraTree1.ColumnSettings.AutoFitColumns = Infragistics.Win.UltraWinTree.AutoFitColumns.ResizeAllColumns;
            ultraTree1.ColumnSettings.ColumnSets[0].Columns[0].Visible = false;

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            this.Close();
        }
    }