示例#1
0
        private void GroupTree_OnMoveContact(Users Friend, FriendGroup OldGroup)
        {
            FriendGroup NewGroup = cbNewGroup.SelectedItem as FriendGroup; //Lấy ra nhóm mới sẽ chuyển bạn bè tới

            int NewGroupID = 0;

            if (NewGroup == null || MoveNewGroupName != null) //Kiểm tra trường hợp nhóm chuyển tới (nhóm có sẵn) không có hoặc nhóm chuyển tới (nhóm mới) chưa được khai báo
            {
                if (MoveNewGroupName != null)                 //Nhóm mới đã khai báo thì thực hiện tạo nhóm mới trên CSDL
                {
                    if (!AddNewGroup(userId, MoveNewGroupName, ref NewGroupID))
                    {
                        MessageBox.Show("Thêm nhóm mới không thành công");
                    }
                }
            }

            //Thực hiện di chuyển bạn bè từ nhóm cũ tới nhóm mới. Nếu nhóm mới đã được khai báo thì di chuyển tới nhóm mới, ngược lại nếu sẽ chuyển tới nhóm có sẵn (đã chọn trước đó)
            MoveContact(userId, Friend.UserID, NewGroupID != 0 ? GetGroup(NewGroupID).GroupID : NewGroup.GroupID);

            //Di chuyển bạn bè sang nhóm mới trên cây dữ liệu. Thực hiện tương tự công việc của MoveContact
            GroupTree.MoveFriend(Friend, OldGroup, NewGroupID != 0 ? GetGroup(NewGroupID) : NewGroup);

            treeFriend.UpdateLayout();
        }
示例#2
0
        public override void Run(bool runChildren)
        {
            string group = string.Empty;

            if (GroupTree != null && this.Parent != null)
            {
                GroupTree.SetParent();
                group = RawlerBase.GetText(this.Parent.Text, GroupTree, this);
            }
            else
            {
                if (GroupName != null)
                {
                    group = GroupName;
                }
            }
            int num = 1;

            if (AddNumTree != null && this.Parent != null)
            {
                int.TryParse(RawlerBase.GetText(this.Parent.Text, AddNumTree, this), out num);
            }

            var c = this.GetAncestorRawler().Where(n => n is CountData);

            if (c.Count() > 0)
            {
                ((CountData)c.First()).AddCount(group, GetText(), num);
            }
            else
            {
                ReportManage.ErrReport(this, "上流にCountDataがありません");
            }
            base.Run(runChildren);
        }
示例#3
0
        private void GroupTree_OnRemoveContact(Users Friend, FriendGroup OldGroup)
        {
            RemoveContact(userId, Friend.UserID);
            GroupTree.RemoveFriend(Friend, OldGroup);

            treeFriend.UpdateLayout();
        }
示例#4
0
        /// <summary>
        /// Thực hiện thao tác xóa nhóm (Được gọi bởi module RemoveGroup
        /// </summary>
        /// <param name="RemoveContact">Trạng thái xóa bạn bè hay không</param>
        /// <param name="GroupToRemove">Đối tượng chứa thông tin nhóm sẽ xóa</param>
        /// <param name="GroupMoveTo">Đối tượng chứa thông tin nhóm sẽ chuyển bạn bè tới (Mặc định Null)</param>
        public void DoRemoveGroup(bool RemoveContact, FriendGroup GroupToRemove, FriendGroup GroupMoveTo = null)
        {
            //Trường hợp nhóm bị xóa có bạn bè và người dùng muốn xóa bạn bè trong nhóm thì...
            if (GroupToRemove.Friends.Count > 0 && RemoveContact)
            {
                RemoveGroup(GroupToRemove.GroupID, RemoveContact); //Xóa nhóm và tất cả bạn bè trong nhóm
                GroupTree.RemoveGroup(GroupToRemove);              //Xóa nhóm trong cây dữ liệu
                treeFriend.UpdateLayout();
                removeGroupWin.Close();

                return;
            }
            else if (GroupToRemove.Friends.Count == 0)     //Trường hợp nhóm bị xóa không có bạn bè thì..
            {
                RemoveGroup(GroupToRemove.GroupID, false); //Xóa nhóm (Ko thực hiện thao tác xóa bạn bè)
                GroupTree.RemoveGroup(GroupToRemove);      //Xóa nhóm trong cây dữ liệu
                treeFriend.UpdateLayout();
                removeGroupWin.Close();

                return;
            }

            //Trường hợp di chuyển bạn bè tới nhóm mới trước khi xóa
            //Duyệt qua tất cả bạn bè có trong nhóm cần xóa
            foreach (Users child in GroupToRemove.Friends)
            {
                MoveContact(userId, child.UserID, GroupMoveTo.GroupID);  //Chuyển bạn bè sang nhóm mới (Cập nhập trên CSDL)
                GroupTree.MoveFriend(child, GroupToRemove, GroupMoveTo); //Chuyển bạn bè sang nhóm mới trong cây dữ liệu
            }

            GroupTree.RemoveGroup(GroupToRemove); //Xóa nhóm được chỉ định

            treeFriend.UpdateLayout();
            removeGroupWin.Close();
        }
