4

フッター行に挿入テンプレートを作成したグリッドビューがあります。

ビジネス オブジェクトにバインドされた ObjectDataSource があります。

発生しない OnInserting イベント ハンドラーがあります。

ObjectDataSource で .Insert を呼び出すと、プログラムでエラーが発生します。私が受け取ったエラーは、値がなく、値の辞書が空でないことを確認する必要があるというものです。

辞書をパラメーターとして挿入する方法がわかりません。ObjectDataSourceView を取得してその Insert メソッドを使用するという言及を見てきましたが、それを行う方法についての言及は見られず、MSDN はあなたがアクセスできないと主張しています。

リフレクションはここに行く方法ですか?グリッドビューに行を挿入するより良い方法はありますか? ここで私の手順に明らかな何かが欠けていますか?

以下はコードです:
ObjectDataSource:

    <asp:ObjectDataSource ID="LeasesDS" runat="server" OnInserting="LeasesDS_Inserting" 
    DataObjectTypeName="CLS.BusObjects.LeaseObj" DeleteMethod="Delete" 
    InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" 
    SelectMethod="GetLeasesByCustomerID" TypeName="CLS.BusObjects.LeaseObj" 
    UpdateMethod="Update">
    <SelectParameters>
        <asp:Parameter Name="customerID" Type="Int32" />
    </SelectParameters>
    <InsertParameters>
        <asp:Parameter Name="CustomerID" Type="Int32" />
        <asp:Parameter Name="PurchaseDate" Type="DateTime" />
        <asp:Parameter Name="AutoYear" Type="Int32" />
        <asp:Parameter Name="Make" Type="String" />
        <asp:Parameter Name="Model" Type="String" />
        <asp:Parameter Name="LeaseEndDate" Type="DateTime" />
    </InsertParameters>
</asp:ObjectDataSource>


CodeBehind メソッド:

protected void LeasesGrid_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Insert" && Page.IsValid)
        {
            LeasesDS.Insert();
        }
    }
    protected void LeasesDS_Inserting(object sender, ObjectDataSourceMethodEventArgs e)
    {
        DropDownList GridCustomersList = (DropDownList)LeasesGrid.FooterRow.FindControl("GridCustomersList");
        TextBox PurchaseDate = (TextBox)LeasesGrid.FooterRow.FindControl("PurchaseDate");
        TextBox AutoYear = (TextBox)LeasesGrid.FooterRow.FindControl("AutoYear");
        TextBox Make = (TextBox)LeasesGrid.FooterRow.FindControl("Make");
        TextBox Model = (TextBox)LeasesGrid.FooterRow.FindControl("Model");
        TextBox LeaseEndDate = (TextBox)LeasesGrid.FooterRow.FindControl("LeaseEndDate");
        e.InputParameters["CustomerID"] = Convert.ToInt32(GridCustomersList.SelectedValue);
        DateTime? purchaseDate = null;
        if (!string.IsNullOrEmpty(PurchaseDate.Text)) purchaseDate = Convert.ToDateTime(PurchaseDate.Text);
        e.InputParameters["PurchaseDate"] = purchaseDate;
        int? autoYear = null;
        if (!string.IsNullOrEmpty(AutoYear.Text)) autoYear = Convert.ToInt32(AutoYear.Text);
        e.InputParameters["AutoYear"] = autoYear;
        string make = null;
        if (!string.IsNullOrEmpty(Make.Text)) make = Make.Text;
        e.InputParameters["Make"] = make;
        string model = null;
        if (!string.IsNullOrEmpty(Model.Text)) model = Model.Text;
        e.InputParameters["Model"] = model;
        DateTime? leaseEndDate = null;
        if (!string.IsNullOrEmpty(LeaseEndDate.Text)) leaseEndDate = Convert.ToDateTime(LeaseEndDate.Text);
        e.InputParameters["LeaseEndDate"] = leaseEndDate;
    }
4

1 に答える 1

5

DataObjectTypeName が設定されているため、例は一貫していませんが、 LeasesDS_Inserting メソッドはパラメーターを追加していないかのように追加しています。

DataObjectTypeName が必要ない場合は、削除することができます。そうすれば、これが機能する可能性が高くなります。

DataObjectTypeName が必要な場合、または単にそれを好む場合 (私のように)、これを機能させる方法はありますが、きれいではありません。

LeasesGrid_RowCommand メソッドでは、次のようなコードを使用してビューを取得できます。

IDataSource ds = (IDataSource)LeasesDS;
DataSourceView view = ds.GetView(LeasesGrid.DataMember);

ビューを取得したら、最終的に Insert メソッドに渡されるデータ オブジェクトに書き込む必要がある値を含むディクショナリを作成できます。そのためのコードは、LeasesDS_Inserting にあるものと非常によく似ていますが、e.InputParameters の代わりに独自の辞書に挿入します。

辞書の準備ができたら、次のようにしてビューで Insert を呼び出すことができます。

view.Insert(dict, delegate { return false; });

それはそれを行う必要があります。

ビューの Insert メソッドは、指定したディクショナリを Insert メソッドに渡すデータ オブジェクトに変換する作業を行うため、LeasesDS_Inserting メソッドはもう必要ありません。

そのデータ オブジェクトのプロパティをさらに処理する必要がある場合は、LeasesDS_Inserting に渡された InputParameters ディクショナリに表示されます。

于 2008-12-31T07:38:27.173 に答える