65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SQL Server 2000 数据库创建 Microsoft Tree View 控件的 XML

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.11/5 (11投票s)

2004 年 6 月 14 日

3分钟阅读

viewsIcon

90619

树用于分层显示数据,并允许您创建有效的用户界面,同时减少开发和维护时间。

Sample Image - SquaredRomiss.jpg

引言

树用于分层显示数据,并允许您创建有效的用户界面,同时减少开发和维护时间。您可以有效地将任何小部件添加到树中。滚动条会根据需要自动显示。

安装 Microsoft Web 控件

为了与 ASP.NET 结合使用,Microsoft 提供了一小组工具,称为 Internet Explorer Web 控件,其中包括 Multiage、选项卡式选项卡、工具栏和树视图控件。

首先,您必须点击这里获取“iewebcontrols.msi”文件。 当您在 Web 服务器上安装它(通过双击下载的文件)时,您将在默认 Web (webctrl_client) 上获得一个文件夹和一组组件 (Microsoft.Web.UI.WebControls)。 您还需要完成一步才能开始使用,即将对 Visual Studio 7.0 项目中的这个优秀控件套件添加引用。 只需转到“项目”-->“添加引用”,然后在“.NET”选项卡下查找名为“Microsoft IE Web 控件”的项目。

部署

首先,我们需要让我们的页面知道我们的新控件。 将以下代码行放在 .aspx 页面的 @Page 指令正下方 -

<%@ Import namespace="Microsoft.Web.UI.WebControls" %>
<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" 
                              Assembly ="Microsoft.Web.UI.WebControls"%>

要开始描述下面的示例 - 在 SQL 分析器中运行 SQL 脚本的查看器

Web.Config 文件中,您必须定义您自己的连接字符串 -

<appSettings>
    <add key="strConn" 
      value="workstation id='demo';packet size=4096;
             integrated security=SSPI;data source='demo\demo';
             persist security info=True;initial catalog=demo">
    </add>
