0

我在使用 CodeBehind 上的 ObjectDataSource 实现可编辑的 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?
4

2 回答 2

0

泽,

您的方法仅适用于学习阶段。对于最佳实践或在生产阶段,我们应该始终在应用程序的几个层之间进行明确的分离。它们主要是数据访问层(DAL)、业务逻辑层(BLL)和表示层(在网页中)。这种概念通常被称为持久性无知。正如这里所解释的

调用存储库类和两个构造函数的 CRUD 方法使您可以将业务逻辑类与您选择的任何后端数据存储一起使用。业务逻辑类不需要知道它调用的类是如何保存数据的。(这通常被称为持久性无知。)

我强烈建议您阅读这个很棒的教程并继续进一步工作,您将会受到启发!

于 2013-12-21T02:49:24.253 回答
0

泽,

回答你的4个问题。

1 和 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;

我希望这有帮助。

于 2014-01-06T17:00:41.537 回答