2011-03-06 73 views
1

我有一個C#.NET WinForm。在表單中,我允許用戶通過雙擊ListView將項目添加到ListView。這會將一個TextBox控件添加到ListView中,並將關鍵遊標放置在TextBox中,以便用戶可以輸入。Control.Leave觸發MouseDown,而不是MouseUp

我檢測到用戶已經通過幾種方式(例如按Enter,Esc,Tab ...)完成項目,但是當他們離開(TextBox.Leave)文本框時。

問題是這樣的一個步驟:

  1. 用戶通過將鼠標向下文本框的外部觸發TextBox.Leave。
  2. 我將新項目添加到ListView。
  3. 我在ListView中選擇新項目。
  4. 發生鼠標擡起,並且我剛選擇的新項目失去焦點並且未被選中。

我想讓TextBox.Leave由MouseUp而不是MouseDown觸發。我怎樣才能做到這一點?

編輯:科迪建議使用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/zh-cn/library/system.windows.forms.listview.labeledit.aspx)設置爲True?或者,我會考慮使用'DataGridView'控件,如果您需要允許用戶在運行時添加項目。 – 2011-03-06 09:16:57

+0

@Cody - 我正在嘗試LabelEdit,但看到奇怪的行爲。查看我的更新。 – Chad 2011-03-06 10:06:50

回答

0

在另一個控件上按下鼠標使其他控件請求焦點,因此焦點移動導致TextBox.Leave事件發生。防止其他可能的控制請求重點並不是一個可行的選擇。但幸運的是,您只需要防止ListView使用MouseDown來移動焦點。所以你需要覆蓋你的ListView的WndProc,並且當MouseDown窗口消息發生時,你正在顯示一個TextBox你吃掉了這個消息。換句話說,你不允許基類來處理它。

相關問題