【问题标题】:Enhanced features with Drag and Drop from Treeview to Textbox in WinForms在 WinForms 中从 Treeview 拖放到 Textbox 的增强功能
【发布时间】:2013-12-24 21:28:25
【问题描述】:

我有以下代码成功地将树视图节点拖放到 WFA 中的文本框:

private void _MyTreeView_ItemDrag(object sender, ItemDragEventArgs e)
{
    DoDragDrop(e.Item.ToString(), DragDropEffects.Copy);
}

private void textBox1_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy;
}

private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(System.String)))
    {
        textBox1.Text += (System.String)e.Data.GetData(typeof(System.String));
    }
}

但我希望能够通过拖放操作做一些其他事情。

(1) 如果我拖到文本框的节点的 Text 属性值为“MyTreeNode”,那么出现在文本框中的值是“TreeNode: MyTreeNode”而不是“MyTreeNode”,即它添加了“TreeNode” : ' 在开始时。我该如何解决这个问题?

(2) 有什么办法可以防止根级别的所有TreeNodes被拖放?

(3) 使用上面的代码,当我拖放一个树节点时,树节点文本将附加到文本框中已经存在的文本的末尾。我是否能够添加一个“放置光标”(我不知道你会怎么称呼它)并将树节点放置在它实际放置的位置,即光标的位置?

【问题讨论】:

    标签: c# winforms drag-and-drop treeview


    【解决方案1】:

    TreeNode.ToString() 方法不会像您希望的那样做,您必须明确使用 TreeNode.Text 属性。结合 1) 和 2):

        private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) {
            var node = (TreeNode)e.Item;
            if (node.Level > 0) {
                DoDragDrop(node.Text, DragDropEffects.Copy);
            }
        }
    

    您的 DragEnter 事件处理程序过于宽松,您允许将 anything 拖到 TextBox。但是你只能处理一个字符串,所以检查一下:

        private void textBox1_DragEnter(object sender, DragEventArgs e) {
            if (e.Data.GetDataPresent(typeof(string))) e.Effect = DragDropEffects.Copy;
        }
    

    您可以通过使用简单的赋值而不是 += 来避免串联

        private void textBox1_DragDrop(object sender, DragEventArgs e) {
            textBox1.Text = (string)e.Data.GetData(typeof(string));
        }
    

    如果用户不应该自己编辑文本,请考虑使用标签而不是文本框。

    【讨论】:

    • 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多