2011-04-04 152 views
1

在我的C#winforms中,我從DataTable綁定數據到DropDownList。數據在窗體中可見,但我無法獲取此DropDownList的SelectedValue。無法投入'System.Data.DataRowView'類型的對象來鍵入System.IConvertible

如果我訪問的SelectedValue那麼就說明這個錯誤:

unable to cast the object of type 'System.Data.DataRowView' to type System.IConvertible. 

和應用程序關閉。

有兩個或三個其他DropDownList以相同的方式綁定,他們都工作正常。

爲DropDownList的代碼是:

LstDriverName.DisplayMember = "DriverName"; 
LstDriverName.ValueMember = "Driverid"; 
DriverDetail Driverdetails = new DriverDetail(Constr); 
LstDriverName.DataSource = Driverdetails.SelectAllNames(); 

這裏Driverdetails.SelectAllNames()返回一個數據表。

如果我在即時窗口中檢查該值:

?LstDriverName.SelectedValue.ToString() 
"System.Data.DataRowView" 

,並在該消息中顯示的地方是:

NewBill = new TransportationBill(Constr); 
NewBill.DriverId = Convert.ToInt32(LstDriver.SelectedValue); 
+0

'SelectAllNames()'返回什麼?選擇的值應該是對DataRowView對象的引用是非常奇怪的,但是如果這樣做肯定會導致當您嘗試將其傳遞給'System.Convert'中的任何東西時收到的錯誤。 – David 2011-04-04 11:03:54

+3

DisplayMember和ValueMember區分大小寫。 – stuartd 2011-04-04 11:07:45

+2

我敢打賭,這將是這裏的問題。由於區分大小寫的'ValueMember'不匹配,所以'SelectedValue'返回集合中的實際對象,而不是從對象中提取的值。 – 2011-04-04 11:09:28

回答

0

你可以試着這樣做:

NewBill = new TransportationBill(Constr); 
NewBill.DriverId = Convert.ToInt32(LstDriver.SelectedValue.Item["Driverid"]); 

不過,很奇怪你得到System.Data.DataRowView類型的物品

-1

由於您已綁定到DataTable,因此各個項目的類型爲DataRowView。這些與DataRow非常相似:它們具有包含您的數據的列。

您嘗試將整行數據轉換爲整數是沒有意義的。你可能想要的更多的是這樣的:

var selectedRow = (DataRowView) LstDriver.SelectedValue; 
NewBill.DriverId = Convert.ToInt32(selectedRow["Driverid"]); 

你想轉換所選行的「驅動器」列,而不是整個行。

事實上,如果「Driverid」列已經是一個整數,那麼你不需要轉換它。相反:

NewBill.DriverId = (int) selectedRow["Driverid"]; 
相關問題