示例#5
0
        private void RequestVM_OnAcceptRequest(Users Friend)
        {
            FriendGroup AvailableGroup = cbRequestGroup.SelectedItem as FriendGroup; //Lấy nhóm có sẵn đã được chọn trên Combobox

            int NewGroupID = 0;

            if (RequestNewGroupName != null)
            {
                if (!AddNewGroup(userId, RequestNewGroupName, ref NewGroupID))
                {
                    MessageBox.Show("Thêm nhóm mới không thành công");
                }
            }
            else if (AvailableGroup == null && RequestNewGroupName == null)
            {
                MessageBox.Show("Không tồn tại nhóm có sẵn cũng như thông tin nhóm mới không hợp lệ nên không thể 'chấp nhận' yêu cầu kết bạn");
                return;
            }

            FriendGroup newGroup = GetGroup(NewGroupID);

            //Chấp nhận yêu cầu kết bạn và thêm bạn bè vào nhóm mới nếu thông tin không bỏ trống, ngược lại sẽ thêm vào nhóm sẵn có
            AcceptRequest(userId, Friend.UserID, NewGroupID != 0 ? newGroup.GroupID : AvailableGroup.GroupID);

            //Bổ sung bạn bè cây dữ liệu
            GroupTree.AppendFriend(Friend, NewGroupID != 0 ? newGroup : AvailableGroup);

            RequestVM.RemoveRequest(Friend); //Xóa yêu cầu sau khi chấp nhận

            friendRequestZone.UpdateLayout();
            treeFriend.UpdateLayout();
        }
示例#6
0
        private GroupTree GetTreeItem(string id, string name, string code, string parentID, string type, string formCode = "")
        {
            var groupLevel = new GroupTree();

            groupLevel.ID       = id;
            groupLevel.Name     = name;
            groupLevel.Code     = code;
            groupLevel.ParentID = parentID;
            groupLevel.Type     = type;
            groupLevel.FormCode = formCode;
            return(groupLevel);
        }
示例#7
0
    public static GroupTree GetGroupsTree(String OrgID)
    {
        GroupTree groupTree = new GroupTree();
        try
        {
            string connectionString = ConfigurationManager.AppSettings["fleetnetbaseConnectionString"];
            DataBlock dataBlock = new DataBlock(connectionString, ConfigurationManager.AppSettings["language"]);
            int orgId = Convert.ToInt32(OrgID);
            dataBlock.OpenConnection();
            String name = dataBlock.organizationTable.GetOrganizationName(orgId);

            groupTree.OrgName = name;

            TreeGroup gr = new TreeGroup();
            gr.GroupName = "Водители";
            List<int> groupIds = dataBlock.cardsTable.GetAllGroupIds(orgId, dataBlock.cardsTable.driversCardTypeId);
            foreach (int grId in groupIds)
            {
                if (dataBlock.cardsTable.GetGroupCardTypeById(grId) != 0)
                {
                    String name1 = dataBlock.cardsTable.GetGroupNameById(grId);
                    gr.addValue(grId.ToString(), name1);
                }
            }
            gr.GroupId = 1;
            groupTree.addGroup(gr);

            gr = new TreeGroup();
            gr.GroupName = "Транспортные средства";
            gr.GroupId = 2;
            groupIds = dataBlock.cardsTable.GetAllGroupIds(orgId, dataBlock.cardsTable.vehicleCardTypeId);
            foreach (int grId in groupIds)
            {
                if (dataBlock.cardsTable.GetGroupCardTypeById(grId) != 0)
                {
                    String name1 = dataBlock.cardsTable.GetGroupNameById(grId);
                    gr.addValue(grId.ToString(), name1);
                }
            }
            groupTree.addGroup(gr);

            dataBlock.CloseConnection();
            return groupTree;
        }
        catch (Exception ex)
        {
            throw ex;
            //return null;
        }
    }
