【问题标题】:retaining checked items after a databind()在 databind() 之后保留选中的项目
【发布时间】:2011-10-14 23:10:51
【问题描述】:

我正在填充一个数据表,该表又填充了一个复选框列表。我希望在添加项目时选择它们。我可以这样做,但是当我添加第 2 个 -> 第 n 个项目时,它只保留最后一个复选框。有没有办法通过绑定保留选定的复选框?这是我目前的功能:

protected void FinalizeAdd_Click(object sender, EventArgs e)
{

    VersionDataTable.AddVersionDataTableRow(Convert.ToInt32(VersionDropDown.SelectedValue), ProductDropDown.SelectedItem.Text + " " + VersionDropDown.SelectedItem.Text);

    ProductCheckList.DataSource = VersionDataTable;

    ProductCheckList.DataValueField = VersionDataTable.VersionIDColumn.ToString();
    ProductCheckList.DataTextField = VersionDataTable.VersionTextColumn.ToString();
    ProductCheckList.DataBind();

    ProductCheckList.Items[ProductCheckList.Items.Count - 1].Selected = true;
}

提前感谢您的帮助。

【问题讨论】:

    标签: c# asp.net data-binding checkboxlist


    【解决方案1】:

    在再次对 CheckboxList 进行数据绑定之前,您必须保存所选项目。

    例如(对不起 VB.NET,但我想你会明白我的意思):

    Dim oldSelection = (From item As ListItem In ProductCheckList.Items
                        Where item.Selected).ToList
    ' databinding '
    If oldSelection.Any Then
        For Each selectedItem In oldSelection
            Dim item = ProductCheckList.Items.FindByValue(selectedItem.Value)
            If Not item Is Nothing Then
               item.Selected = True
            End If
        Next
    End If
    

    【讨论】:

    • 谢谢,我会在星期一试一试并报告。
    • 好的,但是当您还使用 LINQ 来获取旧的选定项目时,请记住您必须立即执行它(例如使用 ToList() 像上面一样),否则它将在databinding(deferred execution) 并且选择将再次被清除。
    • 我在分配给 oldSelection 时一定做错了,智能感知没有拾取“项目”。我以前没有使用过 LINQ,所以这可能是我的知识库的问题。
    • @Contristo:您使用的是什么目标框架版本(查看项目中的高级编译器设置)?它应该至少为 3.5。 System.Core.dll 是否添加为参考? msdn.microsoft.com/en-us/library/system.linq.aspx
    • 好的,我使用受您的答案启发的变体解决了它,基本上将复选框列表映射到 List 并运行 for 循环以在数据绑定后重新选择项目。再次感谢您的帮助!
    猜你喜欢
    • 2017-11-22
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多