Member 11856456 Ответов: 1

Как разместить временный combobox или текстовое поле в listview?


Я использовал программу под названием personal ancestry file, и мне понравилась их настройка для добавления или обновления информации. У них был один столбец (1-й) с именем столбцы базы данных (полное имя, данные о рождении, дате смерти и т. д.), Затем второй столбец был там, где вы вводили информацию, например,
column 1              column 2
Full name:            Smith, Steve
Date of birth:        12/12/2012
Date of death:        12/12/2017

дизайн интересный, а поток отличный. он показывал только текстовое поле или combobox, в котором я когда-либо находился. Я мог бы перейти на вкладку или использовать мышь, чтобы перейти к любому столбцу, который я хотел бы. как только я оставил один столбец и перешел к следующему, то текстовое поле или combobox исчезнут и будут отображаться в новом столбце.

Я могу добавить текстовое поле в определенное место listview, однако оно постоянно добавляет его в listview вместо того, чтобы отображаться только в этом столбце или ячейке. этот код:

Private Sub ListView1_MouseDoubleClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseClick

For i = 0 To ListView1.Items.Count - 1

            With txb
                .Name = ListView1.Items(i).Text.ToString.Replace(":", "")

            End With

        Next

        txb.Location = New Point(ListView1.SelectedItems.Item(0).SubItems.Item(1).Bounds.X, ListView1.SelectedItems.Item(0).SubItems.Item(1).Bounds.Y)
        ListView1.Controls.Add(txb)

        ListView1.SelectedItems.Item(0).SubItems.Item(1).Text = txb.Text

        If Not String.IsNullOrEmpty(ListView1.Items(0).SubItems(1).Text) Then
            txb.Hide()
        Else
            txb.Clear()
            txb.Show

        End If

 End Sub


Что я уже пробовал:

Я пытался использовать listview.controls.remove(txb), но это не сработало так, как я хотел.

Теперь я попробовал метод Скрыть/показать. Это полуработы. Проблема в том, что когда я впервые перехожу к другому подпункту, текст добавляется к нему вместо того, к которому я пытался добавить текст. Еще одна проблема, с которой я столкнулся, связана с txb.clear, я надеялся, что смогу повторно использовать текст в ячейке подпункта и очистить текстовые данные в текстовом поле, прежде чем перейти к подпункту.

Есть предложения?

1 Ответов

Рейтинг:
8

Wendelius

Во-первых, если у вас есть код, который должен удалить текстовое поле, вы его не показали. Попробуйте что - нибудь вроде


  • При щелчке строки listview (а не при двойном щелчке) сначала проверьте, есть ли текстовое поле в переменной уровня окна
  • Если есть, спрячьте его и избавьтесь от экземпляра
  • После этого создайте новое текстовое поле и сохраните его в переменной уровня окна

Если бы это не было действительно необходимо, я бы не пытался повторно использовать объекты, так как это просто вносит ненужную сложность в логику.

ДОПОЛНЕНИЕ

Рассмотрим следующий пример. Он содержит много предположений, поэтому измените его в соответствии с вашими требованиями
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim a As ListViewItem

    a = Me.ListView1.Items.Add("One")
    a.SubItems.Add("1")

    a = Me.ListView1.Items.Add("Two")
    a.SubItems.Add("2")

    a = Me.ListView1.Items.Add("Three")
    a.SubItems.Add("3")
End Sub

Private Sub ListView1_Click(sender As Object, e As EventArgs) Handles ListView1.Click

    If Not txb Is Nothing Then
        RemoveHandler txb.Leave, AddressOf txb_Leave
        ListView1.Controls.Remove(txb)
        txb.Hide()
        txb = Nothing
    End If

    txb = New TextBox()
    txb.Text = Me.ListView1.SelectedItems(0).SubItems(1).Text
    txb.Location = New Point(ListView1.SelectedItems.Item(0).SubItems.Item(1).Bounds.X, ListView1.SelectedItems.Item(0).SubItems.Item(1).Bounds.Y)
    txb.Tag = Me.ListView1.SelectedItems(0)
    AddHandler txb.Leave, AddressOf txb_Leave
    ListView1.Controls.Add(txb)

End Sub

Private Sub txb_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave
    Dim item As ListViewItem
    item = CType(txb.Tag, ListViewItem)

    item.SubItems(1).Text = txb.Text
End Sub


Member 11856456

Не могли бы вы привести пример? Кроме того, извините за код, это не двойной щелчок, а всего лишь один щелчок. Первая часть говорит дважды, потому что это то, с чего я начал, но с тех пор изменил его.

Wendelius

Смотрите обновленный ответ.

Member 11856456

Мне пришлось изменить одну вещь в кодировке, чтобы она работала
изменено: частная суб txb_Leave(отправителя как объект, а равно EventArgs) обрабатывает текстовое поле textbox1.Оставить
to: Private Sub txb_Leave(sender As Object, e As EventArgs) обрабатывает Txb.Leave

Код отлично работает, я очень ценю вашу помощь. В коде не было большой разницы, так что его довольно легко понять.

Еще раз спасибо за помощь

Wendelius

Добро пожаловать, рад, что это помогло!