示例#8
0
 private void RenderGroups()
 {
     GroupTree.Nodes.Clear();
     foreach (var group in ActiveUpgrades.Groups)
     {
         var node = new TreeNode(group.Name);
         foreach (var target in group.Tuning)
         {
             var child = new TreeNode(TuningEntries.FirstOrDefault(x => x.Identifier == target)?.ToString() ?? target);
             node.Nodes.Add(child);
         }
         GroupTree.Nodes.Add(node);
     }
     GroupTree.ExpandAll();
 }
示例#9
0
 /// <summary>
 /// 如果组不存在则添加组
 /// </summary>
 /// <param name="name"></param>
 private void AddGroupIfnExist(string name)
 {
     if (!serverSubcribes.ContainsKey(name))
     {
         serverSubcribes.Add(name, new List <ServerSubscribe>());
         GroupTree.Invoke(new Action(() =>
         {
             GroupTree.Nodes["ShadowsocksR"].Nodes.Add(name, name);
         }));
     }
     if (!nodeConfigs.ContainsKey(name))
     {
         nodeConfigs.Add(name, new List <NodeConfig>());
     }
 }
 private bool IsUserInGroupTree(UserInfo user, GroupTree groupTree)
 {
     if (_Groups.ContainsKey(groupTree.Groupname))
     {
         GroupInfo group = _Groups[groupTree.Groupname];
         if (user.Groupnames.Contains(group.Group.Groupname))
         {
             //User belongs to group
             if (!group.Group.Usernames.Contains(user.User.Username))
             {
                 group.Group.Usernames.Add(user.User.Username);
             }
             return true;
         }
         foreach (GroupTree g in groupTree.SubGroups)
         {
             return IsUserInGroupTree(user, g);
         }
     }
     return false;
 }
 private void ExtractUsers(GroupTree groupTree, List<string> users)
 {
     foreach (UserInfo user in _Users.Values)
     {
         if (IsUserInGroupTree(user, groupTree))
         {
             users.Add(user.User.Username);
         }
     }
 }
示例#12
0
 /// <summary>
 /// Thay đổi trạng thái online/offline của bạn bè (Thực thi bởi MainWindowListener)
 /// </summary>
 /// <param name="Username">Tên tài khoản</param>
 /// <param name="IsOnline">Trạng thái</param>
 public void SetFriendStatus(String Username, bool IsOnline)
 {
     GroupTree.SetFriendStatus(Username, IsOnline);
 }
