代码之家  ›  专栏  ›  技术社区  ›  Erik Funkenbusch

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

  •  0
  • Erik Funkenbusch  · 技术社区  · 14 年前

    string.Format("Checkbox{0}", DataBinder(e.Item.DataItem, "ID")) . 问题是,这只适用于非回发条件,因为回发时DataItem为null。当然,ItemDataBound不会在PostBack上调用,所以这也不起作用。

    我似乎找不到一个好办法来处理这一点 if (IsPostback) dataList.Bind() ,我认为这不是一个好办法。

    有人能给我提供其他选择吗?

    编辑:

    一些附加信息。我刚刚意识到问题的一部分是因为我实际上在一个数据列表中有一个数据列表。DataItem为null的原因是回发时没有数据绑定,并且子数据未保存到viewstate。

    This ,尽管它使用的是数据列表而不是中继器。因此,在回发时,不会设置子集合,因为回发时不会调用ItemDataBound。

    EDIT2:澄清一下,问题主要是因为嵌套的数据列表。我必须将嵌套数据列表的数据源设置为第一个数据列表的单个行字段的集合字段。在postback上,没有数据绑定,因此不起作用。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Community Nick Bolton    7 年前

    你可以使用和我在书中写的相似的技巧 this answer

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

    这是一个解决办法,而不是 你想做什么,但它的工作!