我用GridView1 结合FormView1 结合做数据的增删除改, GridView1 绑字objectDataSource1,FormView1 绑字objectDataSource2. 另又写了一个数据组件类, EmployeeBLL,做为两个objectDataSource的数据源.
所有的处理都在FormView1做,GridView1 只是显示,另外,GridView1 和FormView1 的DataKeyNames都设为id,
且在FormView1的ItemTemplate中,id用label绑定,用Eval("id").
现在的问题是,能新增,但删除不行,
 1:如果把objectDataSource2的 OldValuesParameterFormatString="original_{0}" 改为={0},是可以的,
 2: 如果把FormView1的DataKeyNames去掉,能执行,但id总是得到0,所以也删除不了,
 3: 还有,如果这些都没做,就会出现未能找到带参数的非泛型方法.这些解决方法到底哪个是正统的呢,还是有什么地方没有设置对呢,请大家指点?

解决方案 »

  1.   

    请给出你的添加和修改删除的参数
    如果是model,则需要指定DataObjectTypeName,如果是非model形,则每个绑定的源需要和方法参数吻合
      

  2.   

    楼主的问题,我可以肯定是数据表的主键问题!!
    主键是自动增量的,不会有以上问题!!主键不是自动增量的,楼主说"id用label绑定,用Eval("id"). "
    问题就出在这里,改为TextBox,Bind("id")双向绑定,应该没问题了!!
      

  3.   

    可以参考Scott Mitchell的教程中的那篇文章
      

  4.   

    通常,记录都是有主键的,所以应该删除 OldValuesParameterFormatString 这个属性,确保你的主键已经声明到 DataKeyNames 属性中,例如 DataKeyNames="KeyField"。然后,你的ObjectDataSource的就可以定义为:      TypeName="MyDLLClass“ DeleteMethod="DeleteData">
            <DeleteParameters>
                <asp:Parameter Name="KeyField" Type="String" />
            </DeleteParameters>这样,当ObjectDataSource在删除时就会执行方法     public void DeleteData(string KeyField);
    超级简单的问题!
      

  5.   

    我没有看懂你的GridView1和FormView1之间的调用关系。按说,你在FormView1或者ObjectDatasource2的Deleted事件(从数据源中删除数据之后)执行
        GridView1.SelectedIndex = -1;
        Grid1.DataBind();GridView1就刷新了。而此时FormView应该显示什么,我没有从你的描述中看出他们的关系所以也不知道结果。如果你的FormView的Visible跟GridView的SelectIndex相关,那么显然由于它是-1,Visible就因该值为false,就不显示了。
      

  6.   

    如果你觉得他们的关系说起来很乱,那么就是可以考虑分出主次层次的时候了。如果从设计角度考虑,你的FormView或者其它什么形式可以放到一个ascx中(于是ObjectDataSource2就在这个ascx中,并且查询参数是声明为根据这个ascx的参数id关联),当在GridView中改变了SelectedIndex就动态加载这个ascx的实例控件并且设置其参数id。给这个ascx声明事件    event EventHandler<EventArgs> AfterDeleted;加载这个ascx实例要注册此事件,如果ascx通知说它删除了它自己,在这个事件处理程序中才执行        this.ListView1.SelectedIndex = -1;  //取消了选择明细
            this.ListView1.DataBind();这样,你可以把FormView或者其它任何创意,封装在这个ascx中,它执行你要求的行为,你定义了它的id参数和 AfterDeleted 事件的行为,但是对于内部如何设计的可以并不关心,它的内部也无需知道调用者GridView1。
      

  7.   

    谢谢各位,以上试了,还没有解决问题,
    1.改为TextBox 双向绑定,也没用,(我现在是删除,不是新增,我想不用双向绑定),
    2.我的数据库中主键为id,int 型,自增的,
    3.gridview和formview的显示是通过下面的方法:
     protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (FormView1.CurrentMode == FormViewMode.Insert)
                FormView1.ChangeMode(FormViewMode.ReadOnly);
        }
    这个是没有问题的.
      

  8.   

    楼主:
    你遇到的objectDataSource问题我刚开始接触也同样遇到!!
    如果是id,int 型,自增的,据我的经历,正常的什么都不要修改!!肯定是这样!!我现在一直这样用!!
    所以你的问题我很感兴趣!!问一下:
    1.你删除是在GridView进行,还是在FormView中进行?
    2.底层是强类型的DataSet,还是自编的类?
    3.你删除的时候,id传到了EmployeeBLL中间层了吗?
      

  9.   

    回上楼:
    1.删除是在FormView中进行
    2.自编的类的类,即加上[System.ComponentModel.DataObject],        [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, true)]...
    3.id有时总传0,但在FormView加上datakeyname为id, 且objectDataSource2的 OldValuesParameterFormatString="original_{0}" 改为={0},是可以删除的,现在我也是可以做的,不过我过去做过不用改
    original_{0}的也能删除的,但现在不行了,所以问一下大家是原因.
     
      

  10.   

    我是用强类型的DataSet做底层,试了一下,问题是这样的;
    DataSet中的Delete方法必须带有:
    DELETE FROM Author WHERE (Id = @Original_Id)
    OldValuesParameterFormatString的属性就是默认的original_{0}
    这样就无须修改任何东西!!如过是:
    DELETE FROM Author WHERE (Id = @Id)
    则在OldValuesParameterFormatString的属性中必须是{0}楼主试试是不是这样!!