أفضل طريقة للتحقق من صحة عمليات السحب/الإفلات من أجل TreeView في C#

StackOverflow https://stackoverflow.com/questions/91127

سؤال

أريد للتحقق من سحب وإسقاط العملية هو مسموح به.صالح البند يمكن أن تأتي من واحدة من "الضوابط" ، أو داخليا من داخل مخصصة treeview.حاليا لدي هذا:

bool CanDrop(DragEventArgs e)
{
    bool allow = false;
    Point point = tree.PointToClient(new Point(e.X, e.Y));
    TreeNode target = tree.GetNodeAt(point);
    if (target != null)
    {
        if (CanWrite(target)) //user permissions
        {
            if (e.Data.GetData(typeof(DataInfoObject)) != null) //from internal application
            {
                DataInfoObject info = (DataInfoObject)e.Data.GetData(typeof(DataInfoObject));
                DragDataCollection data = info.GetData(typeof(DragDataCollection)) as DragDataCollection;
                if (data != null)
                {
                    allow = true;
                }
            }
            else if (tree.SelectedNode.Tag.GetType() != typeof(TreeRow)) //node belongs to this & not a root node
            {
                if (TargetExistsInNode(tree.SelectedNode, target) == false)
                {
                    if (e.Effect == DragDropEffects.Copy)
                    {
                        allow = true;
                    }
                    else if (e.Effect == DragDropEffects.Move)
                    {
                        allow = true;
                    }
                }
            }
        }
    }
    return allow;
}

لقد انتقلت جميع التحقق من التعليمات البرمجية إلى هذا الأسلوب في محاولة تحسين الأشياء, لكن بالنسبة لي هذا لا يزال الرهيبة!

الكثير من المنطق والكثير من ذلك أن تفعل الأشياء التي أتوقع treeview أن تفعل نفسها (على سبيل المثال."TargetExistsInNode" التحقق من ما إذا كان سحب عقدة الانجرار إلى واحد من الأطفال).

ما هي أفضل طريقة للتحقق من صحة المدخلات إلى السيطرة ؟

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

المحلول

يمكنني استخدام TreeNode.الوسم الملكية إلى متجر صغير "تحكم" الأجسام التي تشكل المنطق.E. g.:

class TreeNodeController {
  Entity data; 

  virtual bool IsReadOnly { get; }
  virtual bool CanDrop(TreeNodeController source, DragDropEffects effect);
  virtual bool CanDrop(DataInfoObject info, DragDropEffects effect);
  virtual bool CanRename();
}

class ParentNodeController : TreeNodeController {
  override bool IsReadOnly { get { return data.IsReadOnly; } } 
  override bool CanDrop(TreeNodeController source, DragDropEffect effect) {
    return !IsReadOnly && !data.IsChildOf(source.data) && effect == DragDropEffect.Move;
  }
  virtual bool CanDrop(DataInfoObject info, DragDropEffects effect) {
    return info.DragDataCollection != null;
  }
  override bool CanRename() { 
    return !data.IsReadOnly && data.HasName;
  }
}

class LeafNodeController : TreeNodeController {
  override bool CanDrop(TreeNodeController source, DragDropEffect effect) {
    return false;
  }
}

ثم CanDrop سيكون شيئا مثل:

bool CanDrop(DragDropEventArgs args) {
  Point point = tree.PointToClient(new Point(e.X, e.Y));
  TreeNode target = tree.GetNodeAt(point);
  TreeNodeController targetController = target.Tag as TreeNodeController;

  DataInfoObject info = args.GetData(typeof(DataInfoObject)) as DataInfoObject;
  TreeNodeController sourceController = args.GetData(typeof(TreeNodeController)) as TreeNodeController;

  if (info != null) return targetController.CanDrop(info, e.Effect);
  if (sourceController != null) return targetController.CanDrop(sourceController, e.Effect);
  return false;
}

الآن لكل فئة من الكائنات إضافة إلى الشجرة لا يمكن أن تتخصص سلوك طريق اختيار أي TreeNodeController لوضع علامة الكائن.

نصائح أخرى

عدم دقة الإجابة على السؤال الخاص بك, ولكن لقد رصدت خطأ في التعليمات البرمجية الخاصة بك.DragDropEffects وقد أعلام تعيين سمة حتى يمكن أن تحصل على e.Effect أن يكون أحادي المعامل مزيج من نسخ ونقل.في هذه الحالة التعليمات البرمجية بشكل غير صحيح بإرجاع خطأ.

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