#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)
В моем событии щелчка btnhostel у меня есть приведенный ниже код: frmallocateHostel_Load (Ничего, ничего) это я ввел в попытке перезагрузить мой набор данных и, следовательно, мои выпадающие списки.Использование cmbstud.resettext просто очищает текст, а не значение.
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()
Ответ №8:
У меня такая же проблема, тогда я использовал
combobox1.SelectedIndex=-1
и это работает.