Вопрос по .net, c# – Как удалить выбор / очистить привязанный к данным ComboBox? SelectedIndex = -1 не работает

9

Я пытаюсь отменить выбор (исключить) несколько полей со списком в моем приложении Windows Forms. В моем приложении у меня есть метод Reset, который устанавливает SelectedIndex для каждого комбо на -1. Все мои комбо-боксы привязаны к данным, то есть каждый комбо-бокс заполняется с использованием источника данных.

Я заметил, что иногда мой метод Reset работает, то есть он отменяет выбор текущего выбранного элемента и закрывает комбо. Однако в других случаях он выбирает первый элемент (SelectedIndex = 0) сразу после того, как я пытаюсь установить его на -1. С точки зрения пользователей это выглядит как ошибка, так как она не всегда "очищается" форма.

По данным MSDN:

& quot; Чтобы отменить выбор текущего выбранного элемента, установите для SelectedIndex значение -1. Нельзя установить SelectedIndex элемента ComboBox равным -1, если элемент является элементом с привязкой к данным. & Quot;

Кто-нибудь знает об обходной путь?

Большое спасибо

Это старая ветка, но так как я просто пытался выяснить это и нашел это, я добавлю это здесь. Это поведение является ошибкой в соответствии с MS:support.microsoft.com/en-us/help/327244/… CuppM

Ваш Ответ

11   ответов
-3

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

dataGrid.DataSource = Nothing

dataGrid.DataBind()

надеюсь, это поможет! ..: D

dataGrid ?? Вы имеете в виду ComboBox?
Это четко помечено как C #, а не VB. Также он сказал ComboBox, а не DataGrid.
dataGrid.DataSource = null dataGrid.DataBind ()
-1

cb.Items.Add("");

После этого вы можете отменить выбор вашего выпадающего списка, выбрав последний элемент cb:

cb.SelectedIndex = cb.Items.Count - 1;

Вот и вы!

У вас будет последнее место пустым в вашем поле со списком, но это вас не побеспокоит. будет ли он? :-)

0

что сделает его пустым значением. -1 относится к отмене выбора или обнулению значения combobox

Спасибо

0

null или жеString.Empty кSelectedValue имущество.

2

null (Nothing в VB)

Я не могу вспомнить поведение исключения. Тем не менее, я помню, что я использовал для вставки значения с именем -1, (Нет) в поле со списком после того, как он был связан с данными, как правило, через события привязки данных. Я рекомендую получить данные в списке и вставить новое значение в этот список. Привязать комбо к списку сейчас.

Установив его, SelectedValue выдал исключение, SelectedIndex = null сработало, однако для определенного комбинированного списка (раскрывающегося списка) мне пришлось сделать это дважды, что довольно странно. Я не уверен почему? ТАКЖЕ я не использую LINQ, мой проект должен быть .net 2 bobbo
Когда вы говорите дважды, как вы имеете в виду? Как написать строку дважды, один за другим?
SelectedItem, да. Однако, если вы установитеSelectedValue к нулю (и ComboBox привязан к данным), он выдаст исключение.
Кроме того, в любом случае не стоит связывать данные в реальном времени. Всегда извлекайте данные в локальном списке и привязывайте к списку. Надеюсь, вы используете LINQ.
0

& APOS; ComboBox.ResetText (); & APOS;

это сделает текст & quot; & quot; и оставьте элементы в поле со списком без изменений.

я использовал следующий код в моем приложении

 private void UpdateComboBox(ComboBox Box, string Group, List<string> Numbers)
        {
              Box.Items.Clear();
              Box.BeginUpdate();            
              Box.Items.Add("<<Add Contact>>");
              foreach (string item in Numbers)
              {
                   if(item != "")
                        Box.Items.Add(item);
              }
          Box.EndUpdate();
          Box.ResetText();
        }

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

0

omboBox.SelectedItem в -1. Замена ComboBox.ResetText () работала нормально. Это было с использованием .Net 4.6.1, с VS 2013, где TextFormatting = True по умолчанию для комбинированных списков.

0

Установите .Net Framework 4.5 (не меняйте целевой фреймворк вашего проекта, просто установите фреймворк). После установки эта строка отменяет выделение списка данных:

combobox.SelectedValue = 0;

Моим ценным участником является & quot; Id & quot; int автоинкремент первичного ключа, так что поле не содержит значения 0. Однако это не будет работать на версиях Windows, которые не поддерживают .net45

1

comboBox.ResetText();   //framework  4.0 
3

заинтересован ли кто-либо еще в этом, видя, как это происходит сейчас 5 лет спустя, но я нашел очень легкий обходной путь. Абсолютно неинтуитивно (я нашел это только по ссылочному исходному коду), но реализовать тривиально:

ComboBox1.FormattingEnabled = True;

Да, вот и все!

Если вам интересно, вы можете просмотретьисходный код чтобы увидеть, что происходит. Похоже, что основной причиной ошибки, отмеченной @CuppM, является попытка установить позицию в источнике данных:

if (!FormattingEnabled || SelectedIndex != -1) {
    this.DataManager.Position = this.SelectedIndex;
} 

Я бы предположил, что это должно было быть просто & amp; & amp; вместо «||» в условии, так как код, вероятно, не должен устанавливать для Position недопустимое значение независимо от свойства FormattingEnabled.

В любом случае, это допускает простой обходной путь. И так как поведение по умолчанию, если «формат» свойство не заполнено, это не так, вам не нужно ничего менять. Это просто работает. :-)

(Должен отметить, что я пробовал это только с .NET 4.7, поэтому я не могу сказать, работает ли он в предыдущих версиях .NET Framework.)

Вы человек! Это сработало отлично. Раньше, в первый раз, когда я устанавливал SelectedItem = Nothing, ComboBox располагался на первом элементе, а затем мне пришлось сделать это снова, чтобы получить выбор без. Теперь работает как надо. Удивительно, как вам удалось пройти через код ссылки.
20

comboBox.ResetText();

 //to reset selected value
comboBox.SelectedIndex = -1;
Работал на меня. Благодарю.
да, есть причина, потому что если вы используете источник связывания с backgroundworker, который обновляет графический интерфейс после рендеринга, то после связывания удалит текст без значения остальных, для этого вам нужно будет использовать оба
Для меняResetText() было достаточно. Есть ли причина для настройкиSelectedIndex в-1?

Похожие вопросы