2009-05-29 6 views
2

Aperçu rapideObjectDataSource Insérer renvoie une erreur (en utilisant Business Objects)

  • Essayer d'insérer un objet d'affaires en utilisant ObjectDataSource (sur un GridView)
  • l'erreur suivante

ObjectDataSource 'ObjectDataSource1' n'a aucune valeur à insérer. Vérifiez que le dictionnaire 'values' contient des valeurs.

Projet SetUp

  • Personne - objet métier simple factice (Nom et âge)
  • PersonBinder - Maintient les méthodes de DataSource d'objets (sélectionner et insérer dans ce cas)
  • InsertGrid - Grid simple (hérite GridView) ajouter un bouton "Ajouter" sur le pied de page, qui inturn appelle InsertSource
  • Par défaut - page ASPX, détient la grille et la source de données, (applique des paramètres d'insertion à la DataSorce)

note I ajouté TODO commentaires autour, ce que je pense sont les principaux domaines

Le code

personne Binder manquant la personne (son get 2 propriétés) ici est le liant

/// <summary> 
/// A binding Class. 
/// </summary> 
public class PersonBinder 
{ 

    public IEnumerable<Person> Select() 
    { 
     List<Person> people = new List<Person>(); 

     for (int i = 0; i < 9; i++) 
     { 
      Person person = new Person(); 
      person.Name = "Name " + i.ToString(); 
      person.Age = i; 
      people.Add(person); 
     } 

     return people; 
    } 


    public void Insert(Person p) 
    { 
     //TODO: the Insert Method 
     //errors before this. 
    } 
} 

InsertGrid

public class InsertGrid : GridView 
{ 
    protected override void OnInit(System.EventArgs e) 
    { 
     base.OnInit(e); 
     ShowFooter = true; 
     DataBind(); 
    } 


    /// <summary> 
    /// here to handle button clicks. 
    /// </summary> 
    private void ModeCommand(object sender, CommandEventArgs e) 
    { 
     switch (e.CommandName) 
     { 
      case "Add": 

       //ObjectDataSource objectDataSource = DataSource as ObjectDataSource; 
       ObjectDataSource objectDataSource = Parent.FindControl(DataSourceID) as ObjectDataSource; 

       if (objectDataSource != null) 
       { 
        //TODO: Errors HERE! 
        objectDataSource.Insert(); 
       } 
       break; 

     } 


    } 

    /// <summary> 
    /// Raises the <see cref="E:System.Web.UI.WebControls.GridView.RowDataBound"/> event. 
    /// </summary> 
    /// <param name="e">A <see cref="T:System.Web.UI.WebControls.GridViewRowEventArgs"/> that contains event data.</param> 
    protected override void OnRowDataBound(GridViewRowEventArgs e) 
    { 
     base.OnDataBound(e); 
     //add an insert button 
     if (e.Row.RowType == DataControlRowType.Footer) 
     { 

      ImageButton ibtnAdd = new ImageButton(); 
      ibtnAdd.ID = "Add"; 
      ibtnAdd.CommandName = "Add"; 
      ibtnAdd.ToolTip = "Add new Item"; 
      ibtnAdd.ImageAlign = ImageAlign.AbsMiddle; 
      ibtnAdd.Style.Add("cursor", "pointer"); 
      ibtnAdd.CausesValidation = true; 
      ibtnAdd.Command += ModeCommand; 
      ibtnAdd.Enabled = true; 
      e.Row.Cells[0].Controls.Add(ibtnAdd); 

     } 
    } 
} 

HTML par défaut

<form id="form1" runat="server"> 
<div> 

    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
     DataObjectTypeName="GridViewSample.Person" InsertMethod="Insert" 
     SelectMethod="Select" TypeName="GridViewSample.PersonBinder"> 
    </asp:ObjectDataSource> 
</div> 
<br /> 
<cc1:InsertGrid ID="InsertGrid1" runat="server" AutoGenerateColumns="False" 
    DataSourceID="ObjectDataSource1"> 
    <Columns> 
     <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> 
     <asp:BoundField DataField="Age" HeaderText="Age" SortExpression="Age" /> 
    </Columns> 
</cc1:InsertGrid> 
</form> 

Par défaut CodeBehind

public partial class _Default : System.Web.UI.Page 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     //TODO: here is the insert PARAMs. what am i missing. 
     ObjectDataSource1.InsertParameters.Add("Name", ""); 
     ObjectDataSource1.InsertParameters.Add("Age", "0"); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //TODO: Tried this too 
     IDataSource ds = ObjectDataSource1; 
     DataSourceView view = ds.GetView(InsertGrid1.DataMember); 
     Dictionary<string, string> values = new Dictionary<string, string>(); 
     values.Add("Name", ""); 
     //values.Add("Age", "0"); 

     view.Insert(values, delegate { return false; }); 
    } 
} 
+0

Pourquoi êtes-vous dérivez votre propre contrôle GridView et non pas seulement l'utiliser sur 'du sac? –

+0

cela a été simplifié, car la grille actaul a des fonctionnalités plus spécialisées (ce qui nuirait au problème). le bouton Ajouter a été ajouté pour encapsuler certaines fonctionnalités en un seul endroit (le travail en cours est un POC) Aussi ce n'est pas la grille, qui est le problème, c'est ma compréhension de la source de données – dbones

Répondre

1

Ce qui suit ne fonctionne réellement.

IDataSource ds = ObjectDataSource1; 
DataSourceView view = ds.GetView(InsertGrid1.DataMember);   
Dictionary<string, string> values = new Dictionary<string, string>();   
values.Add("Name", "");   
//values.Add("Age", "0");   
view.Insert(values, delegate { return false; }); 

ce que je devais faire était d'enlever/remplacer le

//TODO: Errors HERE!     
objectDataSource.Insert(); 
Questions connexes