ASP.NET ListBox数据绑定前选定的值

3
标准的ASP.NET ListBox控件有DataTextField和DataValueField属性用于数据绑定,我需要的是类似DataSelectedField属性。
例如,我有一个包含之前选定值的数据库,我只想重新绑定到ListBox上。
最好的方法是什么?
为了让大家更清楚我要找的是什么,请看下面的代码:
我有一个ListBox:
<asp:ListBox runat="server" ID="lbxStuff" SelectionMode="Multiple">
</asp:ListBox>

设置其值:

public static List<Triplet> GetDummyData()
{
    return new List<Triplet>
    {
        new Triplet("A", 1, true),
        new Triplet("B", 2, false),
        new Triplet("C", 3, true)
    };
}

protected void BindList()
{
    List<Triplet> items = GetDummyData();
    foreach (Triplet item in items)
    {
        lbxStuff.Items.Add(new ListItem(item.First.ToString(), item.Second.ToString())
        {
            Selected = (bool)item.Third
        });
    }
}

protected void Page_Load(object sender, EventArgs e)
{        
    if (!IsPostBack)
    {
        BindList();
    }
}

但是这样做感觉过于麻烦了,一定有更好/更快、更标准的方法实现吧?比如通过一个 ObjectDataSource?否则我就必须通过 WebControlAdapter 添加自己的 DataSelectedField 属性(同样过度设计)。


2
如果您已经在数据库中拥有这些内容,那将它们绑定到列表框中的问题是什么? - Bastardo
好的,再编辑它们,例如ListBox包含A、B、C,只有B被选中了,所以当编辑时,我想重新绑定,显示B已被选中并允许用户进行其他新选择。我知道如何在程序中实现这个,我只想知道最好的实现方法是什么? - Helix
如果我理解正确的话,ViewState 可以被使用。你可以将选中行的 ID 保存在 ViewState 中,在绑定后,你可以使用该值设置列表框的选中行。 - Bastardo
只是为了给你一个真实的场景:管理员从角色列表框中为用户选择角色。 - Helix
这仅仅感觉像是标准、显而易见和普遍的东西,让人感到奇怪的是,竟然没有一个标准的实现。 - Helix
是的,这看起来很明显,我看不出普通数据绑定有任何性能损失或任何负面影响。老师可能会找到一种方法,请尝试通过编辑您所做的新事物来保持您的问题活跃,祝好运。 - Bastardo
1个回答

0

我认为这样的代码应该可以解决问题:

public static List<Triplet> GetDummyData()
{
    return new List<Triplet>
    {
        new Triplet("A", 1, false),
        new Triplet("B", 2, true),
        new Triplet("C", 3, false)
    };
}

protected void BindList()
{
    var dummyData = GetDummyData();

    var selected = (from item in dummyData
                   where item.Third = true
                   select item).First();

    lbxStuff.DataSource = dummyData;
    lbxStuff.DataTextField = "First";
    lbxStuff.DataValueField = "Second";
    lbxStuff.DataBind();

    if (selected != null) lbxStuff.SelectedValue = selected.Second
}

protected void Page_Load(object sender, EventArgs e)
{        
    if (!IsPostBack)
    {
        BindList();
    }
}

嗯,这个想法是“绑定”三元组中看到的第三个值,即指示其被选中的值,就像在示例片段中所看到的那样,实际上你完全将其丢弃了。 - Helix
非常抱歉我误读了您的帖子。我修改了我的答案,包括一个粗略的 LINQ 查询,应该可以让您告诉 ListBox 根据从数据库返回的内容选择哪个 ListItem。 - chprpipr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接