我是asp.net(C#)的初学者,我正在开发一个社交网络应用程序。我坚持使用状态更新和评论部分。我希望当页面加载时,所有线程(status')应该在datalist中的hiddenfields中有ID,因为我已经为状态创建了ItemTemplate并将Thread_ID分配给了hiddenfield。但问题是,隐藏字段对于不同的项目没有不同的值。我不知道我在哪里犯这个错误。请帮帮我。
以下是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>
这是背后的代码:
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();
}
}
在这里,我在内部数据列表中使用hiddenfield的值作为注释:
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 :(得分: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();
}
}
答案 1 :(得分:0)
不要使用隐藏字段。因为页面加载时间这个隐藏字段字段被清除。所以请使用标签控件并设置visible =&#34; false&#34;在标签控件中。
并且DataList绑定方法必须在pageload事件中调用Inside of!IsPostBack