示例#13
0
        public DataSet GenerateSQL(Guid DataViewListID, out MetricTrac.Bll.DataViewList.Extend dv, out List <MasterGroup> MasterGroupList)
        {
            MasterGroupList = new List <MasterGroup>();
            dv = MetricTrac.Bll.DataViewList.Get(DataViewListID);
            string sql = SqlSelet.Replace("@InstanceId", "'" + dv.InstanceId.ToString() + "'");

            List <string> TotalOrderBy = new List <string>();
            List <string> TotalSelect  = new List <string>();

            List <ReferenceEntity.UseField> MasterGroupByFieldList = GetGroupByFieldList(ref sql, TotalOrderBy, TotalSelect, dv.GroupByList);
            List <ReferenceEntity.UseField> MasterSelectFieldList  = GetSelectFieldList(ref sql, TotalOrderBy, TotalSelect, dv.SelectList);

            List <ReferenceEntity.UseField> SlaveGroupByFieldList = GetGroupByFieldList(ref sql, TotalOrderBy, TotalSelect, dv.GroupBySlaveList);
            List <ReferenceEntity.UseField> SlaveSelectFieldList  = GetSelectFieldList(ref sql, TotalOrderBy, TotalSelect, dv.SelectSlaveList);

            if (MasterSelectFieldList.Count == 0 && SlaveSelectFieldList.Count == 0)
            {
                return(null);
            }

            DataSet                ds = MetricTrac.Bll.LinqMicajahDataContext.Execute(sql);
            DataTable              dt = ds.Tables[0];
            List <string>          PrevMasterGroupValue = new List <string>();
            List <MasterGroupNode> PrevMasterGroupNode  = new List <MasterGroupNode>();

            for (int i = 0; i < MasterGroupByFieldList.Count + SlaveGroupByFieldList.Count; i++)
            {
                PrevMasterGroupValue.Add(null);
                PrevMasterGroupNode.Add(null);
            }
            MasterGroup  mg = null;
            MasterRecord mr = null;
            MasterHeader mh = null;

            foreach (DataRow r in dt.Rows)
            {
                string OrgLocationRootColumnName = "en_FullName";
                if (dt.Columns.Contains(OrgLocationRootColumnName))
                {
                    object o = r[OrgLocationRootColumnName];
                    if (o is string && ((string)o) == "Organization Location")
                    {
                        r[OrgLocationRootColumnName] = MetricTrac.Bll.LinqMicajahDataContext.OrganizationName;
                    }
                }

                //Fill Master Group
                bool   isNewMasterGroup = false;
                string alias;
                string GroupValue;
                List <MasterGroupNode> GroupTree = null;

                for (int i = 0; i < MasterGroupByFieldList.Count; i++)
                {
                    alias      = GetAlias(MasterGroupByFieldList[i]);
                    GroupValue = r[alias].ToString();
                    if (PrevMasterGroupValue[i] != GroupValue && !isNewMasterGroup)
                    {
                        GroupTree        = new List <MasterGroupNode>();
                        isNewMasterGroup = true;
                        for (int k = 0; k < i; k++)
                        {
                            PrevMasterGroupNode[k].HeaderCount++;
                        }
                    }
                    PrevMasterGroupValue[i] = GroupValue;

                    string GroupHeader = MasterGroupByFieldList[i].Entity.ReadableName;
                    if (MasterGroupByFieldList[i].ReadableName != "Name")
                    {
                        GroupHeader += " " + MasterGroupByFieldList[i].ReadableName;
                    }

                    if (isNewMasterGroup)
                    {
                        MasterGroupNode n = new MasterGroupNode()
                        {
                            Header      = GroupHeader,
                            Value       = GroupValue,
                            HeaderCount = 1
                        };
                        GroupTree.Add(n);

                        for (int k = 0; k < i; k++)
                        {
                            PrevMasterGroupNode[k].SubGroupCount++;
                        }
                        PrevMasterGroupNode[i] = n;
                    }
                }
                if (isNewMasterGroup)
                {
                    mg = new MasterGroup()
                    {
                        GroupTree = GroupTree,

                        MasterHeaderList = new List <MasterHeader>(),
                        MasterRecordList = new List <MasterRecord>(),
                        SlaveGroupList   = new List <SlaveGroup>()
                    };
                    MasterGroupList.Add(mg);

                    foreach (var s in MasterSelectFieldList)
                    {
                        mh = new MasterHeader()
                        {
                            Header = s.Entity.ReadableName + (s.ReadableName == "Name" ? "" : (" " + s.ReadableName))
                        };
                        mg.MasterHeaderList.Add(mh);
                    }
                }

                //Fill Master Record
                bool         isNewMasterRecord = isNewMasterGroup;
                MasterRecord PrevMasterRecord  = mg.MasterRecordList.Count == 0 ? null : mg.MasterRecordList[mg.MasterRecordList.Count - 1];
                mr = new MasterRecord()
                {
                    MasterValueList = new List <MasterValue>(),
                    SlaveRecordList = new List <SlaveRecord>()
                };

                for (int i = 0; i < MasterSelectFieldList.Count; i++)
                {
                    var         s  = MasterSelectFieldList[i];
                    MasterValue mv = new MasterValue()
                    {
                        Value = GetValue(s, r)// r[GetAlias(s)].ToString()
                    };
                    mr.MasterValueList.Add(mv);
                    if (PrevMasterRecord == null || mv.Value != PrevMasterRecord.MasterValueList[i].Value)
                    {
                        isNewMasterRecord = true;
                    }
                }
                if (isNewMasterRecord)
                {
                    mg.MasterRecordList.Add(mr);
                    for (int k = 0; k < MasterGroupByFieldList.Count; k++)
                    {
                        PrevMasterGroupNode[k].RecordCount++;
                    }
                }
                else
                {
                    mr = mg.MasterRecordList[mg.MasterRecordList.Count - 1];
                }

                //Fill Slave Group
                if (mg.MasterRecordList.Count == 1)
                {
                    for (int i = 0; i < SlaveGroupByFieldList.Count; i++)
                    {
                        var        sg = SlaveGroupByFieldList[i];
                        SlaveGroup g  = new SlaveGroup()
                        {
                            Group = r[GetAlias(sg)].ToString()
                        };
                        mg.SlaveGroupList.Add(g);
                    }
                }


                //Fill Slave Records
                SlaveRecord sr = new SlaveRecord()
                {
                    SlaveValueList = new List <SlaveValue>()
                };
                mr.SlaveRecordList.Add(sr);
                for (int i = 0; i < SlaveSelectFieldList.Count; i++)
                {
                    var column = SlaveSelectFieldList[i];
                    //object v = r[GetAlias(column)];
                    SlaveValue sv = new SlaveValue()
                    {
                        Value = GetValue(column, r)//v == null ? null : v.ToString()
                    };
                    sr.SlaveValueList.Add(sv);
                }
            }

            /*for (int i = 0; i < MasterGroupList.Count; i++)
             * {
             *  var MG = MasterGroupList[i];
             *
             *  for (int k = i + 1; k < MasterGroupList.Count; k++)
             *  {
             *      if (MG.GroupTree.Count <= ChildMG.GroupTree.Count) break;
             *  }
             * }*/


            return(ds);
        }
