2011-11-25 91 views
1

我試圖在決定將什麼輸入到ASP.net下拉列表中之前檢查字段的值。DataReader.Read()跳過記錄集的第一行

我正在使用datareader.Read()爲了讀取記錄集,所以我可以做到這一點。但是,這會跳過第一行數據。 。下拉框基本上是大小和顏色的列表。 。 。所以目前我缺少第一個尺寸。

下面是代碼:

Using cmd As New SqlCommand("doGetAllSizesForProduct", oConn) 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.Parameters.AddWithValue("@id", CType(Request.QueryString("id"), Integer)) 
    oConn.Open() 
    Using dr As SqlDataReader = cmd.ExecuteReader() 
    If dr.HasRows() = True Then 
     dr.Read() 
     ddlSize.Visible = True 
     pnlSize.Visible = True 
     pnlNoStock.Visible = False 
     If dr("colour") = "None" Then 
     ddlSize.DataTextField = "size" 
     Else 
     ddlSize.DataTextField = "sizeColour" 
     End If      
     ddlSize.DataValueField = "mapperid" 
     ddlSize.DataSource = dr 
     ddlSize.DataBind() 
    Else 
    End If 
    dr.Close() 
    End Using 
End Using 

我想要麼必須有比讀或其他方式的另一種方法來阻止它跳過第一個記錄?

回答

3

我從來沒有見過一個datareader被用作數據源。我認爲正在發生的事情是,您的第一個電話dr.Read()正在跳至第一個記錄,如預期的那樣。但是,當您將閱讀器指定爲數據源時,它將執行自己的dr.Read()邏輯,其內部從下一條記錄開始。這可以解釋爲什麼你沒有看到第一個項目。嘗試修改這樣的代碼中使用數據表,而不是(警告,沒有測試這一點):

using dr as SqlDataReader = cmd.ExecuteReader() 
    if dr.HasRows() then 
     ddlSize.Visible = True 
     pnlSize.Visible = True 
     pnlNoStock.Visible = False 

     While dr.Read() 
      dim Value as string = dr("mapperid") 
      dim Text as string = if(dr("colour") = "None",dr("size"),dr("sizeColour")) 
      ddlSize.Items.Add(New ListItem(Text, Value)) 
     End While 
    end if 
    dr.Close() 
end using 
+0

oscilatingcretin,這是非常接近我所需要的,唯一的問題是,它不工作排排找出行顏色=「無」,只有你選擇的行。我將如何使它在逐行的基礎上解決這個問題,感謝您的幫助至今 – Scrappy

+0

我不確定你的意思。上面的代碼基本上和你的代碼完全一樣,但是用一個數據表而不是一個閱讀器。你原來的代碼只能對'dr.Read()'進行一次調用,所以它只能用於一次迭代。對於初學者,我的解決方案是否至少用所有數據填充下拉菜單? – oscilatingcretin

+0

上面的代碼確實填充了我的下拉菜單。但是,例如,如果第一個值是「Medium Red」,那麼它會顯示每個迭代的大小和顏色,因此即使第二個值爲「Medium None」,它也將顯示「Medium None」,而不是「Medium」,因爲它沒有對每一次迭代進行檢查。同樣,如果第一個值爲「中等無」,則它將顯示爲「中」,但「中紅」的第二個值也只會顯示爲「中」。我基本上只需要在每一次迭代中對它進行評估,而不僅僅是第0行。感謝您的幫助,非常感謝 – Scrappy

0

如何更改doGetAllSizesForProduct存儲過程以返回兩個記錄集?

第一個記錄集可以返回單個行,指示第二個記錄集中包含的數據類型與之前包含的內容相同。

0

你不應該使用DataReader這樣,執行單個Read得到的第一條記錄的值,那麼UI控件綁定到它:

ddlSize.DataValueField = "mapperid" 
ddlSize.DataSource = dr 
ddlSize.DataBind() 

我會親自使用DataTable綁定到UI控件,或嘗試刪除對dr.Read()的調用並查看它是如何工作的。