0

在这里,我使用 TextBox 将节点名称限制为最多 60 个字符,这会导致标签编辑事件后未触发的问题

/// <summary>
/// This event use to restrict user input up to 60 Characters.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvFolders_BeforeLabelEdit(object sender, NodeExLabelEditEventArgs e)
{
    txtFolderName.MaxLength = 60;
    e.CancelEdit = true;
    TreeNodeEx selectedNode = tvFolders.SelectedNode;
    txtFolderName.Visible = true;
    e.Node.Text =txtFolderName.Text = selectedNode.Text;
    txtFolderName.SelectAll();
    txtFolderName.BringToFront();
    txtFolderName.Left = tvFolders.Left + selectedNode.Bounds.Left;
    txtFolderName.Top = tvFolders.Top + selectedNode.Bounds.Top;
    txtFolderName.Focus()
}

以下事件未被调用,其中包含我的业务逻辑,如果我使用TextBox将用户输入限制为最多 60 个字符,则不会触发该事件

private void tvFolders_AfterLabelEdit(object sender, Framework.Utilities.Controls.ExtendedTreeView.NodeExLabelEditEventArgs e)
{       
    if(e.Label.Length >60)
    {
        MessageBox.Show("Please enter Less than 60 Characters in folder name.", "New Folder", MessageBoxButtons.OK);
        e.CancelEdit = true;
        this.tvFolders.SelectedNode = e.Node;               
    }           
    else if(IsDuplicateFolderName(e.Node, e.Label, (DataRowView)e.Node.DataRow))
    {
        MessageBox.Show("This folder name already exists. Please provide a new name.", "New Folder", MessageBoxButtons.OK);
        e.CancelEdit = true;
        this.tvFolders.SelectedNode = e.Node;       
        SaveNewNode(e, true);
    }
    else if(e.Label.Length == 0)
    {
        MessageBox.Show("Folder name cannot be empty", "New Folder", MessageBoxButtons.OK);
        e.CancelEdit = true;
        this.tvFolders.SelectedNode = e.Node;               
    }   
}
4

2 回答 2

1

当然 AfterLabelEdit() 不会被触发,您在 BeforeLabelEdit() 中取消了编辑。当没有编辑发生时,你怎么能有一个“之后”的编辑?

        private void tvFolders_BeforeLabelEdit(object sender, NodeExLabelEditEventArgs e)
        {
            // ...
            e.CancelEdit = true;

将 AfterLabelEdit() 逻辑(需要更改)放在自己的方法中,并从与您的 TextBox 关联的事件中触发它txtFolderName

于 2013-05-16T14:20:40.350 回答
1

@Idle 已经解释了为什么这不起作用。在 TreeView 创建的编辑控件上设置文本限制是完全可能的,Winforms 通过使用本机 Windows api 可以无限扩展。Petzold 在他的“Programming Windows”一书中展示了如何编写这种代码。让它看起来像这样:

    private void treeView1_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) {
        IntPtr edit = SendMessage(treeView1.Handle, TVM_GETEDITCONTROL, IntPtr.Zero, IntPtr.Zero);
        SendMessage(edit, EM_SETLIMITTEXT, (IntPtr)60, IntPtr.Zero);
    }

    private static int TVM_GETEDITCONTROL = 0x1100 + 15;
    private static int EM_SETLIMITTEXT = 0x00c5;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hwnd, int msg, IntPtr wp, IntPtr lp);
于 2013-05-16T18:51:12.577 回答