代码之家  ›  专栏  ›  技术社区  ›  dbones

ObjectDatasource插入引发错误(使用业务对象)

  •  2
  • dbones  · 技术社区  · 15 年前

    快速概述

    • 尝试使用ObjectDatasource(在GridView上)插入业务对象
    • 获取以下错误

    ObjectDatasource“ObjectDatasource1”没有要插入的值。检查“values”字典是否包含值。

    项目设置

    • 人-简单的虚拟业务对象(名称和年龄)
    • PersonBinder-保留对象数据源的方法(在本例中选择并插入)
    • insert grid-简单网格(继承gridview)在页脚添加一个“添加”按钮,Inturn调用数据源的insert
    • 默认-aspx页,保存网格和数据源,(将插入参数应用于数据源)

    注意:我在周围添加了TODO注释,我认为这是关键领域

    代码

    人绑定器 遗漏了这个人(它的get 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.
        }
    }
    

    插入网格

    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; });
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   dbones    15 年前

    以下内容确实有效。

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