Значение привязки к скрытому полю внутри списка данных не является специфическим для элемента
Я новичок в asp.net(C#) и работаю над приложением для социальных сетей. Я застрял в разделе обновления статуса и комментариев. Я хочу, чтобы при загрузке страницы все потоки (status') имели свои идентификаторы в своих скрытых полях внутри списка данных, так как я создал ItemTemplate для статуса и назначил Thread_ID скрытому полю. Но проблема в том, что скрытое поле не имеет разных значений для разных предметов. Я не знаю, где я делаю ошибку. Пожалуйста, помогите мне.
Вот код для 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();
}
}
И здесь я использую значение скрытого поля во внутреннем списке данных для комментариев:
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();
}
2 ответа
Не используйте скрытое поле. Поскольку время загрузки страницы, это поле скрытого поля было очищено. Поэтому, пожалуйста, используйте элемент управления label и установите visible="false" в элементе управления label.
И должен вызвать метод привязки DataList Внутри!IsPostBack в событии загрузки страницы
Одна вещь, которую я замечаю в 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();
}
}