2013-06-13 90 views
0

昨天我嘗試實現一個支持子項編輯的新列表視圖,我的解決方案是在雙擊子項時顯示一個文本框。關鍵代碼如下:C#可編輯列表視圖

protected override void OnDoubleClick(EventArgs e) 
{ 
     Point pt = this.PointToClient(Cursor.Position); 
     ListViewItem curItem; 
     int subItemIndex = GetSubItemAt(pt.X, pt.Y, out curItem); 
     DoubleClickEventArgs args = new DoubleClickEventArgs(subItemIndex); 
     base.OnDoubleClick(args); 

     if (subItemIndex>=0 && !args.Cancel) 
     { 
      //StartEdit(...); 
     } 

}

public void EndEdit(bool acceptChanges) 
    { 
     //validation 
     ................. 
     ................. 
     AfterSubItemEventArgs e = new AfterSubItemEventArgs(this.SelectedItems[0], m_editSubItemIndex, this.SelectedItems[0].SubItems[m_editSubItemIndex].Text, m_textbox.Text, false); 
     OnAfterSubItemEdit(e); 
     if (e.Cancel) 
     { 
      //.... 
     } 
     else 
     { 
      //set new value 
     } 
     m_textbox.Visible = false; 
     m_editSubItemIndex = -1; 
    } 

OnAfterSubItemEdit是一個事件,用戶可以做一些驗證或其他操作。我在這個方法中添加一個檢查,如果新值存在,我將首先向用戶顯示一個消息框,然後隱藏文本框。但現在,問題出現了,當我移動鼠標時,可以選擇listview項目,我不怎麼解決這個問題,我盡我所能找出了方法,但失敗了。所以,請幫助我!

+0

是的,我知道LabelEdit屬性,但它只能編輯第一個分項目,我想編輯子項目 – user2480894

+0

爲什麼不使用DataGridView,你可以改變外觀,使其看起來像一個ListView –

+0

是的,我可以使用DataGridView而不是Listview,但我仍然想解決這個問題。 – user2480894

回答

0

Listview有一個LabelEdit屬性;當你將它設置爲「true」時,那麼在一個事件處理程序中,你可以調用Listview.Items [x] .BeginEdit(),並編輯一個項目。舉個例子,你可以處理ListView.DoubleClick事件並調用BeginEdit右邊有:

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    listView1.LabelEdit = true; 
    } 

private void listView1_DoubleClick(object sender, System.EventArgs e) 
{ 
    if(this.listView1.SelectedItems.Count==1) 
    { 
     this.listView1.SelectedItems[0].BeginEdit(); 
    } 
} 
+0

是的,我知道這個屬性,但它只能編輯第一個子項目,我想編輯子項目 – user2480894

0

的問題是,價值是否存在的形式仍然調用DoubleClick事件。呼叫基地的DoubleClick在你的代碼之前添加適當的條件,即:

if(!new value exists) 
    base.OnDoubleClick(args);