示例#14
0
    public static GroupTree GetOverlookVehiclesTree(String OrgID)
    {
        GroupTree vehTree = new GroupTree();
        try
        {
            string connectionString = ConfigurationManager.AppSettings["fleetnetbaseConnectionString"];
            DataBlock dataBlock = new DataBlock(connectionString, ConfigurationManager.AppSettings["language"]);
            int orgId = Convert.ToInt32(OrgID);
            dataBlock.OpenConnection();
            String name = dataBlock.organizationTable.GetOrganizationName(orgId);

            vehTree.OrgName = name;

            List<int> groupIds = dataBlock.cardsTable.GetAllGroupIds(orgId, dataBlock.cardsTable.vehicleCardTypeId);
            for (int i = 0; i < groupIds.Count; i++)
            {
                TreeGroup gr = new TreeGroup();
                string grName = dataBlock.cardsTable.GetGroupNameById(groupIds[i]);
                gr.GroupName = grName;
                gr.GroupId = groupIds[i];
                List<int> values = dataBlock.cardsTable.GetAllCardIdsByGroupId(orgId, dataBlock.cardsTable.vehicleCardTypeId, groupIds[i]);

                for (int j = 0; j < values.Count; j++)
                {
                    String veh_name = dataBlock.cardsTable.GetCardHolderNameByCardId(values[j]);
                    gr.addValue(values[j].ToString(), veh_name);
                }
                vehTree.addGroup(gr);
            }
            dataBlock.CloseConnection();
        }
        catch (Exception ex)
        {
            throw ex;
            //return null;
        }
        return vehTree;
    }
