如何将下拉框的选定值转换为整数?

5

我有一个组合框,它是通过数据源(值和ID)填充的。

comboBox_Degree.DataSource = ds.Tables["Field"];`
comboBox_Degree.DisplayMember = "Field_Degree";
comboBox_Degree.ValueMember = "Field_ID";

现在我想在SelectedIndexChanged事件发生时检索id。但是当我将其强制转换为int时,出现了这样的错误。

int fid = Convert.ToInt32(comboBox_Degree.SelectedValue.ToString());

错误:

输入字符串的格式不正确。

如何将此值转换为整数?


2
comboBox_Degree.SelectedValue.ToString()的值是什么? - Soner Gönül
你能编辑以包括所选项目的值吗? - Stephen Byrne
你的意思是什么?我认为它是 system.Data.DatarRowView,通常会返回一些数字。 - user2944170
请使用 int.TryParse(comboBox_Degree.SelectedValue.ToString()); - Brian
1
TryParse和Convert.ToInt32执行的操作相同,但如果转换失败,它不会抛出异常。但这仍然不能告诉我们为什么转换失败。您能否在代码中断点并获取值comboBox_Degree.SelectedValue.ToString(),然后将其发布在此处以消除所有可能的歧义? - Stephen Byrne
显示剩余6条评论
5个回答

8
请使用以下内容:
int fid;
bool parseOK = Int32.TryParse(comboBox_Degree.SelectedValue.ToString(), out fid);

5

我通常会做类似以下的事情:

int fid=0;
try {
     fid=int.Parse(comboBox_Degree.SelectedValue.ToString());
    } catch (Exception e)
    {
     //Whatever you want to do when it is not an int
    }

1
当存在TryParse方法时,为什么要使用try-catch块?请参见Avia的答案。 - sab669
4
偏好胜过一切。通常我想记录一个错误,我会将它放在 catch 块中,但我想我可以采取 bool 的方式,如果 !parseOK 就写入日志。使用异常捕获的好处是可以捕获 e.Message 或 e.StackTrace 并写入日志。这有时很有帮助,但可能在解析整数时用处不大。 - John Wesley Gordon

2
我遇到了同样的问题,我发现先设置 cbxExampleComboBox.DataSource,然后再设置cbxExampleComboBox.ValueMembercbxExampleComboBox.DisplayMember是导致调用cbxExampleComboBox.SelectedValue返回一个对象的原因。
如果先设置cbxExampleComboBox.ValueMembercbxExampleComboBox.DisplayMember,然后再设置cbxExampleComboBox.DataSource,则cbxExampleComboBox.SelectedValue的类型为int,则返回int
将代码更改为以下内容应该返回结果为int,假设Field_ID的类型为int
comboBox_Degree.ValueMember = "Field_ID";
comboBox_Degree.DisplayMember = "Field_Degree";
comboBox_Degree.DataSource = ds.Tables["Field"];

1
您可以使用此代码来解决您的问题:
 int id = Convert.ToInt32(comboBox_Degree.SelectedValue.GetHashCode());

0
我曾经遇到过类似的问题。然而,问题是由于组合框设置阶段触发了事件处理程序。因此,我将SelectedIndexChanged事件处理程序从Form.Designer移动到FormLoad事件中,在组合框设置(DataSource、ValueMember和DisplayMember分配)之后添加事件处理程序。
  // Example Combobox for Roles
  DataTable dtRoles = new DataTable();
  dtRoles = labDAO.GetRoles();
  cbxRoleID.DataSource = dtRoles;
  cbxRoleID.ValueMember = "ID";
  cbxRoleID.DisplayMember = "Name";
  cbxRoleID.SelectedIndexChanged += cbxRoleID_SelectedIndexChanged;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接