【问题标题】:How do I use Multiple controls using the same ObjectDataSource, but with different filters如何使用多个控件使用相同的 ObjectDataSource,但使用不同的过滤器
【发布时间】:2012-04-06 19:44:34
【问题描述】:

我正在优化 ASP.Net WebForms。

在我的例子中,我有 2 个下拉菜单和一个网格。

我希望下拉菜单充当网格的过滤器,每个下拉列表在网格的一列中包含不同的数据列表(用作过滤器)

没关系.. 我得到它的工作,但我不能再使用与网格相同的数据源作为下拉菜单,因为我正在将过滤器表达式应用于数据源以过滤网格中的内容。

由于它与下拉列表的数据源相同,因此我在下拉列表中获得了一个较小的不同列表。

现在我可以使用多个数据源,每个数据源都使用相同的数据对象,但我在 Sql Profiler 中看到进行了 2 个数据调用,但我真的很想使用同一个,这样我就可以进行一个数据调用。

是否甚至可以为网格过滤单个 ObjectDataSource,同时为另一个控件提供未过滤的数据?

【问题讨论】:

  • 是否可以将数据保存在ViewState 中而不是一遍又一遍地访问数据库?
  • 是的,它在范围内。这两个答案实际上给了我一个想法。我仍然使用 ObjectDataSource,但我将 SelectMethod() 转换为 DataTable,并在其上执行了一堆 Linq,以避免额外访问数据库。

标签: c# asp.net c#-4.0 webforms


【解决方案1】:

如果您专注于不必进行多次 SQL 调用,一种选择是使用 LINQ 在您的SelectMethod 中查询您的DataSet。在语法上可能有一种更优雅的方法(我想不出来),但这应该使用单个 ObjectDataSource 提供您想要的功能。

如果您的 ObjectDataSource 声明如下所示:

<asp:ObjectDataSource ID="myObjectDataSource" runat="server" SelectMethod="myObjectDataSource_Select" OnFiltering="myObjectDataSource_Filtering">

在您的SelectMethod 中,您可以执行以下操作:

public DataSet myObjectDataSource_Select()
{
   string sqlQuery = "SELECT col1, col2, col3 FROM foo";
   SqlDataAdapter da = new SqlDataAdapter(sqlQuery, myConnectionString);
   DataSet ds = new DataSet();
   using (da) {
        da.Fill(ds);
   }

   //Perform your secondary filtering here
   object [] unfilteredQuery= (from r in ds.Tables[0].AsEnumerable()
        select r.Field<string>(“col1”)).ToArray();
   myUnfilteredComboBox.Items.Clear();
   myUnfilteredComboBox.Items.AddRange(unfilteredQuery);

   return ds;    
}

【讨论】:

  • @KevinDeus 这有帮助吗?如果由于某种原因无法实现您的目标,我们非常乐意进行更多研究。
  • 我发现代码有一点改进。你能看看我的帖子吗?
【解决方案2】:

你在使用 Linq 吗?如果是,那应该是可能的:

// Loading complete data into object
var myCompleteDataSource = (from c in ctx select c).ToList();

// Filtering the already loaded data
var myFilteredDataSource = myCompleteDataSource.Where(o=>o.MyField=="abc").ToList(); 

然后只需将数据源设置为您的对象。

这将只从数据库中加载一次数据(第一个.ToList() 方法),并将对象列表过滤到第二个对象中,而无需再次访问数据库。

【讨论】:

    【解决方案3】:

    正如您所说“由于它与下拉菜单相同的数据源,我得到一个 下拉列表中较小的不同列表。”

    您可以将Database Information 保留在ViewState 中。这样,您可以阻止 Request to Database 为您的客户端请求。因此Reducing the Access time

    示例

    public DataTable Employees
    {
        get
        {
            if (ViewState["Employees"] == null)
            {
                return FollowsDAL.GetAllEmployees();
            }
            return (DataTable)ViewState["Employees"];
        }
        set
        {
            ViewState["Employees"] = value;
        }
    }
    

    如何使ViewState 数据过滤更快?

    答案是 - 请不要使用Update Panel。我将使用Page Method

    请查看以下示例。我用Update PanelScript Manager


    输出

    要显示 22 个字符的字符串,您可以检查正在接收和发送到服务器的数据量。想象一下

    1. 如果您考虑使用更新面板将每个请求发送到数据库并且您的 GridView 位于 Update Panel!!!!!!
    2. 如果您要为每个请求使用 ViewState 数据,并在 GridView 内使用 Update Panel

    根据我的理解,上述两种技术都是最差的。


    现在我将向您描述页面方法

    更新面板上的页面方法

    Page methods 允许ASP.NET AJAX 页面直接执行Page’s Static Methods,使用JSON (JavaScript Object Notation)。我们可以使用web method 代替posting back and then receiving HTML markupcompletely replace our UpdatePanel’s contents,只请求我们感兴趣的信息。

    示例代码


    输出


    所以结论是我肯定会使用ViewState BUTPage Methods

    ViewState 数据的过滤技术。

    public static class GetFilteredData
    {
        public static DataTable FilterDataTable(this DataTable Dt, 
                                                             string FilterExpression)
        {
            using (DataView Dv = new DataView(Dt))
            {
                Dv.RowFilter = FilterExpression;
                return Dv.ToTable();
            }
        }
    }
    

    示例

    DataTableObject.FilterDataTable("Search Expression")
    

    您好 vpiTriumph... 我发现代码有所改进。以下是建议的方法。

    C Sharp 中的示例代码

    private void DsataBaseInteraction()
    {
        using (SqlConnection con = new SqlConnection("Your Connection String"))
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.Connection = con;
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandText = "Your Stored Procedure name";
                using (SqlDataReader DR = cmd.ExecuteReader())
                {
    
                }
            }
        }
    }
    

    @KevinDeus - 我假设正在使用的DatabaseSQL Server。所以下面提到的是我在Database中对Stored Procedure的建议。

    Create Proc ProcedureName
    @UserName Varchar(50),
    @Password Varchar(50),
    @Email Varchar(50)
    As
    SET NOCOUNT ON
    SET XACT_ABORT ON
    
    Begin Try
        Begin Tran
            Insert into Account (Username,Password, Email)
            Values(@UserName, @Password, @Email)
        Commit Tran 
    End Try
    
    Begin Catch
        Rollback Tran
    End Catch
    

    参考是 HereHere

    【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2019-09-09
    • 1970-01-01
    • 2013-12-11
    • 2014-12-23
    • 1970-01-01
    • 2012-04-28
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多