示例#15
0
        /// <summary>
        /// GroupTree 事件注册
        /// </summary>
        private void GroupTreeEventRegist()
        {
            // GroupTree
            // 鼠标按下选择
            GroupTree.MouseDown += new MouseEventHandler((sender, e) =>
            {
                GroupTree.SelectedNode = GroupTree.GetNodeAt(e.X, e.Y);
            });
            // 刷新列表
            GroupTree.AfterSelect += new TreeViewEventHandler((sender, e) =>
            {
                NodeList.Items.Clear();
                SubsList.Items.Clear();
                foreach (var nodeConfig in GetAllNodeConfigs(GroupTree.SelectedNode))
                {
                    if (nodeConfig.Tag != null)
                    {
                        NodeList.Items.Add((ListViewItem)nodeConfig.Tag);
                    }
                }
                foreach (var serverSubscribe in GetAllServerSubscribes(GroupTree.SelectedNode))
                {
                    if (serverSubscribe.Tag != null)
                    {
                        SubsList.Items.Add((ListViewItem)serverSubscribe.Tag);
                    }
                }
            });
            // TreeMenu
            // 菜单打开
            TreeMenu.Opening += new CancelEventHandler((sender, e) =>
            {
                if (GroupTree.SelectedNode != null)
                {
                    TreeMenu_SelectNode.Text = GroupTree.SelectedNode.Text;
                    TreeMenu_SelectNode.Tag  = GroupTree.SelectedNode;
                }
                else
                {
                    e.Cancel = true;
                }
            });
            // 保存订阅与节点
            TreeMenu_Save.Click += new EventHandler((sender, e) =>
            {
                GuiConfig guiConfig        = new GuiConfig();
                guiConfig.configs          = GetAllNodeConfigs((TreeNode)TreeMenu_SelectNode.Tag);
                guiConfig.serverSubscribes = GetAllServerSubscribes((TreeNode)TreeMenu_SelectNode.Tag);

                SaveJsonDialog("ShadowsocksR GUI Config|*.json", "保存 ShadowsocksR 配置文件", "gui-config.json", guiConfig);
            });
            // 仅保存节点
            TreeMenu_SaveNode.Click += new EventHandler((sender, e) =>
            {
                GuiConfig guiConfig = new GuiConfig();
                guiConfig.configs   = GetAllNodeConfigs((TreeNode)TreeMenu_SelectNode.Tag);

                SaveJsonDialog("ShadowsocksR GUI Config|*.json", "保存 ShadowsocksR 配置文件", "gui-config.json", guiConfig);
            });
            // 仅保存订阅
            TreeMenu_SaveSubs.Click += new EventHandler((sender, e) =>
            {
                GuiConfig guiConfig        = new GuiConfig();
                guiConfig.serverSubscribes = GetAllServerSubscribes((TreeNode)TreeMenu_SelectNode.Tag);

                SaveJsonDialog("ShadowsocksR GUI Config|*.json", "保存 ShadowsocksR 配置文件", "gui-config.json", guiConfig);
            });
            // 复制节点链接
            TreeMenu_CopyNode.Click += new EventHandler((sender, e) =>
            {
                var nodeConfigs = GetAllNodeConfigs((TreeNode)TreeMenu_SelectNode.Tag);
                string ssrUrls  = string.Empty;
                foreach (var nodeConfig in nodeConfigs)
                {
                    ssrUrls += Server.GetSSRLinkForServer(nodeConfig) + "\r\n";
                }
                if (!string.IsNullOrEmpty(ssrUrls))
                {
                    Clipboard.SetText(ssrUrls);
                }
            });
            // 复制订阅地址
            TreeMenu_CopySubs.Click += new EventHandler((sender, e) =>
            {
                var serverSubscribes = GetAllServerSubscribes((TreeNode)TreeMenu_SelectNode.Tag);
                string subsUrls      = string.Empty;
                foreach (var serverSubscribe in serverSubscribes)
                {
                    subsUrls += serverSubscribe.URL + "\r\n";
                }
                if (!string.IsNullOrEmpty(subsUrls))
                {
                    Clipboard.SetText(subsUrls);
                }
            });
            // Ping测试
            TreeMenu_TestPing.Click += new EventHandler(async(sender, e) =>
            {
                foreach (var nodeConfig in GetAllNodeConfigs((TreeNode)TreeMenu_SelectNode.Tag))
                {
                    var item = (ListViewItem)nodeConfig.Tag;
                    if (nodeConfig.ping == -2)
                    {
                        // 在测试中,跳过
                        continue;
                    }
                    // Ping
                    nodeConfig.ping = -2;
                    item.SubItems[item.SubItems.Count - 1 - 1].Text = "测试中";

                    nodeConfig.ping = await GetPingAsync(nodeConfig.server);
                    if (nodeConfig.ping == -3)
                    {
                        item.SubItems[item.SubItems.Count - 1 - 1].Text = "失败";
                    }
                    if (nodeConfig.ping >= 0)
                    {
                        item.SubItems[item.SubItems.Count - 1 - 1].Text = nodeConfig.ping.ToString();
                    }
                }
            });
            // Geo测试
            TreeMenu_TestGeo.Click += new EventHandler(async(sender, e) =>
            {
                foreach (var nodeConfig in GetAllNodeConfigs((TreeNode)TreeMenu_SelectNode.Tag))
                {
                    var item = (ListViewItem)nodeConfig.Tag;
                    if (nodeConfig.country != string.Empty)
                    {
                        // 跳过
                        continue;
                    }
                    item.SubItems[item.SubItems.Count - 1].Text = "测试中";

                    var geoIP = await GetGeoIPAsync(nodeConfig.server);
                    if (geoIP == null)
                    {
                        item.SubItems[item.SubItems.Count - 1].Text = "失败";
                        nodeConfig.country = "失败";
                        continue;
                    }
                    nodeConfig.country = geoIP.country;
                    item.SubItems[item.SubItems.Count - 1].Text = geoIP.country;
                }
            });
        }