我正在努力将变量从数据库更改为可用的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的文字而不是数字?我们将非常感激地提供任何帮助。
答案 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
}