web-dev-qa-db-ja.com

ComboBoxは、Clear()の後に古い値を持ちます

WinFormに2つのcomboBoxcb_Brandcb_Modelがあります。

cb_ModelはブランドSelectに値を入力します。問題は、ブランドanyを選択し、そのブランドの下のanyモデルを選択した場合、cb_Modelは以前に選択したモデルの値を失うことはありません。例:ブランドAudiとモデルA3を選択し、ブランドフォードを選択した場合、cb_Modelをクリックしてモデルを選択すると、選択されたモデルとしてA3が表示されますが、リスト内の他のモデルはに属します。フォード。

私のコードは:

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 = "";
}

どうもありがとう

8
Scorpion

このように手動でアイテムを追加する代わりに:

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();

リスト(およびその他のデータソース)をComboBoxにバインドする方法の詳細については、これをお読みください。

方法:Windowsフォームのコンボボックスまたはリストボックスコントロールをデータ(MSDN)にバインドする

7
Iain Ward

@ w69rdyは優れたソリューションを提案します。

Cb_Modelが変更しなかった理由valueは、値を変更したことがないためです。 cb_Model.Items.Clear()は、選択されたインデックスを変更しません。コンボボックスから削除されるのはアイテムだけです。

質問で提供されたコードサンプルを使用する:

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

私は今同じ問題を抱えていました、そしてコンボボックスのResetTextメソッドは私のために問題を解決しました

3
sanjuro

これはうまくいくでしょう

combobox.ResetText();
1
user4244210

私はあなたの例を試しました。私にとっては、本来あるべきように機能しました。 cb_model.SelectedTextを ""に設定するか、SelectedItemをnullに設定してみてください。

0
maephisto

データソースのスコープをコンボボックスのロードの近くに保つことが私にとってはうまくいくことがわかりました。クラスレベルのスコープを持つデータテーブルがあり、クリアされませんでしたが、関数レベルのスコープに入れて、ロード後にクリアしました。これは機能しました。

0
John Peake

私は同じ問題を抱えています

combobox1.SelectedIndex=-1

そしてそれは動作します。

0
Prajakta

同様の問題があります。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(Nothing、Nothing )これは、データセット、つまりコンボボックスを再読み込みしようとしました。cmbstud.resettextを使用すると、値ではなくテキストがクリアされます。

0
GotaloveCode