Member 13356923 Ответов: 3

Разделение элементов в многострочное текстовое поле в элемент управления ListView


- Привет! Я пытаюсь понять это уже несколько дней

Я хочу разделить строку и добавить элементы в столбец listview

мне удалось заставить его работать, но по какой-то причине он добавляет только 1 строку, как мне это сделать, пока ничего не останется?

пример:

1|имя|адрес

Dim s As String = TextBox2.Text

       Dim split As String() = s.Split(New [Char]() {"|"})


       ListView1.Items.Add(split(0))
           ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(split(1))
           ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(split(2))


textbox2.text содержит "1|имя|адрес"

код преобразует его в строку, строка разделяется
это работает только для первой строки
если у меня есть несколько строк в textbox2 / string , он их игнорирует.

1 будет в первой колонке, имя будет во второй, а адрес-в третьей колонке

если строка имеет это:
1|name|address

2|name|address


он проигнорирует вторую строку, добавит первую строку и закончит на этом

не могли бы вы, пожалуйста, помочь? спасибо

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

Я перепробовал все от Гугла, он не будет читать все строки

Member 13356923

Обычно если я читаю его непосредственно из файла через streamreader это будет что то вроде:

        Do While inputstream.Peek > 0
                'Split each line containing Account|Password into the array
                newstr = inputstream.ReadLine().Split("|")
                'Assigm the values to the variables

                'Add them to the list
                'ref
                My.Forms.Database.ListView1.Items.Add(newstr(0))
                'name
                My.Forms.Database.ListView1.Items.Item(My.Forms.Database.ListView1.Items.Count - 1).SubItems.Add((newstr(1)))


но я не читаю с некоторого времени, это строка, которая делает его еще более трудным
"do while inputstream.peek > 0" - это то, чего мне сейчас не хватает, но как это сделать для строки?

Richard MacCutchan

Он добавляет только один элемент, потому что это все, что вы говорите ему делать. Вам нужно создать For или Do цикл, который имеет дело с каждым набором из 3 строк.

И если у вас есть несколько строк, вам, скорее всего, также нужно разделить символы новой строки.

3 Ответов

Рейтинг:
2

OriginalGriff

Вы обрабатываете только первую строку!
Если вы хотите обработать больше строк из многострочного текстового поля, то вам необходимо использовать свойство TextBox.Lines в For Each цикл и повторите этот код внутри цикла, чтобы он обрабатывал каждую строку отдельно.


Member 13356923

Привет я только что попробовал

Дим как строка = элемент textbox1.Текст

Дим разделить строку() = текстовое поле textbox1.Текст.Сплит(Новый [Чара]() {"|"})

Для каждого l в TextBox1.Lines
Мыши listview1.Предметы.Добавить(разделить(0))
Мыши listview1.Пользования(Мыши Listview1.Предметы.Граф - 1).подпункты.Добавить(разделить(1))

но он просто повторяется и добавляет первую строку в listview :(

и я не хочу, чтобы он читал из текстового поля, я хочу, чтобы он читал из строки

OriginalGriff

О, Фер ...

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

Richard MacCutchan

Успокойся, дорогая!

OriginalGriff

Переход на летнее время всегда морочит мне голову... :смех:

Но раньше я ненавидел виннера - напыщенного, самодовольного придурка-его колонку в "Санди таймс" я старательно игнорировал.

Richard MacCutchan

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

Member 13356923

Я помещаю разделение в цикл, первая строка просто продолжает цикл и продолжает добавлять в listview

OriginalGriff

И дай мне угадать ... вы все еще используете Split на TextBox1.Text ... да?

Один из наших самых уважаемых членов однажды сказал: "в программном обеспечении надежда и молитва-это нежизнеспособная стратегия" ( @Luc-Pattyn )

Maciej Los

5ed!

Рейтинг:
2

Maciej Los

Коротко И По Существу!

Member 13356923

может ли кто-нибудь просто покормить меня с ложечки и дать мне код Т-Т
я здесь рву на себе волосы

Рейтинг:
11

Maciej Los

В дополнение к soultion #1 by OriginalGriff[^] и решение №2 по Ричард Маккатчан[^] ...

Вы должны работать с данными, а не с их строковым представлением. Это называется Объектно-Ориентированное Программирование[^].

Вставить новый класс (назовите его: MyData) в ваш проект и вставьте ниже код:

Public Class MyData
	Private iID As Integer = 0
	Private sName As String = String.Empty
	Private sAddress As String = String.Empty
	
	
	Public Sub New(ByVal sPipeLine As String)
		Dim parts As String()= sPipeLine.Split(New String(){"|"}, StringSplitOptions.RemoveEmptyEntries)
		iID = Int32.Parse(parts(0))
		sName = parts(1)
		sAddress = parts(2)
	End Sub
	
	Public Property ID As Integer
		Get
			Return iID
		End Get 
		Set (value As Integer)
			iID = value
		End Set
	End Property
	
	Public Property Name As String
		Get
			Return sName
		End Get 
		Set (value As String)
			sName = value
		End Set
	End Property

	Public Property Address As String
		Get
			Return sAddress
		End Get 
		Set (value As String)
			sAddress = value
		End Set
	End Property

	Public Overrides Function ToString() As String
		Return String.Format("{0}|{1}|[2}", iID, sName, sAddress)
	End Function

	Public Function ToArray() As String()
		Return New String(){iID.ToString(), sName, sAddress}
	End Function

End Class


Как им пользоваться?
    'for testing purposes i use this:
    Dim lines As String() = {"1|name|address", "2|name|address"}
    'in your case - you have to get it from TextBox.Lines

Dim data As List(Of MyData) = lines _
    .Select(Function(x) New MyData(x)) _
    .ToList()

For Each md As MyData In data
            'this creates item with subitems
    Dim lvi As ListViewItem = New ListViewItem(md.ToArray())
    Me.ListView1.Items.Add(lvi)
Next


Для получения более подробной информации, пожалуйста, смотрите:
Класс ListViewItem (System.Окна.Формы)[^]
Конструктор ListViewItem (String[]) (System.Окна.Формы)[^]
Объект.Метод ToString (Система)[^]


Member 13356923

Это прекрасно работает, спасибо вам! просто еще одна ошибка, с которой я столкнулся

если в моем текстовом поле есть || (между разделением ничего нет), это дает исключение
индекс находился за пределами массива

Есть ли решение этой проблемы?

это также происходит, если в конце текстового поля есть пустое"".

Maciej Los

Да, есть. Измените конструктор MyData на:

	Public Sub New(ByVal sPipeLine As String)
		Dim parts As String()= sPipeLine.Split(New String(){"|"}, StringSplitOptions.RemoveEmptyEntries)
		If parts.Length = 3 Then
			iID = Int32.Parse(parts(0))
			sName = parts(1)
			sAddress = parts(2)
		End If
	End Sub

Если мой ответ был полезен, пожалуйста, примите его как решение (зеленая кнопка).