1

我有一个DropDownList控件,该控件通过SqlDataSource其查询返回 3 个字段(Label、、ValueActive)进行数据绑定 - 有没有办法以编程方式访问数据绑定数据集以检查Active标志是真还是假?

我知道这可以在数据绑定期间完成,但我需要Active在阶段检查标志,PreRender因为控件可能需要选择一个值,Active=false如果加载已进行此选择的旧记录。(在 期间PreRender,我将删除所有Active=false项目,除非它是我设置的值DropDownList)。

我通过填充 a 来完美地DataView工作SqlDataSource。基于此选择和比较/删除项目,但两次访问数据库以再次为每个控件获取此信息似乎效率低下。

此外,我无法为所有控件编写一段可重用/通用代码,因为我当前的方法仅在SqlDataSource不需要任何SelectArguments. 如果我可以直接访问数据绑定数据,这也将绕过这个问题。

非常感谢任何建议!

4

1 回答 1

2

我认为您遇到的主要问题来自使用 SqlDataSource 作为您的数据访问。SqlDataSource 易于设置并为您提供即时结果,但它们非常不灵活,需要跨页面重用。

我将创建一个从数据库中获取数据并将其存储在 List 或 IEnumerable 中的函数。如果数据在 List 中,那么您可以通过编程方式访问它,并且验证更容易实现。

下面是一个使用实体框架访问数据库的示例

标记

<asp:DropDownList ID="ddlTest" runat="server"></asp>

代码背后

public List<Record> GetAllRecordsByUserName(string credentials)
{
    List<Record> recordList;
    using (CustomEntities context = new CustomEntities())
    {

        IQueryable<Record> recordQuery = from records in context.Records
                                              where records.UserName == credentials
                                              select records; 
        recordList = recordQuery.ToList<Record>();
    }
    return recordList;
}

public void ValidateAndBind(string username)
{
    List<Record> recordList = GetAllRecordsByUserName(username);

    // Do validation here

    ddlTest.DataSource = recordList;
    ddlTest.DataBind();
}

protected void Page_Load(object sender, EventArgs e)
{
    ValidateAndBind("test.username");
}

您可以使用所需的任何数据访问方法,但以编程方式设置它允许您跨页面重用它。在上面的方法中,我在页面中为空间创建了它。在实践中,您应该创建一个处理特定数据检索的类,通常称为数据访问层

于 2012-06-11T14:27:31.017 回答