【问题标题】:C# Converting String to Int from Access Database and ComboBoxC# 将字符串从 Access 数据库和 ComboBox 转换为 Int
【发布时间】:2016-02-24 12:37:21
【问题描述】:

我正在努力将数据库中的变量更改为可用的 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 的文字而不是数字?任何帮助将不胜感激。

【问题讨论】:

  • "PayrollNo" 是数据库中列的名称?如果此名称不匹配,您只需将其选择为字符串。
  • 是 PayrollNo 是数据库中第一列的名称。
  • 您是否使用调试器检查了表值,以查看您是否从执行查询中得到了您期望的结果?打印 table.Rows[0][1].ToString().
  • 查询执行得很好,我在代码中使用中断检查并打开表视图。第一列有 PayrollNo,第二列有附加名称

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


【解决方案1】:

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

要拆箱,请执行以下操作:

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

--顺便说一句,数据适配器会打开连接,所以你不需要这样做。

【讨论】:

  • Selected Value 被设置为对象,无法转换为字符串
  • @Josh,是的,您必须将其拆箱并访问所需的属性。我相信是DataRowView
  • 我很抱歉没有早点说明我的编码技能非常低。这是我的第一个编码项目,很抱歉,但我不知道如何拆箱和访问所需的属性,我该怎么做?
  • @Josh,查看我的编辑,我已更改为 SelectedItem 并展示如何拆箱。
  • 这很奏效,非常感谢您的帮助。 theItem 是数据库中列的副本吗?我可以根据数据查询它以删除一行吗?
【解决方案2】:

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

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
}

【讨论】:

  • Opps,一开始我以为 check 只是大于零,然后我意识到这肯定应该是唯一的并更改了它,但是忘记将 = 的 0 替换为 1 =。这只是一个类型,因为我实际上并没有编译,抱歉。
猜你喜欢
  • 2013-08-04
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多