C#从Access数据库和ComboBox将字符串转换为Int

时间:2016-02-24 12:37:21

标签: c# ms-access combobox type-conversion

我正在努力将变量从数据库更改为可用的Int,以便我可以与数据库进行比较以删除行。

以下是我使用的代码:

private void EditEmployee_Load(object sender, EventArgs e)
    {
        DataTable table = new DataTable(); //creates a Table to store the data before populating the ComboBox
        string connstring = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\HoliPlanData.accdb;Persist Security Info=False";
        try
        {
            using (OleDbConnection conn = new OleDbConnection(connstring))
            {
                conn.Open();
                string query = "SELECT PayrollNo, (FirstName + ' ' + LastName) AS NAME FROM [Employee]";
                OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
                adapter.Fill(table);
                DropBoxEmp.DataSource = table;
                DropBoxEmp.DisplayMember = "NAME";                    
                DropBoxEmp.ValueMember = "PayrollNo";
                string BadNumber = DropBoxEmp.ValueMember;
                int GoodNumber = Int32.Parse(BadNumber);

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

问题是字符串BadNumber被设置为字符串" PayrollNo"而不是Datatable将PayrollNo存储为的Int的字符串版本。当我将DisplayMember设置为" PayrollNo"时,组合框显示1和2,依此类推,作为在SELECT查询中选择的Int。

为什么BadNumber会将分配给DropBoxEmp.ValueMember的文字而不是数字?我们将非常感激地提供任何帮助。

2 个答案:

答案 0 :(得分:2)

您需要DropBoxEmp.SelectedItem,而不是ValueMember。您误解了ValueMember属性是什么。它告诉组合框其绑定中的哪个字段用作后备值。

要取消装箱,请执行以下操作:

var theItem = DropBoxEmp.SelectedItem as DataRowView;
MessageBox.Show(theItem[0].ToString());

- 另外,数据适配器将打开连接,因此您不需要这样做。

答案 1 :(得分:1)

尝试使用列名和行索引来获取值:

if(table.Rows.Count==1) // if it's supposed to be unique
{
    int GoodNumber = Int32.Parse(table.Rows[0]["PayrollNo"].ToString());
}
else
{
    //Show some error
}