2011-02-14 105 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