2012-09-12 25 views
1

我正在由LINQ查詢填充的組合框如何發現:)沒事的時候在ComboBox中選定

var locations = 
    from loc in db.LOCATIONs 
     .Where(a => a.Omit == false) 
select new 
{ 
    LocationID = loc.LocationID, 
    Location = loc.Location1 
}; 

cbo = this.cboAdminLocation; 
cbo.DataSource = locations; 
cbo.DisplayMember = "Location"; 
cbo.ValueMember = "LocationID"; 
cbo.SelectedIndex = -1; 

我也有例行DisplayAccounts(其中列出了一個DataGridView所有帳戶,但過濾按組合中選擇的值選擇,否則顯示所有賬戶。我想這將是非常簡單的,我試圖用DisplayAccounts內的下列語句()來處理它:

if (this.cboAdminLocation.SelectedIndex > -1) 
    filterAdminLocation = Convert.ToInt32(this.cboAdminLocation.SelectedValue.ToString()); 
else 
    filterAdminLocation = 0; 

,並在LINQ查詢的末尾:

if (filterAdminLocation > 0) 
{ 
    accountData = accountData.Where(a => a.LocationID == filterAdminLocation); 
} 

不過,我在「輸入字符串的格式不正確」的第一個循環中(即,在有機會從Combo中選擇一個值之前)出現錯誤,並且實際上在該階段的組合值顯示爲{ LocationID = 1, Location = "Brentwood" }和所選的索引是0.如果我跳過這一步,並測試當我選擇了一個值,它會返回一個整數值,如預期的那樣。

因此,我的問題是,爲什麼讓過去的if (this.cboAdminLocation.SelectedIndex > -1)測試時,所選擇的指標是所謂0,多以爲什麼選擇指數0時,我明確地將其設爲-1填充控制時的點?

我很欣賞這可能非常簡單,但對於C#我相當陌生,所以你不得不原諒我的愚蠢!

+0

我通常curcumvent問題初始化集合我綁定到一個虛擬物品,代表「沒有被選中」的組合框。然後,我追加我的物品,並綁定它。工作順利,而不必刪除選擇了。 – Alex

回答

1

因此,我的問題是,爲什麼不拿過去的,如果(this.cboAdminLocation.SelectedIndex> -1)測試時,所選擇的指標是所謂0,多以爲什麼選擇指數0時,我明確點在填充控件時將其設置爲-1?

這是因爲你第一填充組合框,然後選定索引設置爲-1。在這兩個步驟之間,選定的索引是 - 短時間 - 0

爲了糾正這種情況,只有在運行cbo.SelectedIndex = -1;後,才能調用DisplayAccounts()例程。我想你在組合框'SelectedIndexChanged事件中調用DisplayAccounts()。如果是的話,請將事件到ComboBox後(並確保從Designer.cs文件中刪除它,如果你在設計窗口添加的事件):

//... 
cbo = this.cboAdminLocation; 
cbo.DataSource = locations; 
cbo.DisplayMember = "Location"; 
cbo.ValueMember = "LocationID"; 
cbo.SelectedIndex = -1; 
cbo.SelectedIndexChanged += new EventHandler(cbo_SelectedIndexChanged); 
+0

第一遍沒有解釋例外情況。進程0是針,但它爲什麼會失敗?懷疑它還不知道ValueMember,因此它傳遞的字符串位置與錯誤消息一致。我認爲你可以在DataSource之前設置DisplayMember和ValueMember。你發佈的解決方案有沒有處理0的好處,但我仍然好奇爲什麼0會失敗。 – Paparazzi

相關問題