سؤال

وكيف يمكن للمرء أن تكرار بسهولة من خلال جميع العقد في تريفيف، فحص ممتلكاتهم .Checked ثم قم بحذف كافة العقد فحص؟

ويبدو واضحا، إلا أنك لا يفترض لتعديل مجموعة من خلاله تقوم بالتكرار، والقضاء على إمكانية حلقة "foreach". (الدعوة .Nodes.Remove يتم تعديل المجموعة.) إذا حاول ذلك، وأثر هو أن حوالي نصف العقد .Checked تتم إزالتها.

وحتى إذا كان للمرء أن استخدام مرورين: أولا إنشاء قائمة من المؤشرات مؤقتة، ومن ثم إزالة من مؤشر على مرور الثاني - أن المؤشرات تتغير عند كل زوال، invaliding سلامة قائمة المؤشر.

وهكذا، ما هي الطريقة الأكثر فعالية للقيام بذلك؟

وهنا مثال من التعليمات البرمجية التي تبدو جيدة، ولكن في الواقع يزيل فقط ما يقرب من نصف العقد .Checked:.

            foreach (TreeNode parent in treeView.Nodes)
            {
                if (parent.Checked)
                {
                    treeView.Nodes.Remove(parent);
                }
                else
                {
                    foreach (TreeNode child in parent.Nodes)
                    {
                        if (child.Checked) parent.Nodes.Remove(child);
                    }
                }
            }

و(نعم، والقصد من ذلك هو فقط لعقد تقليم من الشجرة التي هي مستويين عميق).

هل كانت مفيدة؟

المحلول

وهذا من شأنه إزالة العقد بعد تعداد لهم، ويمكن استخدامها بشكل متكرر لن طبقات من العقد.

void RemoveCheckedNodes(TreeNodeCollection nodes)
{
    List<TreeNode> checkedNodes = new List<TreeNode>();

    foreach (TreeNode node in nodes)
    {
        if (node.Checked)
        {
            checkedNodes.Add(node);
        }
        else
        {
            RemoveCheckedNodes(nodes.ChildNodes);
        }
    }

    foreach (TreeNode checkedNode in checkedNodes)
    {
        nodes.Remove(checkedNode);
    }
}

نصائح أخرى

وحاول المشي من خلال عقد الى الوراء. بهذه الطريقة الفهرس الخاص بك لا يزيد حجم الماضي عقدة الخاص بك:

for( int ndx = nodes.Count; ndx > 0; ndx--)
{
  TreeNode node = nodes[ndx-1];
  if (node.Checked)
  {
     nodes.Remove(node);
  }
   // Recurse through the child nodes...
}

إذا كنت تريد أن تفعل ذلك بكفاءة تحتاج إلى تتبع العقد محددا كما فحصت هم. تخزين العقد شجرة فحص في قائمة (وإزالتها كما هي دون رادع).

إذا كان لديك مفتاح فريد والكثير من العقد لتتبع قد تفكر في قاموس كذلك. ولكن إذا كنت تتعامل فقط مع 10-50 وربما لن تحدث فرقا كبيرا.

وبعد ذلك، بدلا من حلقات من خلال الشجرة بأكملها كنت مجرد حلقة من خلال لديك قائمة (أصغر) من العقد.

وبينما بالتكرار هل يمكن إنشاء قائمة جديدة من البنود دون رادع ومن ثم إعادة ربط تريفيف إلى أن القائمة الجديدة (التخلص من القديم).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top