C# 数据列表中hiddenfield的绑定值不是特定于项的
我是asp.net(C#)的初学者,正在开发一个社交网络应用程序。我一直停留在状态更新和评论部分。我希望在加载页面时,所有线程(status')都应该在数据列表中的hiddenfields中有它们的ID,因为我已经为status创建了一个ItemTemplate,并为hiddenfield分配了Thread_ID。但问题是hiddenfield对于不同的项没有不同的值。我不知道我在哪里犯了错误。请帮帮我 以下是datalist的代码:C# 数据列表中hiddenfield的绑定值不是特定于项的,c#,asp.net,datalist,hiddenfield,C#,Asp.net,Datalist,Hiddenfield,我是asp.net(C#)的初学者,正在开发一个社交网络应用程序。我一直停留在状态更新和评论部分。我希望在加载页面时,所有线程(status')都应该在数据列表中的hiddenfields中有它们的ID,因为我已经为status创建了一个ItemTemplate,并为hiddenfield分配了Thread_ID。但问题是hiddenfield对于不同的项没有不同的值。我不知道我在哪里犯了错误。请帮帮我 以下是datalist的代码: <asp:DataList ID="DataListS
<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>
在这里,我使用内部数据列表中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();
}
我在
ItemDataBound
中注意到的一点是,在搜索和绑定项内的控件之前,您需要确保e.Item是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();
}
}
不要使用隐藏字段。因为页面加载时间已清除此隐藏字段。因此请使用label控件并在label控件中设置visible=“false”
并且必须在内部调用DataList绑定方法!页面加载事件中的IsPostBack隐藏字段在页面加载时间被清除
不正确,因为隐藏字段
具有视图状态。HiddenField
中存储的值在回发之间持续存在。DataList绑定方法在@Don的代码中是正确的,因为它是嵌套的DataList。@Win是正确的。还有一件事,我想用回发一次又一次地执行代码,所以我不能把数据绑定方法放进去!我没有回邮。顺便说一句,谢谢你的回答。我不知道你的建议对我的代码有什么影响。如果(e.Item.ItemType==ListItemType.Item | | e.Item.ItemType==ListItemType.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();
}
}