7

ASP.NetWebFormsで最適化を行っています。

私の場合、2つのドロップダウンと1つのグリッドがあります。

ドロップダウンをグリッドのフィルターとして機能させたいのですが、各ドロップダウンには、グリッドの1つの列にデータの個別のリストが含まれています(フィルターとして使用するため)。

それで問題ありません。動作しましたが、グリッド内のデータをフィルタリングするためにデータソースにfilterexpressionを適用しているため、ドロップダウンにグリッドと同じデータソースを使用できなくなりました。

ドロップダウンと同じデータソースなので、ドロップダウンに小さな個別のリストが表示されます。

これで、それぞれが同じデータオブジェクトを消費する複数のデータソースを使用できますが、SQLプロファイラーでは2つのデータ呼び出しが行われていることがわかりますが、1つのデータ呼び出しを実行できるように、同じデータソースを使用したいと思います。

単一のObjectDataSourceをグリッド用にフィルター処理すると同時に、フィルター処理されていないデータを別のコントロールに提供することも可能ですか?

4

3 に答える 3

4

複数の SQL 呼び出しを行う必要がないことに重点を置いている場合、1 つのオプションは、LINQ を使用して でクエリを実行することDataSetですSelectMethod。構文的にこれを行うよりエレガントな方法があるかもしれませんが (私にはわかりませんでした)、これは単一の を使用して目的の機能を提供するはず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;    
}
于 2012-04-15T05:00:08.707 に答える
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(); 

次に、データソースをオブジェクトに設定するだけです。

これにより、データがデータベースから1回だけロードされ(最初の.ToList()メソッド)、データベースに再度アクセスすることなく、オブジェクトリストのみが2番目のオブジェクトにフィルターされます。

于 2012-04-15T04:48:14.237 に答える
1

あなたが言ったように、「ドロップダウンと同じデータソースであるため、ドロップダウンにはより小さな個別のリストが表示されます。」

Database InformationViewStateに保持できます。このように 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 PanelしましScript Managerた。 ここに画像の説明を入力


出力

ここに画像の説明を入力

22 文字の文字列を表示するには、サーバーに送受信されているデータの量を確認できます。次のことを想像してみてください

  1. 更新パネルを使用して各要求をデータベースに送信することを検討し、GridView がUpdate Panel!!!!!!にある場合
  2. リクエストごとにViewStateデータを使用し、GridView内部でUpdate Panel.

私の理解では、上記の両方の手法は最悪です。


ここで、ページメソッドについて説明します

更新パネル上のページ メソッド

Page methodsASP.NET AJAXを使用して、ページが を直接実行できるようPage’s Static MethodsにしJSON (JavaScript Object Notation)ます。posting back and then receiving HTML markuptoの代わりにcompletely replace our UpdatePanel’s contents、 a を使用して、web method関心のある情報のみを要求できます。

サンプルコード

ここに画像の説明を入力 ここに画像の説明を入力


出力

ここに画像の説明を入力


したがって、結論は、私は間違いなくViewState BUTを使用するということPage 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シャープのサンプルコード

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 -Database使用されているのはSQL Server. Stored Procedureしたがって、以下はinに対する私の提案ですDatabase

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

参照はこちらこちら

于 2012-04-20T16:33:28.343 に答える