1

これは基本的な質問であり、正確な検索用語が不足していることが答えを見つけられない理由だと思います。

私が取り組んでいるデータベースには、約6行と5フィールドしかない小さなテーブルが含まれています。時々変更されるため、CRUD機能が必要ですが、12行を超えて拡張されることはほとんどありません。

ASP.NET Webアプリケーションには、ビジネスロジックとデータアクセス層があります。

疑似「ページング」コントロールとしてdropDownListを使用して、detailsViewに表示する行を選択したいと思います。

迅速で厄介な解決策は、ASPに2つのobjectDataSourceコントロールを配置することです。1つはselectパラメーターを使用します。

<asp:ObjectDataSource ID="DDDataSource" runat="server" TypeName="PICUdrugs.BLL.referenceBL"
SelectMethod="getReferences"/>
<asp:DropDownList ID="RefAbrevDDL" runat="server" AutoPostBack="True" 
    DataTextField="abbrev" DataSourceID="DDDataSource" 
    DataValueField="drugReferenceID" ViewStateMode="Enabled" >
</asp:DropDownList>

<asp:ObjectDataSource ID="SelRefObjDataSrc" runat="server" SelectMethod="getReferences"
UpdateMethod="updateReference" DeleteMethod="deleteReference" TypeName="PICUdrugs.BLL.referenceBL"
OnUpdated="reference_CRUD" DataObjectTypeName="PICUdrugs.DAL.drugReference" 
ConflictDetection="CompareAllValues" OldValuesParameterFormatString="orig{0}">
    <SelectParameters>
        <asp:controlparameter name="refID" controlid="RefAbrevDDL" propertyname="SelectedValue"/>
    </SelectParameters>
</asp:ObjectDataSource>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" />
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="SelRefObjDataSrc"
    CssClass="DetailView">
    <Fields>
        <asp:DynamicField DataField="referenceDescription" HeaderText="Reference Description" />
        .....[remaining fields].....

これは機能しますが、データベースにそのような同様の情報を2回照会しているのは気になります。objectDataSourceを利用する(つまり、detailsViewの特定のイベントハンドラーを作成する必要がない)が、単一のデータベースクエリで列挙可能なリストを作成し、両方のコントロールが同じオブジェクトにアクセスできるようにするための効率的で適切なソリューションはありますか(? detailsViewページングコントロール?)?コードビハインドはc#ですが、例やリンクがあればvbで問題ありません。

あなたの考えに感謝します(それらの考えが怠惰になるのをやめ、両方のobjectDataSourcesを捨てて、detailsviewイベントハンドラーを手動で書くだけであっても)-いつも感謝しています。

4

1 に答える 1

0

方法を考え出しましたが、これが少しハックだと思われる場合、またはより良い解決策が存在する場合は、代替案を投稿してください:

Web ページのコード ビハインド ファイルで、プライベート変数を設定して、ビジネス レイヤー オブジェクトへの参照がページ ビルド サイクルを通じて持続するようにし、オブジェクトの作成および作成されたイベント ハンドラーを設定します。

    private referenceBL persistentRef;
    protected void DDDataSource_ObjCreated(object sender, ObjectDataSourceEventArgs e)
    {
        persistentRef = e.ObjectInstance as referenceBL;
    }
    protected void SelRefObjDataSrc_ObjCreating(object sender, ObjectDataSourceEventArgs e)
    {
        if (persistentRef!=null)
        {
            e.ObjectInstance = persistentRef;
        }
    }

ビジネス レイヤーで、最初のオブジェクト データ ソースで使用されるのと同じ列挙可能なリストを指すプライベート変数を持ち、select を次のように処理します。

    private IEnumerable<drugReference> persistingRef;
    public IEnumerable<drugReference> getReferences()
    {
        persistingRef = DrugRefRepository.getReferences();
        return persistingRef;
    }
    public IEnumerable<drugReference> getReferences(int refID)
    {
        if (persistingRef == null)
        {
            return DAL.DrugRefRepository.getReferences(refID); //data access layer method
        }
        else
        {
            return persistingRef.Where(r => r.drugReferenceID==refID);
        }
    }

もちろん、ビジネス オブジェクトの破棄は、データベース接続をできるだけ早く閉じるために手動で処理する必要があります。

listView 内のネストされた (埋め込まれた) objectDataSource に同じ戦略を適用して、更新および削除機能が存在するようにしながら、データベース呼び出しの数を最小限に抑えたいと考えています。

于 2012-05-10T20:32:35.910 に答える