【问题标题】:ASP.NET ListBox DataBind Previous Selected ValuesASP.NET ListBox DataBind 以前的选定值
【发布时间】:2012-02-19 12:20:15
【问题描述】:

标准 ASP.NET ListBox's 有一个 DataTextFieldDataValueField 用于数据绑定,我正在寻找的是一个 DataSelectedField 属性。

例如我有一个数据库,其中包含以前选择的值,我只想重新绑定到 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 属性? (再次矫枉过正)

【问题讨论】:

  • 如果您的数据库中已经有它们,那么将它们绑定到列表框有什么问题?
  • 好吧,再次编辑它们,例如ListBox 包含 A、B、C 只选择了 B,所以在编辑时我想重新绑定,显示 B 被选中并允许用户进行其他新选择。我知道如何以编程方式做到这一点,我只想知道实现这一目标的最佳方法是什么?
  • 如果我理解正确,我认为可以使用 ViewState,您可以将所选行的 id 保留在 ViewState 中,绑定后您可以使用该值设置列表框的所选行。
  • 只是给您一个真实的场景:管理员从角色列表框中为用户选择角色。
  • 这感觉就像是标准的、明显的和一般的东西,感觉很奇怪,它们不会成为标准实现。

标签: asp.net data-binding listbox


【解决方案1】:

我认为按照这些思路应该可以解决问题:

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();
    }
}

【讨论】:

  • mmmm,这个想法是“绑定”在 Triplet 中看到的第三个值,这是表示它被选中的值,就像在示例 sn-p 中看到的那样,你实际上完全把它扔掉了
  • 对于误读您的帖子,我深表歉意。我已经更改了我的答案,在 LINQ 查询中包含了一个粗略的提示,它应该允许您根据从数据库返回的内容告诉 ListBox 要选择哪个 ListItem。
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多