【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug

相信大家在利用ObjectDataSource更新GridView或者FormView数据的时候一定遇到过这样的错误。
ObjectDataSource 'ods1' could not find a non-generic method 'ModifyPhrase' that has parameters: PID, pgid, content, Context.

你可以用google搜索一下这个错误,国内国外都有讨论,有人说这是微软的一个Bug。其实是因为GridView自动给数据源更新方法生成的参数不正确引起的。GridView在Updating事件里传递给DataSource的参数有DataKeyNames字段,以及你编辑状态下非readonly的字段,如果这几个字段加起来和数据源声明的几个参数对应起来,那么就会成功的调用数据源的更新方法,否则就会出现类似上面的错误。解决这个问题就是在Updating事件里处理传过去的参数。我做了一个例子。
这是数据源的代码

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug using  System;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
using  System.Collections.Generic;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
using  System.ComponentModel;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
public   class  Entity
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
public Entity(int id, string name)
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        m_id 
= id;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        m_name 
= name;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
int m_id;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
public int Id
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
get return m_id; }
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
set { m_id = value; }
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
string m_name;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
public string Name
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
get return m_name; }
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
set { m_name = value; }
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug}

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug[DataObject]
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
public   class  BLL
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
static Dictionary<intstring> dict = new Dictionary<intstring>();
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
public BLL()
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug     
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    [DataObjectMethod(DataObjectMethodType.Insert, 
true)]
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
public void Add(int id, string name)
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        dict.Add(id, name);
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    [DataObjectMethod(DataObjectMethodType.Select, 
true)]
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
public Entity[] GetAll() 
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        Entity[] entities 
= new Entity[dict.Count];
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
int i = 0;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
foreach (KeyValuePair<intstring> kvp in dict)
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            entities[i] 
= new Entity(kvp.Key, kvp.Value);
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            i
++;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
return entities;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    [DataObjectMethod(DataObjectMethodType.Update, 
true)]
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
public void Update(int pid, string pname)
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        dict[pid] 
= pname;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    [DataObjectMethod(DataObjectMethodType.Delete, 
true)]
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
public void Delete(int id) 
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        dict.Remove(id);
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug}

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug

 

这是页面的代码

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug <% @ Page Language="C#" Debug="true" Trace="true"  %>
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
< script  runat ="server" >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    protected 
void LinkButton1_Click(object sender, EventArgs e)
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
int id;
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
int.TryParse(txtID.Text, out id);
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
new BLL().Add(id, txtName.Text);
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        GridView1.DataBind();
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    protected 
void ObjectDataSource1_Updating(object sender, ObjectDataSourceMethodEventArgs e)
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
{
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
//update方法本来有俩参数pid和name,而key是id,而修改的数据是datafeild是name
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
        //所以我们要转换一下,并把不用的参数去调,另外参数不区分大小写
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
        e.InputParameters["pid"= e.InputParameters["Id"];
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        e.InputParameters[
"pname"= e.InputParameters["name"];
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        e.InputParameters.Remove(
"id");
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        e.InputParameters.Remove(
"name");
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    }

【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
</ script >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
< html  xmlns ="http://www.w3.org/1999/xhtml"   >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
< head  runat ="server" >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
< title > 测试GridView的编辑功能 </ title >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
</ head >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
< body >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
< form  id ="form1"  runat ="server" >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
< div >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
<!-- 要想使用GridView的编辑功能,要设置DataKeyNames属性,并把主键字段设置成ReadOnly
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug         字段声明这里一定要包含update方法需要的参数,然后在数据源的Updating事件里进行转换
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug         否则有些参数无法赋值了
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug         
-->
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
< asp:GridView  ID ="GridView1"  runat ="server"  AllowPaging ="True"  DataSourceID ="ObjectDataSource1"  DataKeyNames ="ID"  AutoGenerateColumns ="False" >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
< Columns >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug                
< asp:CommandField  ShowDeleteButton ="True"  ShowEditButton ="True"   />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug                
< asp:BoundField  DataField ="ID"  HeaderText ="ID"  ReadOnly ="True"   />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug                
< asp:BoundField  DataField ="Name"  HeaderText ="Name"   />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
</ Columns >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
< EmptyDataTemplate >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug                没有数据
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
</ EmptyDataTemplate >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
</ asp:GridView >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
< asp:ObjectDataSource  ID ="ObjectDataSource1"  runat ="server"  DeleteMethod ="Delete"
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            InsertMethod
="Add"  SelectMethod ="GetAll"
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            TypeName
="BLL"  UpdateMethod ="Update"  OnUpdating ="ObjectDataSource1_Updating"   >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
< DeleteParameters >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug                
< asp:Parameter  Name ="id"  Type ="Int32"   />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
</ DeleteParameters >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
< UpdateParameters >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug                
< asp:Parameter  Name ="pid"  Type ="Int32"   />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug                
< asp:Parameter  Name ="pname"  Type ="String"   />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
</ UpdateParameters >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
< InsertParameters >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug                
< asp:Parameter  Name ="id"  Type ="Int32"   />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug                
< asp:Parameter  Name ="name"  Type ="String"   />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug            
</ InsertParameters >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
</ asp:ObjectDataSource >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
< br  />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        ID
< asp:TextBox  ID ="txtID"  runat ="server" ></ asp:TextBox >< br  />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        NAME
< asp:TextBox  ID ="txtName"  runat ="server" ></ asp:TextBox >< br  />
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug        
< asp:LinkButton  ID ="LinkButton1"  runat ="server"  OnClick ="LinkButton1_Click" > 添加 </ asp:LinkButton ></ div >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug    
</ form >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
</ body >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug
</ html >
【蛙蛙推荐】GridView和ObjectDataSource更新数据的一个Bug

你可能感兴趣的:(dataSource)