2013-03-07 2 views
0

Учитывая следующий кодНеожиданное поведение ComboBox

namespace WindowsFormsApplication1 
{ 
    public class Form1 : Form 
    { 
     public Form1() 
     { 
      comboBox1 = new System.Windows.Forms.ComboBox(); 

      comboBox1.Items.AddRange(new object[] { 
      "Item 1", 
      "Item 2", 
      "Item 3"}); 
      comboBox1.Location = new System.Drawing.Point(93, 103); 
      comboBox1.Name = "comboBox1"; 
      comboBox1.Size = new System.Drawing.Size(121, 21); 
      comboBox1.Text = "Item 1"; // **line 1** 

      ClientSize = new System.Drawing.Size(284, 262); 
      Controls.Add(this.comboBox1); 

      Name = "Form1"; 
      Text = "Form1"; 

      comboBox1.Text = "Nanu"; // **line 2** 
     } 

     private ComboBox comboBox1; 

    } 
} 

Я ожидал, что мой ComboBox, чтобы отобразить «Нану» (DropDownStyle.DropDown), но он показывает «пункт 1». Опуская линию comboBox1.Text = "Item 1"; исправляет это. Ввод comboBox1.Text = "Nanu"; в обработчик события OnShown также исправляет «ошибку».

Почему это?

+1

Что произойдет, если вы поместите comboBox1.Text = "Nanu"; до Controls.Add (this.comboBox1) ;? – VladL

+0

Перемещение строки 2 над Controls.Add исправляет проблему, но не является реальной опцией, так как первая часть программы генерируется дизайнером (метод «InitializeComponents»), вторая часть выполняется в конструкторе формы. –

ответ

2

Согласно msdn

Установка свойства Text в NULL или пустая строка ("") устанавливает SelectedIndex к -1. При установке свойства Text значение, которое находится в , коллекция Items устанавливает SelectedIndex в индекс этого элемента. Установка свойства Text в значение, не входящее в коллекцию оставляет SelectedIndex неизменным.

Так что, когда вы делаете:

comboBox1.Text = "Item 1"; 

Вы автоматически выбрать «Пункт 1» ранее добавлен в список элементов. Добавить «Нану» в коллекцию, и он должен работать:

comboBox1.Items.AddRange(new object[] { 
    "Item 1", 
    "Item 2", 
    "Item 3", 
    "Nanu"}); 
+0

Nanu - это строка, введенная пользователем и динамически загружаемая в форму динамически из базы данных. Поэтому его невозможно добавить в коллекцию Items. Я понимаю, что с моей линией 1, SelectedIndex установлен в 0, с линией он остается неизменным, но я не понимаю, почему элемент управления заменяет мой текст на «Item 1». –

+0

@MatthiasWuttke combobox не работает, как текстовое поле, свойство Text в combobox работает как SelectedItem, поэтому, когда вы устанавливаете текст в какую-либо строку, которая не существует в коллекции, последний выбранный элемент остался бы там - следовательно, элемент 1" . Я не понимаю, почему вы не можете добавить «Нану» позже? Просто добавьте его так: 'combobox1.Items.Add (« Nanu »);' – AbZy

+0

Вы правы, добавив «Nanu» в качестве элемента. Но: если я устанавливаю свойство Text в обработчике событий OnShown, он работает без проблем, а просто отключает свойство Text в конструкторе. Мне это кажется странным - возможно, внутренние инициализации произойдут позже? –

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