使单元格在ListView中可编辑

时间:2012-04-24 13:12:28

标签: vb.net visual-studio-2010 listview

我正坐在VB项目中,我有一个包含3个单元格的ListView;复选框,名称和其他文本值。我希望最后一个单元格可以为用户编辑。第二个单元格也可以编辑,没有任何问题。

如何设置单元格可编辑?

现在我正在使用此代码来填充ListBox:

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

如何让用户更改最后一个(或第二个和最后一个)单元格的任何提示?

4 个答案:

答案 0 :(得分:6)

Winforms ListView控件不能像DataGrid一样使用 只有第一项可以设置属性LabelEdit = True。

如果您真的希望能够在详细模式下编辑ListView的任何“单元格”,您有两种可能:

  • 切换到DataGrid
  • 使用网上免费提供的众多扩展程序之一(示例可以是found here

答案 1 :(得分:0)

您无法编辑列表视图中的特定行,但可以删除,然后重新添加值。不幸的是,我不知道如何将多个单元格添加到同一行,但知道如何在listview控件中删除和添加单个列单元格。也许这可能是一个开始。

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

有一种方法可以获取当前选定的项目,然后在ListViewItem上使用BeginEdit()调用。 分发更改:ListView.AfterLabelEdit事件