回发后如何访问数据绑定项?
我有一个数据列表,当用户选择一个项目时, OnItemCommand 事件触发,我的事件处理程序看起来像这样:
protected void dlResults_Select(object sender, DataListCommandEventArgs e)
{
MyItem item = e.Item.DataItem as MyItem;
}
项目始终为空。有没有办法访问数据绑定项目?
只有通过 ItemDataBound 事件访问时,DataItem 属性才不为空。如果您需要一个 ID 来修改您的对象/记录,您可以设置 DataList 的DataKeyField属性来填充 DataKeys 集合。
<asp:DataList ID="DataList1" runat="server" DataKeyField="id">
</asp:DataList>
然后,您可以在 OnItemCommand 事件中使用 id 来实例化所需的对象,或作为数据库查询的参数。
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
int id = Convert.ToInt32(DataList1.DataKeys[e.Item.ItemIndex]);
MyItem item = new MyItem(id);
}
我发现解决此类问题的最简单方法是向控件添加一个 javascript 事件,该事件使用控件的选定值更新输入控件(类型=隐藏)。如果您将 runat=server 属性添加到标签,您可以访问输入控制服务器端并从中读取值。回发应该在 javascript 事件之后触发,因此其他一切都应该为您“正常”工作。
只有在了解您进行数据绑定的方式后,才能为您的问题提供适当的答案。您是通过调用数据列表的 .DataBind() 方法从代码中进行数据绑定,还是向数据列表提供数据源以进行绑定。我问这个问题的原因是,如果您使用代码中数据列表的 .DataBind() 方法来绑定数据列表,则必须在每次回发时调用它,以确保数据列表再次获得数据绑定。否则,在回帖后,您将看到数据列表显示为空。如果您使用其 DataSource 或 DataSourceId 属性为要绑定的数据列表提供数据源,则每次回发时数据列表的数据绑定由框架处理,您不必担心这一点。
但是从事物的外观来看,我相信您将值设为 null 因为您试图在错误的位置获取 DataItem 的值。请记住,您必须遵循控件的正确生命周期才能使其以您希望的方式为您工作。
如果您能回答我上面的问题,我可以提供更好的答案。您目前的陈述似乎不足以提供相关答案。
这里有一些建议。