0

我是 asp.net(C#) 的初学者,我正在开发一个社交网络应用程序。我一直停留在状态更新和评论部分。我希望在加载页面时所有线程(状态')都应该在数据列表内的隐藏字段中具有它们的 ID,因为我已经为状态创建了一个 ItemTemplate 并将 Thread_ID 分配给隐藏字段。但问题是隐藏字段对于不同的项目没有不同的值。我不知道我在哪里做错了。请帮我。

这是数据列表的代码:

<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>

这是背后的代码:

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();
}
4

2 回答 2

0

不要使用隐藏字段。因为页面加载时这个隐藏字段被清除了,所以请使用标签控件并在标签控件中设置visible="false"。

并且必须在页面加载事件中调用 !IsPostBack 内部的 DataList 绑定方法

于 2013-04-01T19:12:37.820 回答
0

我注意到的一件事ItemDataBound是您要确保e.Item is类型ItemAlternatingItem在搜索和绑定项目内的控件之前。

注意:请使用参数化查询以避免 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();
   }
}
于 2013-04-01T16:21:02.173 回答