Mig*_*gol 6 .net c# treeview treenode winforms
我正在使用WinForms TreeView
并对AfterLabelEdit
事件做出反应.这是代码的片段:
if (e.Label.Contains("|"))
{
if (WantAutofix())
{
label = e.Label.Replace('|', '_');
}
else
{
e.CancelEdit = true;
e.Node.BeginEdit();
return;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是当用户不想自动修复坏字符时,节点不会保持编辑模式.有任何解决这个问题的方法吗?
需要记住以下几点:
AfterLabelEdit
在引发后始终会结束编辑模式。BeginEdit
您可以TreeView.BeginInvoke
通过在 TreeView 执行其操作后再次启动 EditMode 来“跨越”这一点。 (注意:这不会创建新的线程或竞争条件,它只是延迟 1 个窗口消息的方法。)这里 有关于此事件的一些问题的更多信息(尽管它表明我认为是一个更糟糕的解决方案) 。e.Label
就是null
如果用户没有进行任何更改,那么当我们使用 BeginInvoke 进行“跳跃”时,就好像用户没有进行任何更改一样,所以我们也需要处理这种情况。这对我来说非常有效,用 .NET 2.0 进行了测试:
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
//we have to handle both the first and future edits
if ((e.Label != null && e.Label.Contains("|") || (e.Label == null && e.Node.Text.Contains("|"))))
{
if (WantAutofix())
{
e.CancelEdit = true;
if(e.Label != null)
e.Node.Text = e.Label.Replace('|', '_');
else
e.Node.Text = e.Node.Text.Replace('|', '_');
}
else
{
//lets the treeview finish up its OnAfterLabelEdit method
treeView1.BeginInvoke(new MethodInvoker(delegate() { e.Node.BeginEdit(); }));
}
}
}
private bool WantAutofix()
{
return MessageBox.Show("You entered a |, you want me to AutoFix?", String.Empty, MessageBoxButtons.YesNo) == DialogResult.Yes;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2592 次 |
最近记录: |