2012-04-24 3 views
0

Я сижу в VB-проекте, и у меня есть ListView с 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 

Любые советы, как позволить пользователю изменять последний (или как второй и последний) клетки?

ответ

5

Элемент управления Listforms 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

Смежные вопросы