6

WinFormsとイベントTreeViewへの反応を使用しています。AfterLabelEditコードのスニペットは次のとおりです。

if (e.Label.Contains("|"))
{
  if (WantAutofix())
  {
    label = e.Label.Replace('|', '_');
  }
  else
  {
    e.CancelEdit = true;
    e.Node.BeginEdit();
    return;
  }
}

問題は、ユーザーが不良文字の自動修正を望まない場合、ノードが編集モードのままにならないことです。これを修正する方法はありますか?

4

4 に答える 4

3

覚えておくべきいくつかのこと:

  1. イベントハンドラーの途中でAfterLabelEdit呼び出した場合でも、イベントは発生後に常に編集モードを終了します。TreeViewが処理を実行した後、EditModeを再起動することで、これを「飛躍」させる BeginEditことができます。(注:これは新しいスレッドまたは競合状態を作成せず、1ウィンドウメッセージのメソッドを遅らせるだけです。) このイベントに関するいくつかの問題に関する詳細情報がここにあります(ただし、これはより悪い解決策であると私が考えるものを示唆しています) 。TreeView.BeginInvoke
  2. e.Labelこれはnull、ユーザーが変更を加えなかった場合です。したがって、BeginInvokeで「飛躍」すると、ユーザーが変更を加えなかったかのようになり、その場合も処理する必要があります。
  3. この場合、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;
    }
于 2011-11-16T22:32:19.060 に答える
0

BeginEdit()を非同期で発生させることができます。

private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
    {
        if (e.Label.Contains("|"))
        {
            if (WantAutofix())
            {
            }
            else
            {
                e.CancelEdit = true;
                BeginInvoke(new ActionDelegate(new NodeBeginEditAsync(e.Node).Execute));
                return;
            }
        }
    }
public class NodeBeginEditAsync
{
    private readonly TreeNode _node;

    public NodeBeginEditAsync(TreeNode node)
    {
        _node = node;
    }

    public void Execute()
    {
        _node.BeginEdit();
    }
}

public delegate void ActionDelegate();

そうすれば、新しいBeginEditが引き継ぐ前に、CancelEditを完了する機会が与えられます。

于 2011-07-06T13:26:45.247 に答える
0

ユーザーが自動修正を希望する場合は、EndEditを使用して「不良文字」を置き換えます

于 2011-07-06T13:30:31.530 に答える
0
try this...    
TreeNode node = tv.SelectedNode;
                    if (tv.SelectedNode.Parent == null)
                    {
                        node.TreeView.LabelEdit = false;
                    }
                    else
                    {
                        node.Text = FieldName.Text;
                        if (node == null) { return; }
                        node.TreeView.LabelEdit = true;
                        node.BeginEdit();
                    }
于 2011-07-30T05:32:01.800 に答える