ドラッグアンドドロップ操作が許可されていることを確認したい。有効なアイテムは、別の「コントロール」から取得することも、カスタムツリービュー内から内部的に取得することもできます。現在私はこれを持っています:
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;
}
私は物事を改善するためにすべてのチェックコードをこのメソッドに移動しましたが、私にとってこれはまだひどいです!
非常に多くのロジックがあり、ツリービューがそれ自体で実行すると予想されることを実行します(たとえば、「TargetExistsInNode」は、ドラッグされたノードがその子の1つにドラッグされているかどうかをチェックします)。
コントロールへの入力を検証するための最良の方法は何ですか?