2011-02-14 151 views
2

我正在處理C#.net windows應用程序。我正在使用以下命令在我的winform上填充組合框。c#中的組合框選定的值#

cmbEMPType.DataSource = objEntityManager.EmployeeTypes(); 
cmbEMPType.DisplayMember = "EMPTypeName"; 
cmbEMPType.ValueMember = "EMPTypeId"; 

其中objEntityManager.EmployeeTypes();在會從LINQ到SQL服務器列表的管理器方法。這工作正常。

但當我選擇項目表單組合框,然後點擊按鈕,然後在按鈕點擊事件我得到cmbEMPType.SelectedValueEmpType返回類型,而不是它的Id。爲什麼要這樣?我不想創建一個更多的EmpType對象。需要簡單的選定值。也無法對SelectedIndex保持信心。每次可能會有所不同。

**Edited** 
     public List<EMPType> EmployeeTypes() 
     { 
      List<EMPType> EMPTypeList = null; 
      try 
      { 
       if (CommonDataObject.dataContext.EMPAllTypes.Any()) 
       { 
        EMPTypeList = CommonDataObject.dataContext.EMPAllTypes.ToList(); 
       } 
       return EMPTypeList; 
      } 
      catch 
      { 

       return EMPTypeList; 
      } 

     } 

編輯

private void btnSave_Click(object sender, EventArgs e) 
     { 

iEMPTypeId = cmbEMPType.SelectedValue; 
} 

在這裏,我必須得到INTE。但要求創建EMPType對象。

+0

你確定你沒有使用cmbEMPType.SelectedItem?這通常會得到所選對象(EmpType),而cmbEMPType.SelectedValue將獲得'ValueMember'中指定的屬性。 –

+0

是的,我確定。我檢查了三次。但不幸的是有SelectedValue。實際上你也可以檢查它的返回類型。它顯示'對象'。 –

+0

它將始終返回對象,因爲該值可以是任何類型,因此無論如何您都需要投射該對象。請在我的其他評論中發佈更多的代碼,我們會看看發生了什麼。 –

回答

1

這是正確和預期的行爲,你不能改變它。

SelectedValue應返回屬性的類型,例如,如果EMPTypeId是整數,它應該返回整數 - 請發佈更多的代碼,以便我們可以嘗試弄清楚爲什麼你會得到不同的返回值。

萬一你使用SelectedItem再有這樣的代碼來獲取ID:

int selectedID = (cmbEMPType.SelectedItem as EmpType).EMPTypeId; 

處理案件時,沒有什麼選擇:

object oSelectedEmp = cmbEMPType.SelectedItem; 
int selectedID = oSelectedEmp == null ? -1 : (oSelectedEmp as EmpType).EMPTypeId; 
+0

其實你是不正確的。 SelectedValue應該給出ValueMember中指定的字段的值,而不是實際的對象。如果沒有指定ValueMember,它會給出一個ToString()表示。 –

+0

@Rew你說得對,我對SelectedItem感到困惑。 :| –

+0

@Rewinder:我怎麼弄出這個問題。 @Shadow Wizard:我認爲這是我提供的足夠的代碼,你期望什麼?實際上我想要將選定值作爲整數。但它給了我對象類型的EmpType。爲什麼要這樣? –

1

的問題是序列你的代碼。請將第一行代碼移至最後一行。您將從cmbEMPType.SelectedValue獲得一個int值(iEMPTypeId)。

cmbEMPType.DisplayMember = "EMPTypeName"; 
cmbEMPType.ValueMember = "EMPTypeId"; 
cmbEMPType.DataSource = objEntityManager.EmployeeTypes(); 

iEMPTypeId = cmbEMPType.SelectedValue 
0

另一種選擇是覆蓋EMPType類中的toString函數。正如Edwin de Koning所述:「如果沒有指定ValueMe,它會給出一個ToString()表示。」

喜歡的東西(我不能在此刻測試):

public override string ToString() 
{ 
    return this.ID; 
} 

你可以看看這篇文章:http://msdn.microsoft.com/en-us/library/ms173154(v=vs.80).aspx