2013-04-01 2 views
0

저는 asp.net (C#)의 초보자이며 소셜 네트워킹 응용 프로그램을 작성 중입니다. 나는 상태 업데이트와 코멘트 섹션을 고수했다. 나는 페이지가로드 될 때 상태 (status)에 대한 ItemTemplate을 만들고 숨겨진 필드에 Thread_ID를 할당 했으므로 모든 스레드 (status ')가 데이터리스트 내부의 숨겨진 필드에 ID를 가져야한다. 그러나 문제는 hiddenfield가 다른 Items에 다른 값을 가지지 않는다는 것입니다. 나는 실수를 어디에서하고 있는지 모른다. 도와주세요. 여기 datalist 내부의 숨겨진 필드에 대한 바운드 값이 특정 항목이 아닙니다.

은 DataList에 코드입니다 :

<asp:DataList ID="DataListStatus" runat="server" RepeatColumns="1" 
      onitemdatabound="DataListStatus_ItemDataBound" 
      onitemcommand="DataListStatus_ItemCommand"> 
     <ItemTemplate> 
      <table width="550px"> 
       <tr><asp:HiddenField ID="HFieldThreadID" Value='<%#Eval("Thread_ID") %>' runat="server" /> 
        <td style="vertical-align:top; width:50px;" align="left" rowspan="3"><a href='UserProfile.aspx?loginid=<%#Eval("RegID")%>' ><img alt="Propic" src="../Images/ProPic.jpg" width="50px" height="50px" /></a></td> 
        <td style="vertical-align:top; width:250px;" align="left"><a href='UserProfile.aspx?loginid=<%#Eval("RegID")%>' ><%#Eval("RegID")%></a></td> 
        <td style="vertical-align:top; width:250px;" align="right"><%#Eval("St_Time") %></td> 
       </tr> 
    </table> 
    </ItemTemplate> 
</asp:DataList> 

을 그리고 여기에 코드 뒤에이다 : 나는이 의견에 대한 내부 DataList에에에 HiddenField의 값을 사용하고

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     da.SelectCommand = new SqlCommand("SELECT * FROM Status where RegID='" + Session["user"].ToString() + "'", con); 
     con.Open(); 
     da.Fill(ds, "status"); 
     con.Close(); 
     DataListStatus.DataSource = ds.Tables["status"]; 
     DataListStatus.DataBind(); 
    } 

} 

그리고 여기 :

protected void DataListStatus_ItemDataBound(object sender, DataListItemEventArgs e) 
{ 
    da.SelectCommand = new SqlCommand("SELECT * FROM Comment WHERE Thread_ID='" +  ((HiddenField)e.Item.FindControl("HFieldThreadID")).Value + "'", con); 
    con.Open(); 
    da.Fill(ds, "cmts"); 
    con.Close(); 
    ((DataList)e.Item.FindControl("DataListCmt")).DataSource = ds.Tables["cmts"]; 
    ((DataList)e.Item.FindControl("DataListCmt")).DataBind(); 
} 

답변

0

내가주의하는 것 중 하나는 ItemDataBound입니다. e.Item is 항목의 검색 및 바인딩 전에 Item 또는 AlternatingItem 유형의

참고 : SQL 삽입을 방지하려면 매개 변수가있는 쿼리를 사용하십시오.

protected void DataListStatus_ItemDataBound(object sender, DataListItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || 
     e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
    da.SelectCommand = new SqlCommand("SELECT * FROM Comment WHERE Thread_ID='" +  ((HiddenField)e.Item.FindControl("HFieldThreadID")).Value + "'", con); 
    con.Open(); 
    da.Fill(ds, "cmts"); 
    con.Close(); 
    var dataList = (DataList)e.Item.FindControl("DataListCmt"); 
    dataList.DataSource = ds.Tables["cmts"]; 
    dataList.DataBind(); 
    } 
} 
+0

나는 내 코드에 대한 귀하의 제안의 효과가 무엇인지해야합니다. 이 검사가 무엇인지 말해 주시겠습니까? (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)? 그런데 나는 다른 실수를 저지르고 있었다. 다음 스레드에 할당하기 전에 데이터 집합을 지우지 않았으므로 숨겨진 필드의 값이 같다고 느꼈습니다. 답변 해 주셔서 감사합니다. – Don

+0

참고 : SQL 삽입을 방지하려면 매개 변수가있는 쿼리를 사용하십시오. 이 제안에 대해 감사드립니다. 사실 나는 이것을 알고 있지만 조금 힘들고 지루하다고 느끼기 때문에 나중에 이것을 할 수 있습니다. 작은 따옴표 (')를 삽입하면 더 많은 문제가 해결 될 수 있습니다. – Don

0

숨겨진 필드를 사용하지 마십시오. 페이지로드 시간 때문에이 숨겨진 필드 필드가 지워졌습니다. 레이블 컨트롤에서 label 컨트롤을 사용하고 visible = "false"로 설정하십시오.

그리고 pageload 이벤트! IsPostBack을의 내부 DataList에 바인딩 메서드 호출

+0

'HiddenField'는 뷰 상태를 가지고 있기 때문에'hidden-field 필드는 페이지로드시에 지워졌습니다'는 ***가 맞지 않습니다 ***. **'HiddenField'에 저장된 값은 포스트 백 사이에 남아 있습니다. ** – Win

+0

** DataList 바인딩 메소드는 ** DataLists **로 중첩되어 있으므로 @ Don의 코드에서 정확합니다. – Win

+0

@Win이 옳습니다. 그리고 다시 한 번 코드를 사용하여 다시 게시 할 수 있기 때문에 데이터 바인딩 방법을 사용할 수 없습니다! IsnotpostBack. 답장을 보내 주셔서 감사합니다. – Don

관련 문제