2010-12-30 2 views
4

사용자가 노드 레이블의 에디션에 쓴 것을 기반으로해야하며, 다른 텍스트로 해당 레이블을 다시 작성하십시오. 예를 들어 사용자가 "NewNodeName"을 작성한 경우 에디션을 마친 후 노드 텍스트를 "S : NewNodeName"으로 지정합니다. 나는이 두 가지 코드를 시도하고 내가 어느 작품도afterlabeledit treeview 핸들러 C#

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

하고 이유를 알고하지 않습니다

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

답변

6

예, 작동하지 않는, Text 속성은이 후 레이블 값 을 얻는다 이벤트가 실행됩니다. 그래서 e.Cancel이 작동합니다. 따라서 할당 한 텍스트 값은이 이벤트를 발생시킨 후 실행되는 코드로 다시 덮어 쓰게됩니다. 네이티브 Windows 컨트롤 내부의 코드.

AfterAfterLabelEdit 이벤트가없고 이벤트 처리기에서 e.Label을 변경할 수 없으므로 트릭이 필요합니다. 이벤트가 중지 된 후 Text 속성 을 변경하십시오. 우아하게 Control.BeginInvoke()를 사용하여 완료되었습니다. 이처럼 :) (

1) 당신이 BeginEdit를 호출 직전 노드 레이블의 편집 할 수 없습니다 사용자가 원하는 부분을 제거

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

한스 안녕하세요, 작동 설정 텍스트를 대체하지 않도록

2) AfterLabelEdit()에서, 당신이 원하는대로 노드 텍스트를 설정하고 NodeLabelEditEventArgs.CancelEdit = true로 설정 플로리다 그렇죠. 그것은 당신이 나에게 준 좋은 대답의 행에서 세 번째와 같습니다, 대단히 감사합니다. – mjsr

+0

xD ... 내가 생각하는 질문은 적어도 사소한 것은 아니었다. 그리고 당신의 대답은 정확했습니다. 예를 들어,이 질문에서 대리자 호출을 사용하면 필자가 원하는 것을 성취하는 방법을 찾지 못할 때가 있습니다. 이제는 내 레퍼토리에 대한 해결책이 하나 더있어 다른 사용자가 유용한 답변을 찾을 수 있다고 확신합니다. – mjsr

+0

내 경우에는이 작업이 효과적이었습니다. 노드 자체의 레이블을 다시 지정하는 대신 새로운 레이블을 가진 새로운 노드 (나는 그것이 이상하다는 것을 알고 있지만, 나는 나의 이유가있다). 어쨌든, 내가 직접 생각해 낸 CancelEdit 트릭은 완전히 작동하지 않았습니다. 노드는 대체되지만 "편집"모드 (EndEdit 호출이 많은 경우에도)로 유지됩니다. 감사! – coderforlife

2

그것은 여기이 질문에 대답하기 아주 늦게, 그러나 다른 해결책 텍스트 사용자 입력하면

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; 
}