FlexGrid表格控件产品文档

步骤2/5:读取数据并创建大纲

要读取数据,并建立大纲,向Button1_Click事件中添加一些代码和GetXMLData 事物。

1. 双击命令按钮,将下面的代码添加到Button1_Click 事件中去:

• Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
' 取得文件名称
Dim fo As OpenFileDialog = New OpenFileDialog()
fo.DefaultExt = "xml"
fo.Filter = "XML Files (*.xml)|*.xml"
If fo.ShowDialog() <> Windows.Forms.DialogResult.OK Then Exit Sub
' 读取XML文件
Dim xdoc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
xdoc.Load(fo.FileName)
' 停止重绘,以提高速度。
C1FlexGrid1.Redraw = False
' 填充表格
C1FlexGrid1.Rows.Count = 1
GetXMLData(xdoc.ChildNodes(1), 0)
' 自动调整树的大小。
C1FlexGrid1.AutoSizeCol(0)
' 显示0、1、2层
C1FlexGrid1.Tree.Show(2)
' 开始重绘
C1FlexGrid1.Redraw = True
End Sub
• C#
private void button1_Click(System.object sender, System.EventArgs e)
{
//取得文件名称
OpenFileDialog fo = new OpenFileDialog();
fo.DefaultExt = "xml";
fo.Filter = "XML Files (*.xml)|*.xml";
if ( fo.ShowDialog() != DialogResult.OK ) return;
//读取XML文件
System.Xml.XmlDocument xdoc = new System.Xml.XmlDocument();
xdoc.Load(fo.FileName);
//停止重绘,以提高速度。
c1FlexGrid1.Redraw = false;
//填充表格
c1FlexGrid1.Rows.Count = 1;
GetXMLData(xdoc.ChildNodes[1], 0);
//自动调整树的大小。
c1FlexGrid1.AutoSizeCol(0);
//显示0、1、2层
c1FlexGrid1.Tree.Show(2);
//开始重绘
c1FlexGrid1.Redraw = true;
}
请遵守以下规定:

这个流程一开始是显示一个OpenFileDialog 用来让用户选择一个XML文件加载到表格中。

当文件被选中,程序就开始加载文件到XmlDocument对象,并将文件中的内容解析到内存中去。

这个流程之后开始设置表格的重绘属性为False 来控制表格暂停重绘。这种技显著的提高了程序的性能,你可以在向C1FlexGrid表格中添加大量数据的时候使用这个方法。

接下来,这个流程清除了为1的任何数据,并调用GetXMLData 方法来填充数据到XmlDocument。这个GetXMLData方法是这个指南中列出的条目中,最重要的一环。

在表格已被填充后,例程使用AutoSizeCol 方法来根据第一列的内容来调整列的宽度,之后Show 方法用来将需要显示的层级扩展到0、 1、 和 2。 之后例程将Redraw 属性设置回True 以便grid 开始重绘。

2. 这个 GetXMLData 例程是本教程中最有趣的一个。它贯穿整个XMLDocument 对象,并建立大纲的树形结构。将下面的代码添加到窗体中去:

• Visual Basic
Private Sub GetXMLData(ByVal node As System.Xml.XmlNode, ByVal level As
Integer)
' 跳过注释节点
If node.NodeType = System.Xml.XmlNodeType.Comment Then
Exit Sub
End If
' 为这一个节点添加一个新行
Dim row As Integer = C1FlexGrid1.Rows.Count
C1FlexGrid1.Rows.Add()
' 为这个新行添加数据
C1FlexGrid1(row, 0) = node.Name
If node.ChildNodes.Count = 1 Then
C1FlexGrid1(row, 1) = node.InnerText
C1FlexGrid1.SetCellStyle(row, 1, C1FlexGrid1.Styles("Data"))
End If
' 如果这个节点有"Name" 子节点的话,将它保存起来作为一个ToolTip提示使用。
If node.ChildNodes.Count > 0 Then
Dim ndName As System.Xml.XmlNode = node.SelectSingleNode("Name")
If Not (ndName Is Nothing) Then
C1FlexGrid1.Rows(row).UserData = ndName.InnerText
End If
End If
' 如果此节点有子节点,将它们都取出来
If node.ChildNodes.Count > 1 Then
' 将当前行作为节点
C1FlexGrid1.Rows(row).IsNode = True
C1FlexGrid1.Rows(row).Node.Level = level
' 使用递归来取得子节点
Dim child As System.Xml.XmlNode
For Each child In node.ChildNodes
GetXMLData(child, level + 1)
Next
End If
End Sub
• C#
private void GetXMLData(System.Xml.XmlNode node, int level)
{
//跳过注释节点
if ( node.NodeType == System.Xml.XmlNodeType.Comment )
{
return;
}
//为这一个节点添加一个新行
int row = c1FlexGrid1.Rows.Count;
c1FlexGrid1.Rows.Add();
//为这个新行添加数据
c1FlexGrid1[row, 0] = node.Name;
if ( node.ChildNodes.Count == 1 )
{
c1FlexGrid1[row, 1] = node.InnerText;
c1FlexGrid1.SetCellStyle(row, 1, c1FlexGrid1.Styles["Data"]);
}
//如果这个节点有"Name" 子节点的话,将它保存起来作为一个ToolTip提示使用。
if (node.ChildNodes.Count > 0)
{
System.Xml.XmlNode ndName = node.SelectSingleNode("Name");
if (ndName != null)
{
c1FlexGrid1.Rows[row].UserData = ndName.InnerText;
}
}
//如果此节点有子节点,将它们都取出来
if ( node.ChildNodes.Count > 1 )
{
//将当前行作为节点
c1FlexGrid1.Rows[row].IsNode = true;
c1FlexGrid1.Rows[row].Node.Level = level;
//使用递归来取得子节点
foreach (System.Xml.XmlNode child in node.ChildNodes)
GetXMLData(child, level + 1);
}
}
请遵守以下规定:

程序一开始跳过了XML注释节点,然后使用Rows.Add 来向表格中添加一个新行。

接下来,程序开始设置节点的名称并检查该节点是否拥有孩子节点。在这种情况下,该节点被解释为一个数据节点,之后将该节点的InnerText 属性复制到新行的第二列。代码还设置了当窗体被创建时,包含数据的单元格的样式为自定义的“Data”样式 。接下来的代码块检查看看是否这个节点包含一个名为“name”的子节点。如果有,那么“name”节点的内容会被分配到新行的UserData属性中去。这个值将会被用于实施工具提示,这样即使节点名称被折叠起来了,用户也能够看到。

最后,如果该节点有孩子节点, GetXMLData 程序会调用自身来递归添加他们到表格中。

运行程序,并遵守以下规定:

该项目可以加载XML并显示它们,用户可以点击折叠或者展开节点。

接下来的步骤中会添加一些改进,使得应用程序更加容易使用。