使用基于绑定数据的ID创建动态DataList控件

时间:2010-06-28 07:10:57

标签: asp.net

作为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字段。在回发时,没有数据绑定,因此它不起作用。

1 个答案:

答案 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
    ...
}

这是一个解决方法,而不是完全你想做什么,但它的确有效!