2012-06-14 51 views
0

我在使用CodeBehind上的ObjectDataSource实现可编辑GridView时遇到问题;我不知道我需要什么缺少的部分,在我的后面添加代码(事件):如何使用ObjectDataSource以编程方式更新ASP.NET GridView行

ASPX代码:

<asp:GridView ID="grdPlayer" runat="server" AutoGenerateColumns="False" 
      AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" 
      onrowediting="grdPlayer_RowEditing" 
      onrowcancelingedit="grdPlayer_RowCancelingEdit" 
onrowupdating="grdPlayer_RowUpdating"> 
      <Columns> 
       <asp:BoundField DataField="ID" Visible="false"/> 
       <asp:BoundField DataField="FirstName" HeaderText="First Name" 
        SortExpression="FirstName" /> 
       <asp:BoundField DataField="LastName" HeaderText="LastName" 
        SortExpression="LastName" /> 
       <asp:BoundField DataField="Age" HeaderText="Age" 
        SortExpression="Age" /> 

      </Columns> 


     </asp:GridView> 

ASPX.CS代码背后:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 
    using System.Data; 

    public partial class _Default : System.Web.UI.Page 
    { 
     ObjectDataSource dataSource = new ObjectDataSource(); 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 

       dataSource.TypeName = "Cricket.CricketBL"; 
       dataSource.UpdateMethod = "UpdatePlayer"; 
       Parameter p1 = new Parameter("ID", DbType.Int32); 
       Parameter p2 = new Parameter("FName", DbType.String); 
       Parameter p3 = new Parameter("LName", DbType.String); 
       Parameter p4 = new Parameter("Age", DbType.Int32); 
       dataSource.UpdateParameters.Add(p1); 
       dataSource.UpdateParameters.Add(p2); 
       dataSource.UpdateParameters.Add(p3); 
       dataSource.UpdateParameters.Add(p4); 

       bindGridView(); 

      } 
     } 

     #region Grid Events 
     protected void grdPlayer_RowEditing(object sender, GridViewEditEventArgs e) 
     { 
      grdPlayer.EditIndex = e.NewEditIndex; 
     } 

     protected void grdPlayer_RowUpdating(object sender, GridViewUpdateEventArgs e) 
     { 
      grdPlayer.EditIndex = -1; 
      bindGridView(); 


     } 



     protected void grdPlayer_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
     { 
      grdPlayer.EditIndex = -1; 
      bindGridView(); 
     } 
     #endregion 

     void bindGridView() 
     { 
      dataSource.SelectMethod = "GetAllPlayer"; 
      dataSource.TypeName = "Cricket.CricketBL"; 
      grdPlayer.DataSource = dataSource; 
      grdPlayer.DataBind(); 
     } 
    } 
  1. 我应该在哪里放UpdateMethod代码(目前在Page_Load中)?
  2. 我应该在代码后面实现哪些事件,以便我编辑的网格行使用正确的NewValues调用UpdateMethod?
  3. 当我单击编辑链接时,它不会在编辑模式(文本框等)中呈现GridView;我必须点击两次才能这样做。为什么?
  4. 大问题:点击更新链接不会调用ObjectDataSource UpdateMethod?
+0

你没有在你的代码中使用objectDataSource! – dotfreelancer

回答

0

Zee的,

你的做法是只为学习阶段不错。对于最佳实践或生产阶段,我们应该始终明确区分应用程序的几个层次。它们主要是数据访问层(DAL),业务逻辑层(BLL)和表示层(在网页中)。这样的概念通常被称为持久性无知。作为解释here

调用库类和两个构造使其能够使用与任何后端数据存储中的业务逻辑类,你选择的CRUD方法。业务逻辑类不需要知道它所调用的类如何保持数据。 (这通常被称为持久性无知。)

我强烈建议你通过这awesome tutorial并继续进一步工作,你会开悟!

0

Zee,

回答您的4个问题。

1 AND 4:

将“onRowUpdated”添加到您的.aspx文件的gridview属性中。说onRowUpdated =“grdPlayer_RowUpdated”。在此处添加更新代码。

2和3:

而不是使用一个BoundField的,为什么不使用一个TemplateField。这将有EditItemTemplate里和ItemTemplate中是这样的:

<asp:TemplateField HeaderText="FirstName"> 
    <EditItemTemplate> 
     <asp:TextBox ID="FName" runat="server" Text='<%# Bind("FirstName")%>'></asp:TextBox> 
    </EditItemTemplate> 
    <ItemTemplate> 
     <asp:Label ID="Label2" runat="server" Text='<%# Bind("FirstName") %>'></asp:Label> 
    </ItemTemplate> 
</asp:TemplateField> 

<asp:TemplateField HeaderText="LastName"> 
    <EditItemTemplate> 
     <asp:TextBox ID="LName" runat="server" Text='<%# Bind("LastName") %>'></asp:TextBox> 
    </EditItemTemplate> 
    <ItemTemplate> 
     <asp:Label ID="Label2" runat="server" Text='<%# Bind("LastName") %>'></asp:Label> 
    </ItemTemplate> 
</asp:TemplateField> 
<asp:TemplateField HeaderText="Age"> 
    <EditItemTemplate> 
     <asp:TextBox ID="Age" runat="server" Text='<%# Bind("Age") %>'></asp:TextBox> 
    </EditItemTemplate> 
    <ItemTemplate> 
     <asp:Label ID="Label2" runat="server" Text='<%# Bind("Age") %>'></asp:Label> 
    </ItemTemplate> 
</asp:TemplateField> 

在你的 “grdPlayer_RowUpdating” 的方法,补充一点:

int index = grdPlayer.EditIndex; 

GridViewRow row = grdPlayer.Rows[index]; 
Int64 ID = (Int64)grdPlayer.DataKeys[index].Value; 

TextBox FirstName = (TextBox)row.FindControl("FName"); 
TextBox Lastname = (TextBox)row.FindControl("LName"); 
TextBox Age = (TextBox)row.FindControl("Age"); 

e.NewValues["FirstName"] = FirstName.Text; 
e.NewValues["LastName"] = Lastname.Text; 
e.NewValues["Age"] = Age.Text; 

我希望这有助于。

相关问题