Ankur Gupta Ответов: 3

Каков самый быстрый способ добавить элементы в выпадающий список combo box с помощью C# ?


Я работаю над преобразователем времени, который имеет 2 комбо-бокса, туда и обратно.

Оба комбобокса есть Большой список около 20 тысяч+ названия стран и городов.

Этот список жестко закодирован в самом коде, и я использую этот код:

this.comboBox_TO.Items.AddRange(new object[]
{
 "Afghanistan, Kabul",
  //List
}

this.comboBox_FROM.Items.AddRange(new object[]
{
 "Afghanistan, Kabul",
  //List
}


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

Мне нужна помощь в любом случае,

1) Самый быстрый способ добавить список в элементы Combobox, или
2) остановите сброс Combobox каждый раз, когда конвертер снова открывается.

Заранее спасибо.

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

this.comboBox_TO.Items.AddRange(new object[]
{
 "Afghanistan, Kabul",
  //List
}

this.comboBox_FROM.Items.AddRange(new object[]
{
 "Afghanistan, Kabul",
  //List
}

Graeme_Grant

Трудно дать полезный ответ, так как мы не видим кода, который используется в вашем вопросе.

Пожалуйста, обновите свой вопрос с отсутствующим кодом, нажав на кнопку Улучшить вопрос.

Garth J Lancaster

можно ли использовать иерархический подход или подход "нагрузка по требованию"? сначала загрузите все страны, пользователь выбирает страну, а затем загружает города для страны ?

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

[no name]

"Оба Combobox имеют большой список около 20K+", у вас нет проблемы с производительностью, у вас есть проблема с дизайном. Никто не собирается просеивать список из 20 тысяч пунктов.

Jochen Arndt

Вы на самом деле используете самый быстрый способ.

Единственной оптимизацией может быть установка для свойства Sorted значения false (если оно еще не очищено).

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

Но как уже было сказано:
Список с 20k+ элементами не является удобным для пользователя.
Попробуйте разбить его (например, один список со странами и зависимый список с городами в выбранной стране).

Afzaal Ahmad Zeeshan

Сколько времени это займет?

F. Xaver

Почему так много возможностей в любом случае.. есть только 22 страны с более чем 1 часовым поясом
большинство приложений добавляют только некоторые из более крупных городов или только столицу к названию страны
например, Афганистан (Кабул), Франция (Париж), Германия (Берлин).. Зимбабве (Хараре)

и за это 22 страны ... как в США
США /HAST (Гонолулу), США /AKST (Анкоридж), США /PST (Лос-Анджелес), США /MST (Солт-Лейк-Сити), США /CST (Чикаго), США /EST (Нью-Йорк)

зачем вдаваться в подробности ;)

CHill60

Я заинтригован тем, что в списке стран есть 20 тысяч записей, поскольку на этой земле существует менее 200 стран!

3 Ответов

Рейтинг:
1

OriginalGriff

Нет хорошего способа сделать это: я бы - как пользователь - не хотел пытаться выбрать город из выпадающего списка с 20 000 элементами в нем: черт возьми, я бы не хотел выбирать из выпадающего списка с 2000 элементами!

Вместо этого рассмотрите возможность использования двух DDL: первый выбирает страну, и это действие заполняет второй. Таким образом, вы предоставляете пользователю минимальную "ложную" информацию, необходимую для выполнения его работы.

Я бы также рассмотрел возможность использования базы данных, CSV или XML-файла для ваших данных вместо жесткого кодирования стран и городов: загрузите данные из него в datatable, и вы сможете использовать их в качестве источников для DDLs. Жесткое кодирование, как правило, не является хорошей идеей для чего-либо, имеющего более чем пару элементов. Это может помочь: Создание каскадных выпадающих списков в ASP.Net[^]


Рейтинг:
1

Patrice T

Цитата:
Оба Combobox имеют большой список из более чем 20 тысяч названий стран и городов.

ComboBox/DropBox с 20K+ записями - это плохая идея с самого начала.

Вам нужно найти другой способ выбора в списке. Подумайте о Google и о том, как развивается выпадающий список, когда вы что-то печатаете.
просто набрав одну букву, вы можете сделать свой список в 10 раз меньше.


Рейтинг:
1

Suntaurus

Предварительно выделите начальную емкость с помощью pinvoke, чтобы добавить элементы быстрее, а затем сразу все элементы с помощью AddRange

private const int CB_INITSTORAGE = 0x161;

[DllImport("user32.dll", EntryPoint = "SendMessageA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern int SendMessage(IntPtr handle, int uMsg, int wParam, object lParam);

private void btnTest_Click(object sender, EventArgs e)
{
   //populate values, replace this with your database values
   List<object> lst = new List<object>(10000);
   for (int i = 0; i < 1000; i++)
      lst.Add("Item" + i);

   //wParam = total items being populated
   //lParam = total bytes to allocate, items count * 100 (average 100 chars per item)
   SendMessage(comboBox2.Handle, CB_INITSTORAGE, lst.Count, lst.Count * 100);
   comboBox2.Items.AddRange(lst.ToArray());
}


Dave Kreskowiak

Во-первых, это старый вопрос, на который уже был дан достаточный ответ.

Во-вторых, любой контроль с 20 000 пунктов в нем просто глупо. В вашем примере вы используете всего 1000 элементов. Даже это было бы очень болезненно использовать с точки зрения пользователей.

Единственный реальный ответ-переосмыслить то, что делает интерфейс, и разбить его на гораздо более удобный список записей и, возможно, даже использовать вторую комбинацию, чтобы сузить возможности.

Suntaurus

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


Я только ответил, глядя на этот вопрос, то есть добавляя элементы быстрее.

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

Maciej Los

Вы можете сделать это сами... Смотрите правый нижний угол вашего "ответа".
Примечание: ответ на уже заданные вопросы может привести к понижению голоса.