</appSettings>
CREATE TABLE [XMLData] (
  [FuncId] [int] NOT NULL ,
  [FuncName] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
  [FuncLId] [int] NULL ,
  [FuncLevName] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
  [FuncLId1] [int] NULL ,
  [FuncLev1Name] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
  [FuncLId2] [int] NULL ,
  [FuncLev2Name] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
  [FuncLId3] [int] NULL ,
  [FuncLev3Name] [nvarchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
) ON [PRIMARY]
 
INSERT INTO XMLData (FuncId, FuncName, FuncLId, FuncLevName, 
       FuncLId1, FuncLev1Name, FuncLId2, FuncLev2Name, 
       FuncLId3, FuncLev3Name) VALUES(1, 'Production', 1, 
       Solution Architect, 1, Project Manager, 1, 
       Project Leader, 1, Programmer)
INSERT INTO XMLData (FuncId, FuncName, FuncLId, 
       FuncLevName, FuncLId1, FuncLev1Name, FuncLId2, 
       FuncLev2Name, FuncLId3, FuncLev3Name) VALUES 
       (1, Production, 1, Solution Architect, 1, 
       Project Manager, 1, Project Leader, 2, Designer)
INSERT INTO XMLData (FuncId, FuncName, FuncLId, FuncLevName, 
       FuncLId1, FuncLev1Name, FuncLId2, FuncLev2Name, 
       FuncLId3, FuncLev3Name) VALUES (2, Marketing & Sales, 2, 
       Business Development Manager, 2, Area Manager, 2, 
       Area Sales Manager, 3, Sales Man)
INSERT INTO XMLData (FuncId, FuncName, FuncLId, FuncLevName, 
       FuncLId1, FuncLev1Name, FuncLId2, FuncLev2Name, 
       FuncLId3, FuncLev3Name) VALUES (2, Marketing & Sales, 2, 
       Business Development Manager, 2, Area Manager, 2, 
       Area Sales Manager, 4, Sales Women)

如何将 XML 文件与 TreeView 控件绑定

<iewc:treeview id="tvwVenire" runat="server" 
                     AutoSelect="True" SelectExpands="True">
    <iewc:TreeNode TreeNodeSrc="xmlfile.xml" 
                          Text="DEMO TREE" Expanded="True"/>
</iewc:treeview>

工作原理

下面给出的过程从 SQL Server 中选取所选查询上的数据,并为 Microsoft 树控件生成 XML 文件。

XmlTextWriter 将命名空间声明提升到根元素,以避免在两个子元素上重复它。

此外,它确保 <?xml 声明首先出现,并且 <!DOCTYPE 节点在根元素之前出现。 它确保 xml:space 属性的值和格式正确,并确保其值根据可扩展标记语言 (XML) 1.0(第二版)建议是可以接受的。 最后,XmlTextWriter 检查何时将字符串用作参数,例如,Null==String.EmptyString.Empty,以及它是否遵循 W3C 规则。

您可以使用三个设置来更改文档的缩进方式。 首先,我们将使用 XmlTextWriter 类。 此类包含一组称为 FormattingIndentation 的属性。

使用 Formatting 属性来设置 XML 文档的缩进或确定它是否将被缩进。 分析器会自动将缩进嵌入到您的 XML 文档中,使其更易于在面向文本的查看器中查看。

XmlWriter 中的方法也成对出现; WriteStartDocumentWriteEndDocumentWriteStartElementWriteEndElement 以及 WriteStartAttributeWriteEndAttribute 方法对。 使用这些方法,您可以创建嵌套元素或属性。 XML 文档就是通过这些方法对构建的,并且它允许创建复杂的元素或属性而不会出错。

生成 XML 文件过程 (xmlfile.cs)

public class GenXML : System.Web.UI.Page
{
  private void btnSubmit_Click(object sender, System.EventArgs e)
  {
    string strConn = 
      System.Configuration.ConfigurationSettings.AppSettings ["strConn"];
    SqlConnection sqlconn = new SqlConnection(strConn);
    SqlCommand sqlcomm = new SqlCommand("SELECT * FROM XMLData",sqlconn);
    SqlDataReader dr;
    sqlconn.Open();

    //Read data into DataReader as dr
    dr=sqlcomm.ExecuteReader();
    string xmlDoc= Server.MapPath("..\\xmlfile.xml");
    XmlTextWriter writer = null;

    //Create instance of XmlTextWriter as a tool 
    //for writing our XML information
    writer = new XmlTextWriter(xmlDoc,Encoding.UTF8);

    // Indent the XML file to look nice
    writer.Formatting = Formatting.Indented;

    // Write the beginning header of our XML file along with a TREENODES tag
    writer.WriteStartDocument(true);
    writer.WriteStartElement("TREENODES");

    string lv,lv1,lv2,lv3,lv4;
    int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
    dr.Read();
    lv=dr["FuncId"].ToString();
    lv1=dr["FuncLId"].ToString();
    lv2=dr["FuncLId1"].ToString();
    lv3=dr["FuncLId2"].ToString();
    lv4=dr["FuncLId3"].ToString();

    do
    {
      if (lv4!=dr["FuncLId3"].ToString() && lv4.Length!=0)
      {
        // write end TREE attributes
        writer.WriteEndElement();
      }
      if (lv3!=dr["FuncLId2"].ToString() && lv3.Length!=0)
      {
        writer.WriteEndElement();
      }
      if (lv2!=dr["FuncLId1"].ToString() && lv2.Length!=0)
      {
        writer.WriteEndElement();
      }
      if (lv1!=dr["FuncLId"].ToString() && lv1.Length!=0)
      {
        writer.WriteEndElement();
      }
      if (lv!=dr["FuncId"].ToString()  && lv.Length!=0)
      {
        writer.WriteEndElement();
      }
      for (int i=1; i<6; i++)
      {
        if (i==1 && lv1!=null)
        {
          if (lv!=dr["FuncId"].ToString())
          {
            lv=dr["FuncId"].ToString();
            flag1=0;
          }
          if(flag1==0 && lv==dr["FuncId"].ToString() && lv.Length!=0)
          {
            // write TREE attributes TAG names
            writer.WriteStartElement("TreeNode");
            writer.WriteAttributeString ("Text",dr["FuncName"].ToString());
            flag1=1;
          }
        }
        else
        {
          if(i==2 && lv1!=null)
          {
            if (lv1!=dr["FuncLId"].ToString())
            {
              lv1=dr["FuncLId"].ToString();
              flag2=0;
            }
            if(flag2==0 && lv1==dr["FuncLId"].ToString() && lv1.Length!=0)
            {
              writer.WriteStartElement("TreeNode");
              writer.WriteAttributeString ("Text", 
                     dr["FuncLevName"].ToString());
              flag2=1;
            }
          }
          else
          {
            if(i==3 && lv2!=null)
            {
              if (lv2!=dr["FuncLId1"].ToString())
              {
                lv2=dr["FuncLId1"].ToString();
                flag3=0;
              }
              if(flag3==0 && lv2==dr["FuncLId1"].ToString() &&  lv2.Length!=0)
              {
                writer.WriteStartElement("TreeNode");
                writer.WriteAttributeString ("Text", 
                      dr["FuncLev1Name"].ToString());
                flag3=1;
              }
            }
            else
            {
              if(i==4 && lv3!=null)
              {
                if (lv3!=dr["FuncLId2"].ToString())
                {
                  lv3=dr["FuncLId2"].ToString();
                  flag4=0;
                }
                if(flag4==0 && lv3==dr["FuncLId2"].ToString() && lv3.Length!=0)
                {
                  writer.WriteStartElement("TreeNode");
                  writer.WriteAttributeString ("Text", 
                        dr["FuncLev2Name"].ToString());
                  flag4=1;
                }
              }
              else
              {
                if(i==5 && lv4!=null)
                {
                  if (lv4!=dr["FuncLId3"].ToString())
                  {
                    lv4=dr["FuncLId3"].ToString();
                    flag5=0;
                  }
                  if(flag5==0 && 
                     lv4==dr["FuncLId3"].ToString() 
                     && lv4.Length!=0)
                  {
                    writer.WriteStartElement("TreeNode");
                    writer.WriteAttributeString ("Text", 
                          dr["FuncLev3Name"].ToString());
                    flag5=1;
                  }
                }
              }
            }
          }
        }
      }
    }while (dr.Read());
    writer.WriteEndDocument();
    writer.Flush();
    writer.Close();
    dr.Close();
  }
}

XML 文件格式 (xmlfile.xml)

<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<TREENODES>
  <TreeNode Text="Production">
     <TreeNode Text="Solution Architect">
        <TreeNode Text="Project Manager">
          <TreeNode Text="Project Leader">
             <TreeNode Text="Programmer"/> 
             <TreeNode Text="Designer"/> 
          </TreeNode>
        </TreeNode>
      </TreeNode>
  </TreeNode>
  <TreeNode Text="Marketing & Sales">
     <TreeNode Text="Business Development Manager">
       <TreeNode Text="Area Manager">
         <TreeNode Text="Area Sales Manager">
           <TreeNode Text="Sales Man"/>
           <TreeNode Text="Sales Women"/>
         </TreeNode>
       </TreeNode>
     </TreeNode>
  </TreeNode>
</TREENODES>

基本控件

本文将使用的控件 –

<%@ import namespace="Microsoft.Web.UI.WebControls" %>
<%@ import Namespace="System.Web.UI.WebControls.WebControl" %>
<%@ import Namespace="System.Data.SqlClient" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.XML" %>
<%@ import Namespace="System.Text" %>
© . All rights reserved.