Как добавить элементы в список?

Строка кода ниже добавляет каждую строку к каждому индексу списка Box.

ListBox1.Items.AddRange(CType(TabControl1.SelectedTab.Controls.Item(0), RichTextBox).Lines)

Однако это работает, если я хочу выполнить ту же функцию, что и в строке ниже, но с библиотекой DLL ScintillaNet. Я пробовал то же самое с использованием dll, но это не совсем то же самое. Вот код, который я тестировал:

ListBox1.Items.AddRange(CType(TabControl1.SelectedTab.Controls.Item(0), ScintillaNet.Scintilla).Lines)

Извините, что задаю такой глупый вопрос, но я новичок в ScintillaNet DLL.

Любая помощь будет оценена.


person Tom    schedule 22.01.2014    source источник
comment
Какая у вас ошибка? Не могли бы вы объяснить, что это значит это не совсем то же самое?   -  person Steve    schedule 23.01.2014
comment
Полученная ошибка: Ошибка 1 Разрешение перегрузки не удалось, поскольку доступный «AddRange» не может быть вызван с этими аргументами: «Public Sub AddRange (items() As Object)»: значение типа «ScintillaNet.LinesCollection» не может быть преобразовано в «1- размерный массив Объекта». «Public Sub AddRange (значение As System.Windows.Forms.ListBox.ObjectCollection)»: значение типа «ScintillaNet.LinesCollection» не может быть преобразовано в «System.Windows.Forms.ListBox.ObjectCollection».   -  person Tom    schedule 23.01.2014
comment
@Steve под «не совсем таким же» я имею в виду, что код RichTextBoxes для получения каждой строки немного отличается от кода для сверкающего кода dll. Я не уверен, насколько отличается, и я уверен, что вы можете выполнить функцию, которую я хочу выполнить, однако я не знаю правильного кода для этого.   -  person Tom    schedule 23.01.2014


Ответы (2)


Метод ListBox.Items.AddRange принимает только массив Object. Свойство ScintillaNet.Scintilla.Lines является объектом ScintillaNet.LinesCollection, а не массивом. Таким образом, вы не можете передать его методу ListBox.Items.AddRange.

Свойство RichTextBox.Lines, с другой стороны, является массивом String, поэтому его можно передать методу ListBox.Items.AddRange.

К сожалению, нет простого способа преобразовать объект ScintillaNet.LinesCollection в массив. Вы можете использовать метод CopyTo для копирования коллекции в массив, но, вероятно, проще и эффективнее просто пройтись по коллекции и добавить каждую по отдельности, например:

For Each i As Line In CType(TabControl1.SelectedTab.Controls.Item(0), ScintillaNet.Scintilla).Lines
    ListBox1.Items.Add(i.Text)
Next

Обратите внимание, что я добавляю i.Text к ListBox, а не просто i. Как проницательно заметил Стив в комментариях ниже, LineCollection содержит список Line объектов. Метод ToString класса Line просто выводит индекс строки, а не текст из этой строки.

person Steven Doggart    schedule 22.01.2014
comment
Я думаю, что это пытается добавить объект типа Line в ListBox. Наверное, так и должно быть i.Text - person Steve; 23.01.2014
comment
ListBox.Items.AddRange() значительно более эффективен, чем ListBox.Items.Add(). Например, быстрый тест для добавления 1000 элементов: ListBox1.Items.Add() завершается за 2,5 секунды, а ListBox.Items.AddRange() завершается за 20 миллисекунд. - person AndyMc; 27.11.2018

Основываясь на ответе Стивена Доггарта, использование AddRange() вместо Range() будет выглядеть так:

Dim lst As New List(Of String)

For Each i As Line In CType(TabControl1.SelectedTab.Controls.Item(0), ScintillaNet.Scintilla).Lines
    lst.Add(i.Text)
Next

ListBox1.Items.AddRange(lst.ToArray)
person AndyMc    schedule 27.11.2018