2012-04-24 96 views
0

我坐在一個VB項目中,我有一個帶有3個單元格的ListView;複選框,名稱和其他文本值。我希望最後的單元格可以爲用戶編輯。第二個單元也可以編輯,沒有問題。在ListView中編輯單元格

如何設置單元格是可編輯的?

現在我有這個代碼來填充列表框:

Dim row(3) As String 
Dim itm As ListViewItem 
Dim txtbox As New TextBox 

row(0) = "" 
row(1) = "some value" 
row(2) = "0" 


itm = New ListViewItem(row) 
itm.SubItems.Add("txtbox") 

ListView1.Items.Add(itm 

任何提示,如何讓用戶更改最後一個(或兩個第二和最後一個)細胞?

回答

5

Winforms ListView控件不能像DataGrid一樣使用。
只有第一項可以編輯設置屬性LabelEdit = True。

如果你真的希望能夠編輯任何的「細胞」 ListView控件時在詳細模式下,你有兩種可能性:

  • 切換到一個DataGrid
  • 使用現有的許多擴展的一個免費在網絡上(一個例子可以found here
0

你不能在ListView編輯特定的行,但你可以刪除,然後重新添加值。不幸的是,我不知道如何將多個單元格添加到同一行,但知道如何刪除和添加列表視圖控件中的單個列單元格。也許這可能是一個開始。

Dim item As ListViewItem = ListView1.SelectedItems(0) 
Dim intIndex As Integer = item.Index 

item.Remove() 
ListView1.Items.Insert(intIndex, "New Text") 
0

有竅門與編輯細胞。您必須創建偏移文本框,並將其放置到要編輯的單元格的位置(命中測試,設置位置和大小)。

Dim iRow, iCol as Integer 
 

 
Private Sub TextOverlay_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 
 
     ListView1.Items(iRow).SubItems(iCol).Text = TextOverlay.Text 
 
End Sub 
 

 
Private Sub ListView1_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseClick 
 
     Dim hit As ListViewHitTestInfo = ListView1.HitTest(e.X, e.Y) 
 
     Dim iWidth As Integer 
 
     For iCol = 0 To hit.Item.SubItems.Count - 1 
 
      If hit.Item.SubItems(iCol).Bounds.Left <= e.X Then 
 
       If iCol = 0 And hit.Item.SubItems.Count > 1 Then 
 
        If e.X <= hit.Item.SubItems(1).Bounds.Left Then 
 
         iWidth = hit.Item.SubItems(1).Bounds.Left 
 
         Exit For 
 
        End If 
 
       ElseIf e.X <= hit.Item.SubItems(iCol).Bounds.Right Then 
 
        iWidth = hit.Item.SubItems(iCol).Bounds.Width 
 
        Exit For 
 
       End If 
 
      End If 
 
     Next 
 
     iRow = hit.Item.Index 
 
     TextOverlay.Left = ListView1.Left + hit.SubItem.Bounds.Left + 3 
 
     TextOverlay.Top = ListView1.Top + hit.SubItem.Bounds.Top 
 
     TextOverlay.Width = iWidth 
 
     TextOverlay.Height = 18 
 
     TextOverlay.Text = hit.SubItem.Text 
 
     TextOverlay.Visible = True 
 
     TextOverlay.ReadOnly = False 
 
End Sub

+0

在大多數情況下,人們建議這個文本框的覆蓋解決方案忘記滾動 - 文本框保持其位置,當用戶滾動ListView控件。另一個問題是我們需要實現一個鍵盤界面來爲用戶提供選擇任何子項的能力來編輯它。 ListView有其他嚴重的缺點(閱讀[本文](http://10tec.com/articles/editable-listview-replacement.aspx)),所以我肯定會將ListView替換爲另一個控件,如網格,如果您需要編輯它細胞。 – TecMan 2016-09-02 15:00:15