2011-06-10 54 views
8

我在winForm上有兩個組合框cb_Brandcb_ModelComboBox在Clear()後有其舊值()

cb_Model在品牌選擇上填充值。 問題是:如果我們選擇品牌任何並選擇該品牌下的任何型號,cb_Model不會鬆動選定的以前型號的價值。例如:如果我們選擇品牌奧迪和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 = ""; 
} 

謝謝很多傢伙 歡呼聲

回答

7

代替手工添加的項目是這樣的:

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

對此有讀有關綁定列表(其它數據源和)更多信息以組合框:

How to: Bind a Windows Forms ComboBox or ListBox Control to Data (MSDN)

+0

智能解決方案,但對我沒有任何影響。其實只有當我點擊'cb_Model'來選擇模型時纔會填充。它似乎將這個價值保留在記憶中的某個地方。 – Scorpion 2011-06-10 14:31:35

0

我已經嘗試過你的榜樣。對我來說,它應該有它應有的。 你可以嘗試設置cb_model.SelectedText爲「」或selectedItem爲null

+0

沒有任何區別,我也很驚訝,我在搜索表單上有類似的控件,它們工作正常......它只發生在編輯表單上。 – Scorpion 2011-06-10 13:21:29

+0

是否確保Model.ReadModel(CarBrandID)僅返回福特模型? – maephisto 2011-06-10 13:23:43

6

@ 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. 
+0

我已經嘗試'cb_Model.SelectedIndex = -1;',但沒有區別。 – Scorpion 2011-06-10 13:16:26

+1

@Scorpion:我相信,另一種選擇是設置'SelectedItem = null' – IAbstract 2011-06-10 19:50:08

+0

@Scorpion:還有一件事是保持價值不被清除。這裏的任何建議都可行......正如maephisto說的那樣,它適用於他 - 所以我會建議你有缺少的東西;) – IAbstract 2011-06-10 19:51:37

3

現在我有同樣的問題,組合框的ResetText方法解決了這個問題對我來說

0

我發現,保持接近數據源的範圍加載組合框爲我工作。我有一個具有類級範圍的數據表,它沒有清除,但隨後我將它帶入了函數級作用域,並且在加載之後清除了它並且工作。

0

我有類似的問題,試圖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(沒什麼,沒有) 這個我試圖重新加載我的數據集,從而我的comboboxes.Using cmbstud.resettext只是清除文本而不是值。

0

我有同樣的問題,然後我用

combobox1.SelectedIndex=-1 

和它的作品。