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 がレンダリングされません。これを行うには、2 回クリックする必要があります。なぜ?
  4. 大きな質問: [更新] リンクをクリックしても、ObjectDataSource UpdateMethod が呼び出されませんか?
4

2 に答える 2

0

ジー、

あなたの4つの質問に答えるために。

1 と 4:

.aspx ファイルの gridview プロパティに "onRowUpdated" を追加します。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 に答える
0

ジー、

あなたのアプローチは、学習段階にのみ適しています。ベスト プラクティスまたは運用段階では、アプリケーションの複数のレイヤーを常に明確に分離する必要があります。それらは主に、データ アクセス レイヤー (DAL)、ビジネス ロジック レイヤー (BLL)、およびプレゼンテーション レイヤー (Web ページ内) です。このような概念は、永続性無知と呼ばれることがよくあります。ここで説明したように

リポジトリ クラスを呼び出す CRUD メソッドと 2 つのコンストラクターにより、選択したバックエンド データ ストアでビジネス ロジック クラスを使用できるようになります。ビジネス ロジック クラスは、呼び出しているクラスがデータを保持する方法を認識する必要はありません。(これはしばしば持続性無知と呼ばれます。)

このすばらしいチュートリアルを読み、さらに作業を続けることを強くお勧めします。

于 2013-12-21T02:49:24.253 に答える