2011-03-06 3 views
1

C# .NET WinForm이 있습니다. 이 양식에서는 사용자가 ListView에서 항목을 두 번 클릭하여 ListView에 추가 할 수 있습니다. 이렇게하면 TextBox 컨트롤이 ListView에 추가되고 사용자가 입력 할 수 있도록 TextBox에 키 커서가 놓입니다.Control.Leave MouseUp이 아닌 MouseDown에 의해 트리거 됨

사용자가 몇 가지 방법으로 항목을 완료했다는 것을 감지합니다 (예 : Enter, Esc, Tab ...). 그러나 TextBox를 나가기 (TextBox.Leave) 할 때도 마찬가지입니다.

문제는이 단계 세트입니다 :

  1. 사용자가 텍스트 상자의 바깥 아래로 마우스를 가져 가면 TextBox.Leave을 트리거합니다.
  2. 새 항목을 ListView에 추가합니다.
  3. ListView에서 새 항목을 선택합니다.
  4. 마우스가 올라가고 방금 선택한 새 항목이 포커스를 잃고 선택 취소됩니다.

TextBox.Leave는 MouseUp이 아닌 MouseUp에 의해 트리거됩니다. 이것을 어떻게 할 수 있습니까?

편집 : 코디는 ListView.LabelEdit 속성을 사용하도록 제안합니다. 사용자를 두 번 클릭 어디에 새 항목이 표시됩니다 때

listView_DoubleClick(...) { 
    listView.LabelEdit = true; 
    if(double clicked on existing listViewItem) { 
    listViewItem.BeginEdit(); //this works as expected 
    } else { 
    var newItem = listView.Items.Add(""); 
    newItem.BeginEdit();  //this doesn't work, see below 
    } 
} 

newItem.BeginEdit에 대한 호출은()는 작품 : 여기에 그 시도 내 결과입니다. 목록보기에서 다른 빈 영역을 두 번 클릭하면 새 항목이 추가되지만 편집 모드로 전환되지 않습니다. 무슨 일 이니?

+0

'ListView'컨트롤에 행을 추가하는 것은 매우 이상한 방법입니다. 왜 당신은 별도의'TextBox' 컨트롤이 필요합니까? ['LabelEdit' 속성 (http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.labeledit.aspx)을 True로 설정해 보셨습니까? 또는 사용자가 런타임에 항목을 추가 할 수 있도록 허용해야하는 경우 'DataGridView'컨트롤 사용을 고려할 것입니다. –

+0

@Cody - 지금 LabelEdit을 시도하고 있지만 이상한 동작을보고 있습니다. 내 업데이트를 참조하십시오. – Chad

답변

0

다른 컨트롤을 마우스로 누르면 다른 컨트롤에서 포커스를 요청하므로 포커스를 이동하면 TextBox.Leave 이벤트가 발생합니다. 포커스를 요청하는 것에서 다른 가능한 제어를 방지하는 것은 매우 실용적인 옵션이 아닙니다. 그러나 행운을 빌어 ListView가 MouseDown을 사용하여 포커스를 이동하지 못하게하면됩니다. 따라서 ListView의 WndProc를 재정의해야하며 MouseDown Windows 메시지가 발생하고 현재 메시지를 먹는 TextBox를 표시하고있는 경우입니다. 순서대로 기본 클래스가 처리하도록 허용하지 않습니다.

관련 문제