2008-12-16 7 views
4

J'ai une vue quadrillée dans laquelle j'ai créé un modèle d'insertion dans la ligne de pied de page.L'insertion Gridview d'ObjectDataSource échoue au dictionnaire Valeurs vides/vides

J'ai une ObjectDataSource qui est liée à un objet métier.

J'ai un gestionnaire d'événement OnInserting qui n'est jamais déclenché.

Le programme rencontre une erreur une fois que j'appelle .Insert sur ObjectDataSource. L'erreur que je reçois est qu'il n'y a pas de valeurs et que je devrais vérifier pour s'assurer que le dictionnaire de valeurs n'est pas vide.

Je ne vois pas comment insérer un dictionnaire en tant que paramètre. J'ai vu mentionner de saisir le ObjectDataSourceView et en utilisant sa méthode Insert mais je ne vois aucune mention de la façon de faire cela et MSDN prétend que vous n'avez pas accès.

La réflexion est-elle le chemin à parcourir? Y a-t-il une meilleure façon d'avoir une ligne d'insertion sur un gridview? Est-ce que je manque quelque chose d'évident dans mes pas ici?

Voici le code:
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 Méthodes:

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; 
    } 

Répondre

5

Votre exemple ne correspondraient pas puisque vous avez DataObjectTypeName ensemble, mais votre méthode LeasesDS_Inserting est l'ajout paramètres comme si ce n'était pas le cas.

Si vous n'avez pas besoin de DataObjectTypeName, vous pouvez le supprimer et vous devriez avoir de meilleures chances de le faire fonctionner.

Si vous avez besoin de DataObjectTypeName ou si vous préférez le faire (comme je le fais), il existe un moyen de faire fonctionner cette fonction, mais ce n'est pas joli.

Dans la méthode LeasesGrid_RowCommand, vous pouvez utiliser le code comme celui-ci pour obtenir la vue:

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

Après avoir obtenu la vue, vous pouvez construire un dictionnaire contenant les valeurs qui doivent s'écrit à l'objet de données sera finalement transmis à votre méthode Insert. Le code pour cela ressemblera beaucoup à ce que vous avez dans LeasesDS_Inserting, mais vous l'insérerez dans votre propre dictionnaire au lieu de e.InputParameters.

Une fois que vous avez votre dictionnaire prêt, vous pouvez appeler Insérer sur la vue avec quelque chose comme ceci:

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

Cela devrait le faire. Vous n'aurez plus besoin de la méthode LeasesDS_Inserting puisque la méthode Insert de la vue va faire le travail de conversion du dictionnaire que vous avez donné dans l'objet de données qu'elle va transmettre à votre méthode Insert.

Si vous devez effectuer un traitement plus approfondi des propriétés de cet objet de données, vous le verrez dans le dictionnaire InputParameters transmis à LeasesDS_Inserting.

Questions connexes