2011-11-25 2 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()을 수행합니다. 이것은 첫 번째 항목을 보지 못하는 이유를 설명 할 수 있습니다. (이 테스트를하지 않은 경고) 대신에 DataTable을을 사용하여 다음과 같이 코드를 수정하십시오 :

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, 즉 내가 필요한 매우 가깝습니다, 유일한 문제는,이 행 단위로 작동하지 않습니다 해당 행 colors = "None"이면 선택한 행만 해결할 수 있습니다. 내가 행별로 이것을 어떻게하면 좋을까? 지금까지 도와 줘서 고마워. – Scrappy

+0

무슨 뜻인지 모르겠다. 위의 코드는 기본적으로 코드와 정확히 동일하지만 판독기 대신 datatable을 사용합니다. 원래 코드는'dr.Read()'를 한 번만 호출 했으므로 어쨌든 한 번의 반복 만 수행했을 것입니다. 처음에는 내 솔루션에서 모든 데이터를 드롭 다운으로 채우고 있습니까? – oscilatingcretin

+0

위의 코드는 내 드롭 다운을 채 웁니다. 그러나 예를 들어 첫 번째 값이 "Medium Red"이면 각 반복의 크기와 색상이 표시되므로 두 번째 값이 "Medium None"인 경우에도 "Medium"이 아닌 "Medium"이 표시됩니다 모든 반복에서 체크를 수행하지 않습니다. 마찬가지로 첫 번째 값이 "Medium None"이면 "Medium"으로 표시되지만 두 번째 값 인 "Medium Red"도 "Medium"으로 표시됩니다. 기본적으로 모든 행마에서 그것을 평가할 필요가 있습니다. 지금까지 도움을 주셔서 감사합니다. 대단히 감사합니다. – Scrappy

0

두 개의 레코드 세트를 반환하도록 doGetAllSizesForProduct 저장 프로 시저를 변경하는 방법은 어떻습니까?

첫 번째 레코드 집합은 이전과 동일한 내용을 포함하는 두 번째 레코드 집합에 포함 된 데이터 형식을 나타내는 단일 행을 반환 할 수 있습니다.

0

당신은 이런 식으로 UI 컨트롤을 바인딩 첫 번째 레코드의 값을 얻을 수있는 하나의 Read을 실행,이 같은 DataReader를 사용 안됩니다

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

내가 개인적으로 DataTable을 사용을 UI 컨트롤에 바인딩하거나 dr.Read()에 대한 호출을 제거하고 어떻게 작동하는지보십시오.

관련 문제