Выпадающий список имеет свое старое значение после Clear()

#c# #.net #winforms #combobox

#c# #.net #winforms #combobox

Вопрос:

У меня есть два поля со списком cb_Brand и cb_Model в WinForm.

cb_Model заполняет значения при выборе бренда. проблема в том, что если мы выбираем бренд any и выбираем любую модель под этим брендом, cb_Model значение предыдущей выбранной модели не теряется. например: если мы выбираем марку Audi и модель A3 и выбираем марку Ford, когда я нажимаю на cb_Model , чтобы выбрать модель, она отображает A3 как выбранную модель, но все же другие модели в списке принадлежат Ford.

мой код:

 private void cb_Brand_SelectedIndexChanged(object sender, EventArgs e)
{
    // Clear Current Data
    cb_Model.Text = "";
    cb_Model.Items.Clear();

    CarModel _carmodel = new CarModel ();

    // Get Selected Car Brnad
    int CarBrandID = _carmodel .GetCarBrandID(cb_Brand.Text);

    //Enable choice of Model
    SortedList<int, Model> colM;

    colM = Model.ReadModel(CarBrandID);

    cb_Model.DisplayMember = "ModelText";
    foreach (Model objM in colM.Values)
    {
        cb_Model.Items.Add(objM);
    }
}
  

Пожалуйста, любая идея..
Спасибо


не удалось найти причину, но устранено с помощью временного исправления:

 private void cb_Model_Click(object sender, EventArgs e)
{
    cb_Model.Text = "";
}
  

Большое спасибо, ребята
приветствия

Ответ №1:

Вместо добавления элементов вручную, как это:

 foreach (Model objM in colM.Values)
{
    cb_Model.Items.Add(objM);
}
  

Пусть .NET позаботится об этом за вас и заменит его этим:

 cb_Model.DataSource = colMValues;
  

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

Вам также больше не понадобятся эти строки:

 // Clear Current Data
cb_Model.Text = "";
cb_Model.Items.Clear();
  

Прочтите это для получения дополнительной информации о привязке списков (и других источников данных) к спискам со списком:

Как: Привязать поле со списком Windows Forms или элемент управления ListBox к данным (MSDN)

Комментарии:

1. умное решение, но для меня это не имеет никакого значения. На самом деле заполняется только тогда, когда я нажимаю на ‘cb_Model’, чтобы выбрать модель. Кажется, что оно сохраняет это значение где-то в памяти.

Ответ №2:

@w69rdy предлагает отличное решение.

Причина, по которой cb_Model не изменил его value , заключается в том, что вы никогда не меняли значение. cb_Model.Товары.Clear() не изменяет выбранный индекс; из поля со списком удаляются только элементы.

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

 // Clear Current Data
cb_Model.Text = "";
cb_Model.Items.Clear();
cb_Model.SelectedIndex = -1;    // would effectively clear the previously selected value.
  

Комментарии:

1. Я уже пробовал ‘cb_Model. SelectedIndex = -1;’, но никакой разницы.

2. @Scorpion: я полагаю, что другим вариантом является установка SelectedItem = null

3. @Scorpion: есть что-то еще, что не позволяет очистить значение. Любое из приведенных здесь предложений сработало бы … как говорит маэфисто, у него это работает — поэтому я бы предположил, что вам чего-то не хватает 😉

4. Не удалось найти причину, но найдено временное исправление. ` private void cb_Model_Click(отправитель объекта, EventArgs e) { cb_Model. Text = «»; }`

Ответ №3:

у меня была такая же проблема сейчас, и метод ResetText Combobox решил проблему для меня

Ответ №4:

Это сработало бы

 combobox.ResetText();
  

Ответ №5:

Я попробовал ваш пример. Для меня это сработало так, как должно было. Вы могли бы попробовать установить cb_model.SelectedText равен «» или SelectedItem равен null

Комментарии:

1. не имеет никакого значения, я также поражен, у меня есть похожие элементы управления в форме поиска, и они работают нормально… это происходит только в форме редактирования.

2. вы убедились, что Model.ReadModel(CarBrandID) возвращает только модели ford?

Ответ №6:

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

Ответ №7:

У меня похожая проблема, попробовал cmb.resettext, он очищает текст, но не значение.В моей форме загрузки у меня есть приведенный ниже код: Dim cmd As New SqlCommand("SELECT stud_id,name FROM student_details WHERE stud_id NOT IN (SELECT stud_id FROM student_details WHERE hostel_id!=0)", sqlcont.Conn)
Dim dr As SqlDataReader = cmd.ExecuteReader
Dim dat As New DataTable
Dim j As Integer
For j = 0 To dat.Rows.Count - 1
dr.Read()
Next
dat.Load(dr)
cmbstud.DisplayMember = "name"
cmbstud.ValueMember = "stud_id"
cmbstud.DataSource = New BindingSource(dat, Nothing)
dr.Close()
В моем событии щелчка btnhostel у меня есть приведенный ниже код: frmallocateHostel_Load (Ничего, ничего) это я ввел в попытке перезагрузить мой набор данных и, следовательно, мои выпадающие списки.Использование cmbstud.resettext просто очищает текст, а не значение.

Ответ №8:

У меня такая же проблема, тогда я использовал

 combobox1.SelectedIndex=-1
  

и это работает.