Domanda

Ho un GridView a cui ho creato un modello di inserimento nella riga piè di pagina.

Ho un ObjectDataSource che è destinato a un oggetto di business.

Ho un gestore di eventi OnInserting che non viene mai sparato.

Il programma rileva un errore una volta che io chiamo .Insert sul ObjectDataSource. L'errore che ricevo è che non ci sono valori e che avrei dovuto controllare per assicurarsi che il dizionario valori non è vuoto.

Non vedo un modo per inserire con un dizionario come parametro. Ho visto menzione di afferrare l'ObjectDataSourceView e usando il suo metodo Insert, ma non vedo alcuna menzione di come farlo e MSDN sostiene non si dispone di accesso.

È riflessione il modo di andare qui? C'è un modo migliore di avere una riga di inserimento in un GridView? Mi sto perdendo qualcosa evidente nei miei passi qui?

Di seguito è riportato il codice:
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>


Metodi 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;
    }
È stato utile?

Soluzione

Il tuo esempio non è coerente poiché avete DataObjectTypeName set, ma il metodo di LeasesDS_Inserting è l'aggiunta di parametri, come se non lo è.

Se non avete bisogno di DataObjectTypeName, è possibile rimuoverlo e quindi si dovrebbe avere una migliore possibilità di ottenere questo al lavoro.

Se avete bisogno di DataObjectTypeName o semplicemente preferisce (come faccio io), non v'è un modo per arrivare a questo lavoro, ma non è abbastanza.

Nel tuo metodo LeasesGrid_RowCommand, è possibile utilizzare il codice come questo per ottenere la vista:

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

Dopo aver ottenuto la vista, si può costruire un dizionario contenente i valori che hanno bisogno di ottenere per iscritto l'oggetto di dati che alla fine ottenere passati al tuo metodo Insert. Il codice per che avrà un aspetto molto simile a quello che hai in LeasesDS_Inserting, ma sarete inserendo nel proprio dizionario, invece di e.InputParameters.

Una volta ottenuto il dizionario pronta, è possibile richiamare Inserire sulla vista con qualcosa di simile:

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

Che dovrebbe farlo.

Non sarà necessario il metodo LeasesDS_Inserting più poiché della vista metodo Insert farà il lavoro di conversione del dizionario avete dato nei dati oggetto che sta andando a passare al tuo metodo Insert.

Se avete bisogno di fare di più l'elaborazione delle proprietà su tale oggetto dei dati, si vedrà nel dizionario InputParameters passata a LeasesDS_Inserting.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top