作为asp:Checkboxes没有值的解决方法,我试图在DataList中动态创建复选框的ID,以便将主键插入控件ID。这非常困难。
我在我的DataList ItemTemplate中放置了一个PlaceHolder,然后在ItemCreated中我使用string.Format("Checkbox{0}", DataBinder(e.Item.DataItem, "ID"))
创建了复选框。问题是这只能在非回发条件下工作,因为在回发时DataItem为null。当然,在PostBack上不会调用ItemDataBound,因此也无法正常工作。
我似乎无法找到一个很好的方法来处理if (IsPostback) dataList.Bind()
的这个缺点,我认为这不是一个很好的方法。
有人可以在这提供任何替代方案吗?
编辑:
一些其他信息。我刚刚意识到问题的一部分是因为我实际上在DataList中有一个DataList。 DataItem为null的原因是因为回发没有数据绑定,并且子数据未保存到viewstate。
基本上,我正在做的是This,虽然它使用的是DataList而不是Repeater。因此,在回发时,子集合不会被设置,因为在回发时没有调用ItemDataBound。
EDIT2:澄清一下,问题主要是因为嵌套的数据主义者。我必须将嵌套datalist的数据源设置为第一个datalist的各个行字段的collection字段。在回发时,没有数据绑定,因此它不起作用。
答案 0 :(得分:1)
您可以使用与我在this answer中编写的技术类似的技术 - 在ItemTemplate中添加常规CheckBox和HiddenField控件,并将HiddenField绑定到主键值,例如。
<ItemTemplate>
<tr>
<td>
<asp:CheckBox runat="server" ID="MyCheckBox" AutoPostBack="true" oncheckedchanged="MyCheckBox_CheckedChanged" />
<asp:HiddenField runat="server" id="DatabaseKeyHiddenField" Value='<%# Eval("DatabaseKey") %>' />
</td>
</tr>
</ItemTemplate>
protected void MyCheckBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox selectedCheckBox;
DataListItem selectedDataListItem;
HiddenField databaseKeyHiddenField;
string databaseKey;
// Cast the sender object to a CheckBox
selectedCheckBox = (CheckBox)sender;
// Walk up the tree one level so we get the container for both controls
selectedDataListItem = (DataListItem)selectedCheckBox.Parent;
// Get the HiddenField control ...
databaseKeyHiddenField = (HiddenField)selectedDataListItem.FindControl("DatabaseKeyHiddenField");
// ... and read the value
databaseKey = databaseKeyHiddenField.Value;
// Go off and do a database update based on the key we now have
...
}
这是一个解决方法,而不是完全你想做什么,但它的确有效!