2010-12-30 6 views
4

ich muss basierend in dem, was der Benutzer in der Ausgabe eines Knotens Etikett schrieb, schreiben Sie das Etikett mit anderem Text. Beispiel wenn der Benutzer "NewNodeName" geschrieben hat, möchte ich, dass der Knotentext nach Beendigung der Edition "S: NewNodeName" ist. Ich versuche, diese zwei Codes, und ich weiß nicht, warum weder Arbeitnachlabeledit treeview handler C#

private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) 
    { 
     e.Node.Text = "S :"+ e.Label; 
    } 

und auch:

 private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) 
    { 
     treeView1.SelectedNode.Text = "S :"+ e.Label; 
    } 

Antwort

6

Ja, nicht funktioniert, wird die Eigenschaft Text des Etiketts Wert nach dieser Ereignis läuft. Deshalb arbeitet e.Cancel. Der von Ihnen zugewiesene Text wird daher erneut durch Code überschrieben, der nach dem Auslösen dieses Ereignisses ausgeführt wird. Code innerhalb des nativen Windows-Steuerelements.

Es gibt kein AfterAfterLabelEdit-Ereignis und Sie können e.Label im Ereignishandler nicht ändern, Sie brauchen einen Trick. Ändern Sie die Texteigenschaft , nachdem das Ereignis nicht mehr ausgeführt wurde. Elegant gemacht mit Control.BeginInvoke(). Wie folgt aus:

private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { 
     this.BeginInvoke((MethodInvoker)delegate { e.Node.Text = "S: " + e.Node.Text; }); 
    } 
+0

hallo Hans, es funktioniert fla wless. Es ist wie ein Drittel in einer Reihe von guten Antworten, die Sie mir gegeben haben, vielen Dank. – mjsr

+0

xD ... die Fragen, die ich für gut halte, zumindest nicht trivial. Und deine Antworten waren präzise. Zum Beispiel in dieser Frage, die Verwendung von Delegierten Aufruf nie mir in den Sinn, wenn Sie schauen, wie zu erreichen, was ich brauche. Jetzt habe ich eine weitere Lösung für mein Repertoire und ich bin zuversichtlich, dass andere Benutzer Ihre Antwort nützlich finden werden, VoteUp für diese – mjsr

+0

Dies funktionierte für mich auch in meinem Fall, anstatt die Knoten selbst zu benennen, wollte ich sie durch ersetzen neuer Knoten mit dem neuen Label (ich weiß es ist komisch, aber ich habe meine Gründe). Wie auch immer, der CancelEdit-Trick, unter dem ich selbst auftrat, funktionierte nicht ganz - der Knoten würde ersetzt werden, würde aber im "Editiermodus" bleiben (selbst bei vielen Aufrufen von EndEdit). Vielen Dank! – coderforlife

2

Es ist ziemlich spät, diese Frage zu beantworten, aber hier ist eine andere Lösung:

1) Entfernen Sie den Teil, den Sie Benutzer wollen nicht von der Knotenlabel bearbeiten rechts, bevor Sie BeginEdit() aufrufen

2) In AfterLabelEdit(), stellen Sie den Knotentext, wie Sie wollen und setzen NodeLabelEditEventArgs.CancelEdit = true, so dass der Text von Benutzereingaben nicht den Text ersetzen setzen Sie

private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if (e.Node == null) return; 
    e.Node.Text = e.Node.Text.Substring(3, e.Node.Text.Length - 3); 
    e.Node.BeginEdit(); 
} 
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) 
{ 
    e.Node.Text = "S :" + e.Label; 
    e.CancelEdit = true; 
}