2

次の GridView があります。

<asp:GridView ID="gridCar" runat="server" RowStyle-ForeColor="Black" AllowSorting="true" OnSorting="gridCar_Sorting" AutoGenerateEditButton="true" OnRowEditing="gridCar_RowEditing" OnRowCancelingEdit="gridCar_RowCancelingEdit" OnRowUpdating="gridCar_RowUpdating" OnRowUpdated="gridCar_RowUpdated"></asp:GridView>

編集ボタンで選択した行を更新したい。問題は、 で実行しようとすると、編集された値gridCar_RowUpdatinge.NewValuesはなく古い値が含まれることです。

私は周りを検索し、onRowUpdated代わりにイベントを使用する必要があるかもしれないことを発見しましたが、別の問題に直面しています。このイベントはまったく発生しません。設定しようとしe.Cancel = falseましgridCar_RowUpdatingたが、問題は解決しません。

GridView は DataTable にバインドされます。

編集:これが私のコードです:

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 : Page
{
    DataTable carsTable = new DataTable("cars");

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            carsTable.Columns.Add("CarID");
            carsTable.Columns.Add("CarRegNum");
            carsTable.Columns.Add("CarModel");
            carsTable.Columns.Add("CarType");
            carsTable.Columns.Add("CarOwner");

            carsTable.Rows.Add(1, "AAA-111", "Toyota", "Hatchback", "Matti");
            carsTable.Rows.Add(2, "BBB-222", "Mercedes-Benz", "Van", "Keijo");
            carsTable.Rows.Add(3, "CCC-333", "Renault", "Regular", "Matilda");

            carsTable.AcceptChanges();

            gridCar.DataSource = carsTable;
            gridCar.DataBind();
        }
    }

    protected string dataViewSortDirection(SortDirection direction)
    {
        switch (direction)
        {
            case SortDirection.Ascending:
                return "ASC";
            case SortDirection.Descending:
                return "DESC";
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    protected void gridCar_Sorting(object sender, GridViewSortEventArgs e)
    {
        gridCar.Sort(e.SortExpression, e.SortDirection);

        // update GridView
        gridCar.DataBind();
    }

    protected void gridCar_RowEditing(object sender, GridViewEditEventArgs e)
    {
        gridCar.EditIndex = e.NewEditIndex;
        gridCar.DataBind();
    }

    protected void gridCar_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        gridCar.EditIndex = -1;
        gridCar.DataBind();
    }

    protected void gridCar_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        labelDebug.Text += "b";
        //gridCar.EditIndex = -1;
        //gridCar.DataBind();
    }

    protected void gridCar_RowUpdated(object sender, GridViewUpdatedEventArgs e)
    {
        labelDebug.Text += "a";
        gridCar.EditIndex = -1;
        gridCar.DataBind();
    }
}
4

2 に答える 2

5

GridViewポストバックでデータバインドしていませんか? あなたはそれをするべきですif(!IsPostBack)

protected void Page_Load(Object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        BindGridView();
    }
}

そうしないと、古い値が読み込まれ、RowUpdatedイベントが防止されます。

アップデート

私はおそらく多くのことを間違っています。今すぐソートと更新を行う方法を教えてもらえますか?

完全な作業サンプルは次のとおりです。

public partial class GridTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGrid();
        }
    }

    private void BindGrid()
    {
        var source = GetCarTable().Select("", this.SortExpression).CopyToDataTable();
        GridCar.DataSource = source;
        GridCar.DataBind();
    }

    private string SortExpression
    {
        get
        {
            if (ViewState["SortExpression"] == null || string.IsNullOrEmpty((String)ViewState["SortExpression"]))
            {
                ViewState["SortExpression"] = "CarModel ASC";
            }
            return ViewState["SortExpression"].ToString();
        }
        set { ViewState["SortExpression"] = value; }
    }

    private static DataTable GetCarTable()
    {
        DataTable carsTable = new DataTable("cars");
        carsTable.Columns.Add("CarID");
        carsTable.Columns.Add("CarRegNum");
        carsTable.Columns.Add("CarModel");
        carsTable.Columns.Add("CarType");
        carsTable.Columns.Add("CarOwner");

        carsTable.Rows.Add(1, "AAA-111", "Toyota", "Hatchback", "Matti");
        carsTable.Rows.Add(2, "BBB-222", "Mercedes-Benz", "Van", "Keijo");
        carsTable.Rows.Add(3, "CCC-333", "Renault", "Regular", "Matilda");

        return carsTable;
    }

    protected void gridCar_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e)
    {
        string currentSortColumn = null;
        string currentSortDirection = null;
        currentSortColumn = this.SortExpression.Split(' ')[0];
        currentSortDirection = this.SortExpression.Split(' ')[1];

        if (e.SortExpression.Equals(currentSortColumn))
        {
            //switch sort direction
            switch (currentSortDirection.ToUpper())
            {
                case "ASC":
                    this.SortExpression = currentSortColumn + " DESC";
                    break;
                case "DESC":
                    this.SortExpression = currentSortColumn + " ASC";
                    break;
            }
        }
        else
        {
            this.SortExpression = e.SortExpression + " ASC";
        }

        //load the data with this SortExpression and DataBind the Grid
        BindGrid();
    }

    protected void GridCar_RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridCar.EditIndex = e.NewEditIndex;
        BindGrid();
    }

    protected void GridCar_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        GridCar.EditIndex = -1;
        BindGrid();
    }

    protected void GridCar_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        var oldValues = e.OldValues;
        var newValues = e.NewValues;
        // BindGrid();
    }

    protected void GridCar_RowUpdated(object sender, GridViewUpdatedEventArgs e)
    {
        //BindGrid();
    }
}

aspx はほとんど変更されていません。

<asp:GridView   ID="GridCar" 
            runat="server" 
            RowStyle-ForeColor="Black" 
            AllowSorting="true" 
            OnSorting="gridCar_Sorting" 
            AutoGenerateEditButton="true" 
            OnRowEditing="GridCar_RowEditing"
            OnRowCancelingEdit="GridCar_RowCancelingEdit"
            OnRowUpdating="GridCar_RowUpdating" 
            OnRowUpdated="GridCar_RowUpdated"
            AutoGenerateColumns="true">
</asp:GridView>
于 2013-02-06T08:16:54.907 に答える
0

コードに DataSourceID がありません。データバインディングはコードビハインドにあると思います。

GridView の行を編集/更新するだけの場合、必要なのはItemUpdatingイベント (たとえば、gridcar_ItemUpdating ) であり、 RowUpdating ではありません

お役に立てば幸いです。

于 2013-02-06T08:28:16.067 に答える