public override void SaveXmlByName()
        {
            List <SystemStruLink> savedLinks = new List <SystemStruLink>(); //已经存入的连接
            string xmlPath = string.Format(@"{0}\{1}.xml", PathManager.GetSysPath(), this.Name);

            //先判断一些文件是否存在
            if (!PathManager.CheckFile(xmlPath))
            {
                return;
            }
            //保存XML文件
            XDocument xd = new XDocument(
                new XElement("SystemStru",
                             new XAttribute("Name", this.Name),
                             new XAttribute("Type", this.Type),
                             new XAttribute("CntsNum", this.CntsNum),
                             new XElement("CntNames"),
                             new XElement("Links")
                             )
                );
            XElement rt = xd.Element("SystemStru"); //xml文件根节点

            //录入机箱集合
            XElement Cnts = rt.Element("CntNames"); //机箱名根节点

            for (int i = 0; i < CntNames.Length; i++)
            {
                Cnts.Add(new XElement("Container",
                                      new XAttribute("CntSn", i.ToString()),
                                      new XAttribute("CntName", CntNames[i].ToString())));
            }

            //录入连接集合
            XElement links = rt.Element("Links");   //连接根节点

            foreach (var linkList in this.LinksArray)
            {
                if (linkList == null)
                {
                    continue;
                }
                foreach (var link in linkList)
                {
                    int equalNum = savedLinks.Where(lnk => SystemStruLink.IsEqual(link, lnk)).Count();
                    if (equalNum == 0)//该条连接的等效连接没有被访问过
                    {
                        links.Add(new XElement("Link",
                                               new XAttribute("FirstEndId", link.FirstEndId.ToString()),
                                               new XAttribute("FirstEndPos", link.FirstEndPostion.ToString()),
                                               new XAttribute("SecondEndId", link.SecondEndId.ToString()),
                                               new XAttribute("SecondEndPos", link.SecondEndPostion.ToString()),
                                               new XAttribute("Type", link.LinkType.ToString()),
                                               new XAttribute("DataWidth", link.LanesNum.ToString())
                                               ));
                        savedLinks.Add(link);
                    }
                }
            }
            xd.Save(xmlPath);
        }
        //利用界面填入的信息来刷新一个SystemStru
        private void ReFreshSys(SystemStru sys)
        {
            //刷新基本信息
            sys.Name = _typeTb.Text;
            sys.Type = _typeTb.Text;

            //刷新机箱信息
            foreach (DataGridViewRow row in _consDgv.Rows)
            {
                var cntSn   = int.Parse((string)row.Cells[0].Value); //机箱序号
                var cntName = (string)row.Cells[1].Value;            //机箱的名字
                sys.CntNames[cntSn] = cntName;
            }

            //刷新机箱连接信息
            for (int i = 0; i < _dgvsOpt.DataGridViweList.Count; i++)
            {
                var curDgv   = _dgvsOpt.DataGridViweList[i];
                var linkList = new List <SystemStruLink>();//连接集合
                foreach (DataGridViewRow row in curDgv.Rows)
                {
                    var sysLink = new SystemStruLink(
                        int.Parse((string)row.Cells[_dgvColumnTitle_end1CntNum].Value),
                        int.Parse((string)row.Cells[_dgvColumnTitle_end1PosNum].Value),
                        int.Parse((string)row.Cells[_dgvColumnTitle_end2CntNum].Value),
                        int.Parse((string)row.Cells[_dgvColumnTitle_end2PosNum].Value),
                        (LinkType)Enum.Parse(typeof(LinkType), (string)row.Cells[_dgvColumnTitle_linkType].Value),
                        (LinkLanes)Enum.Parse(typeof(LinkLanes), (string)row.Cells[_dgvColumnTitle_dataWidth].Value));
                    linkList.Add(sysLink);
                }
                sys.LinksArray[i] = linkList;
            }
        }
        public override ModelBase CreateObjectByName(string objectName)
        {
            SystemStru sys;
            string     xmlPath = string.Format(@"{0}\{1}.xml", PathManager.GetSysPath(), objectName);

            if (!File.Exists(xmlPath))
            {
                MessageBox.Show("CreateObject_SystemStru:没有该SystemStru对应的XML文件!");
                return(null);
            }

            XDocument xd = XDocument.Load(xmlPath);
            //根元素的Attribute
            XElement rt      = xd.Element("SystemStru");
            int      cntsNum = int.Parse(rt.Attribute("CntsNum").Value);

            sys      = new SystemStru(cntsNum);
            sys.Name = rt.Attribute("Name").Value;
            sys.Type = rt.Attribute("Type").Value;

            //取CntNames的值赋值到CntsName
            XElement cntNames = rt.Element("CntNames");

            foreach (var e in cntNames.Elements())
            {
                int    cntSn   = int.Parse(e.Attribute("CntSn").Value);
                string cntName = e.Attribute("CntName").Value;
                sys.CntNames[cntSn] = cntName;
            }

            //取links赋值到backPlane.linkDir
            XElement links = rt.Element("Links");

            for (int i = 0; i < cntsNum; i++)
            {
                List <SystemStruLink> linksList = new List <SystemStruLink>();
                //找到同一槽位的links,然后添加到list
                var slotLinks = from link in links.Elements()
                                where int.Parse(link.Attribute("FirstEndId").Value) == i
                                select link;
                foreach (var link in slotLinks)
                {
                    LinkType  type    = (LinkType)Enum.Parse(typeof(LinkType), link.Attribute("Type").Value);
                    LinkLanes laneNum = (LinkLanes)Enum.Parse(typeof(LinkLanes), link.Attribute("DataWidth").Value);

                    var tempLink = new SystemStruLink(i
                                                      , int.Parse(link.Attribute("FirstEndPos").Value)
                                                      , int.Parse(link.Attribute("SecondEndId").Value)
                                                      , int.Parse(link.Attribute("SecondEndPos").Value)
                                                      , type
                                                      , laneNum);
                    linksList.Add(tempLink);
                }
                sys.LinksArray[i] = linksList;
            }
            return(sys);
        }