2009-05-29 85 views
2

快速瀏覽ObjectDataSource控件插入拋出Error(使用Business Objects公司)

  • 試圖插入使用ObjectDataSource的業務對象(在一個GridView)
  • 收到以下錯誤

的ObjectDataSource 'ObjectDataSource1'沒有要插入的值。檢查「值」字典是否包含值。

項目設置

  • 人 - 簡單的虛擬業務對象(姓名和年齡)
  • PersonBinder - 保存DataSource對象(選擇在這種情況下插入)
  • InsertGrid方法 - 簡單網格(繼承GridView)在頁腳上添加一個「添加」按鈕,它會調用數據源的插入
  • 默認--ASPX頁面持有網格和數據源(應用插入參數到DataSorce)

注意我將待辦事項評論身邊,我覺得是關鍵領域

守則

人活頁夾 錯過了的人(其獲得2個屬性)這裏是粘合劑

/// <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

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

默認代碼隱藏

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

爲什麼你獲得自己的GridView控件,而不僅僅是使用它「的袋子」? – 2009-05-29 11:31:14

回答

1

下不實際工作。

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

什麼,我需要做的是刪除/更換

//TODO: Errors HERE!     
objectDataSource.Insert(); 
相關問題