2014-05-06 61 views
1

早上好,堆棧器!ASP VB NET列表(T)找不到每個循環的方法

我正在設計一個大規模的更新頁面。以下是一般步驟:

  1. 我有一個名爲item的類,它有兩個屬性:設備號和新的到期日期。
  2. 我有一個文本框,我從Excel中粘貼值,這些值由兩列分隔的一個vbtab字符組成:列是一個設備號和一個新的截止日期
  3. 單擊一個按鈕,文本框中的值是解析爲一個列表(項目),並且設備主控爲命令文本的SQL標準構建一個字符串。
  4. 該命令從數據庫中填充數據集,該數據庫獲取設備編號和當前到期日期。
  5. 我手動添加一列到數據集(新的截止日期)
  6. 我遍歷數據集的行,我使用list(item)find方法匹配列表中的設備並從數據庫中獲取來自文本解析值的新的截止日期。在數據集中使用find方法超過1個行時
  7. 一切都順利,不同之處在於,該方法失敗:

這裏是從點5和6的代碼:

da.Fill(ds, "Equipments") 
dt = ds.Tables(0) 
ds.Tables(0).Columns.Add("column_1", Type.GetType("System.DateTime")) 
Dim rw As DataRow 
For Each rw In ds.Tables(0).Rows 
    Dim strsearch As String = rw(0).ToString 
    Dim fequnumb As item = myItemList.Find(Function(p) p.EquipNumber = strsearch) 
    rw(2) = fequnumb.DueDate <- Error occurs here 
Next 

同樣,如果代替ftechid.DueDate我把喜歡Today()的代碼運行正常的循環,並正確填寫GridView控件,但如果我離開ftechid.DueDate那麼錯誤的第一行後拋出一個靜態值:

Object reference not set to an instance of an object. 

任何幫助是非常讚賞至於如何使用find方法的for..each循環

+0

你覺得如果查找無法將strsearch變量相匹配會怎樣呢? – Steve

+0

@Steve這意味着來自用戶的Excel列表已過時,並且設備不再存在於數據庫中。這是代碼中的一個防錯功能。我不會把這個值放在gridview中,在那裏我會有另一個按鈕來更新用戶查看後的值。 –

+0

我建議你使用調試器。在Find行放置一個斷點,然後檢查變量strsearch的值和fequnumb中的返回值。有些東西不是你想要的 – Steve

回答

1

內如果查找功能無法匹配字符串要求它返回Nothing,然後你不能設置從變量在到期日沒什麼。如果這是預期的輸入條件,那麼您需要使用類似的方法來保護賦值到新列。

For Each rw In ds.Tables(0).Rows 
    Dim strsearch As String = rw(0).ToString 
    Dim fequnumb As item = myItemList.FirstOrDefault(Function(p) p.EquipNumber = strsearch) 
    if fequnumb IsNot Nothing Then 
    rw(2) = fequnumb.DueDate <- Error occurs here 
    End if 
Next 

如果這是不應該發生的,那麼你需要檢查你的輸入

+0

你是對的,我發現當我建立我的列表它保存6次相同的值。當我設法糾正錯誤時,我會發布更新後的代碼。 –

+0

問題出在第3步。我在'for..loop'中構建了'list(of item)',但忘記在循環中放置'item1 = new item',以便重設每遍中的值。 感謝您的幫助 –