6

ここでは説明しない理由で、ネストされたリピーターを使用してテーブルを作成していますが、2つのデータソースがあります。1つは行に対応するトップレベルのリピーター用で、もう1つは第2レベル用です。行内のセルを返すリピーター。

しかし、私が疑問に思っているのは、最初のデータソースからの結果のフィールドに設定されているネストされたリピーターのデータソースのパラメーターを何らかの方法で指定できるかどうかです。

データバインディング式の値にパラメータを設定できますか?

これを実行したい理由は、2つのストアドプロシージャがあるためです。ページが読み込まれると、最初のストアドプロシージャを実行するために使用できるセッションパラメータがありますが、2番目のストアドプロシージャでは、トップレベルのリピーターの各インスタンスからの値を2番目のストアドプロシージャの呼び出しに関連付ける必要があります異なるパラメーター値を使用します。

4

5 に答える 5

4

最良の方法は、外部リピーターのItemDataBoundイベントを処理し、内部のDataSourceコントロールを見つけて、そのSelectParameterを設定することだと思います。

    void MyOuterRepeater_ItemDataBound(Object sender, RepeaterItemEventArgs e) 
    {
    // Find the Inner DataSource control in this Row.
    SqlDataSource s = (SqlDataSource)e.Item.FindControl("InnerDataSource");

    // Set the SelectParameter for this DataSource control
    // by re-evaluating the field that is to be passed.
    s.SelectParameters["MyParam"].DefaultValue = DataBinder.Eval(e.Item.DataItem, "MyFieldValueToPass").ToString();
    }

DataListの使用例については、ASP.NETクイックスタートをここで確認してください

PS:上記のスニペットの重要な修正については、以下のTonyの返信を参照してください。特に、現在のRepeaterItemのItemTypeを確認することが不可欠です。または、すべてのオブジェクトで常にnullをチェックすることをお勧めします。

于 2009-01-29T13:23:36.827 に答える
3

1 つのキャッチがあることを除いて、Cerebrus の答えは機能します。この質問のルールに従わない限り、null 例外が発生します。

ItemDataBound中にデータバインドされているアイテムにアクセスする方法は?

基本的に、問題のアイテムがアイテムまたは代替アイテムであることを確認する必要があります。そうしないと、ヘッダーとフッターが問題を引き起こします。

編集: FindControl を使用して DataSource を取得しようとしてもエラーが発生しました。FindControl が null を返したため、データ ソースにアクセスしようとすると、2 つ目の null 例外が発生しました。そのため、オブジェクトに直接アクセスするだけになりました。とにかく、データソースはデザイナーファイルで宣言されています。これで、ようやくネストされたリピーターが機能するようになりました。

// Find the Inner DataSource control in this Row.

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == 
    ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.EditItem)
{
    CellsDataSource.SelectParameters["testRunID"].DefaultValue = 
        DataBinder.Eval(e.Item.DataItem, "TestRunID").ToString();
}
于 2009-01-29T14:30:53.710 に答える
3

sproc 呼び出しの量を減らす手法を検討することをお勧めします。同じストアド プロシージャから複数の結果セットを返すことができます。.net データセットには、複数のデータ テーブル間の関係を定義する機能があり、1 つのテーブルのデータ行を取得して、別のデータ テーブルのすべての子ノードを簡単に取得できます。元:

exampleData.Relations.Add(New DataRelation("FOO_RELATION", exampleData.Tables["TABLE_A"].Columns["ID"], exampleData.Tables["TABLE_B"].Columns["PARENT_ID"]));

次に、TABLE_A の任意のデータ行から、次のようにすべての子にアクセスできます。

DataRow[] childRows = row.GetChildRows("FOO_RELATION");

これはより効率的であり、私見も同様に簡単です。この方法では、sproc 呼び出しをリピーターのイベント ハンドラーに焼き付ける必要はありません。

于 2009-01-29T13:47:10.180 に答える
1

最初にネストされたリピーターで FindControl を呼び出し、次に返されたリピーターで FindControl を呼び出す必要があるため、FindControl への呼び出しは null を返すと思います。

Repeater rpt  = (Repeater)e.Item.FindControl("rptNested");
SqlDataSource s = (SqlDataSource)rpt.FindControl("InnerDataSource");
于 2009-01-29T15:42:31.723 に答える