【问题标题】:How do I access databound dataset for control programatically?如何以编程方式访问数据绑定数据集以进行控制?
【发布时间】:2012-06-14 09:53:55
【问题描述】:

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

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

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

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

非常感谢任何建议!

【问题讨论】:

  • 以编程方式设置控件的数据源比使用 SqlDataSource 灵活得多。

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


【解决方案1】:

我认为您遇到的主要问题来自使用 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");
}

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

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 2018-08-14
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多