2012-04-24 21 views
0

私はVBプロジェクトに座っていますが、私は3つのセルを持つListViewを持っています。チェックボックス、名前、および別のテキスト値。最後のセルをユーザーが編集できるようにしたい。 2番目のセルも編集可能で問題はありません。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プロパティを設定して、最初の項目のみを編集可能にすることができます。

あなたが本当に詳細モードでは、次の2つの可能性がある場合、リストビューの任意の「細胞」を編集できるようにしたい場合は、次のDataGridへ

  • スイッチ
  • 利用可能な多くの拡張機能のいずれかを(例はfound hereです)
0

リストビューで特定の行を編集することはできませんが、値を削除してから再追加することはできます。残念ながら、同じ行に複数のセルを追加する方法はわかりませんが、リストビューコントロールで単一の列セルを削除して追加する方法はわかっています。多分これはスタートになるかもしれない。

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

多くの場合、このテキストボックスオーバーレイソリューションを示唆人々はスクロールを忘れる - ユーザーがリストビューをスクロールしているとき、テキストボックスがその場所に残ります。もう1つの問題は、ユーザーが編集するサブアイテムを選択できるようにするキーボードインターフェイスを実装する必要があることです。 ListViewには他の重大な欠点があります([この記事を読む](http://10tec.com/articles/editable-listview-replacement.aspx))ので、ListViewをグリッドのような別のコントロールに置き換えることは間違いありません。細胞。 – TecMan

関連する問題