1

この問題の原因が見つかりません。私は自分のコードをデバッグし、それは正常に終了し、要求されたこと (データベースからのページエントリの削除) を実行しますが、コードの終了後にこれを返します:

http://i.imgur.com/IO5zY5v.png

ListPages.aspx のコードは次のとおりです。

<%@ Page Title="" Language="C#" MasterPageFile="~/admin/Admin.Master" AutoEventWireup="true" CodeBehind="ListPages.aspx.cs" Inherits="TopStart.admin.ListPages" %>

<asp:Content ContentPlaceHolderID="Main" runat="server">
                <div id="container" runat="server" class="full_w">
                <div class="h_title">Manage Your Pages</div>
                <h2>Page Management</h2>
                <p>This is a list of all your website pages. Use the icons on the last column to perform various operations on a page.</p>

            <div class="entry">
                <div class="sep"></div>
            </div>
            <asp:GridView ID="PageList" runat="server" AllowPaging="True" OnRowDataBound="PageList_RowDataBound" OnPageIndexChanging="PageList_PageIndexChanging">
                <PagerStyle CssClass="pager" />
            </asp:GridView>

            <div class="entry">
                <div class="sep"></div>     
                <a class="button add" href="AddPage.aspx">Add new page</a> <a class="button" href="">Categories</a> 
            </div>
        </div>

ListPages.apsx.cs のコード:

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace TopStart.admin
{
    public partial class ListPages : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
                CreatePageList();
        }

    protected void CreatePageList()
    {
        Database db = new Database("mySqlCon");

        string query = "SELECT p.id, p.title, p.slug, u.username, c.categories FROM pages as p LEFT JOIN users AS u ON p.user_id = u.id LEFT JOIN categories AS c ON p.category_id = c.id";

        DataTable dt = db.Query(query);
        dt.Columns.Add(new DataColumn("Modify"));

        PageList.DataSource = dt;
        PageList.DataBind();
    }

    protected void PageList_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {
            e.Row.Cells[5].Width = new Unit("65px");
        }
        else if (e.Row.RowType == DataControlRowType.DataRow)
        {
            HyperLink edit = new HyperLink();
            edit.NavigateUrl = "EditPage.aspx?id=" + e.Row.Cells[0].Text;
            edit.CssClass = "table-icon edit";
            edit.Attributes.Add("title", "Edit");

            HyperLink archive = new HyperLink();
            archive.NavigateUrl = "Archive.aspx?id=" + e.Row.Cells[0].Text;
            archive.CssClass = "table-icon archive";
            archive.Attributes.Add("title", "Archive");

            LinkButton delete = new LinkButton();
            delete.CssClass = "table-icon delete";
            delete.Attributes.Add("title", "Delete");
            delete.Attributes.Add("id", e.Row.Cells[0].Text);
            delete.ID = e.Row.Cells[0].Text;
            delete.Click += new EventHandler(delete_Click);

            e.Row.Cells[5].Controls.Add(edit);
            e.Row.Cells[5].Controls.Add(archive);
            e.Row.Cells[5].Controls.Add(delete);
        }
    }

    protected void PageList_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        PageList.PageIndex = e.NewPageIndex;
        PageList.DataBind();
    }

    protected void delete_Click(object sender, EventArgs e)
    {
        LinkButton lb = (LinkButton)sender;

        Database db = new Database("mySqlCon");
        string query = "DELETE FROM pages WHERE id = @id";

        MySqlParameter pId = new MySqlParameter("@id", MySqlDbType.Int32, 4);
        pId.Value = lb.ID;

        if (db.MQuery(query, pId))
        {
            container.InnerHtml = "<div class=\"h_title\">Success</div>\n<div class=\"n_ok\"><p>Page was deleted. Redirecting...</p></div>";
        }
        else
        {
            container.InnerHtml = "<div class=\"h_title\">Failure</div>\n<div class=\"n_error\"><p>Page couldn't be deleted. Redirecting...</p></div>";
        }

        Response.AddHeader("REFRESH", "3;URL=ListPages.aspx");
    }
}

}

GridView に何か問題があると思います。削除ボタンをクリックすると、コードはイベント メソッドに直接移動せず、PageLoad に再度移動し、GridView を再度 (コード内で) レンダリングしてから、メソッド イベントに移動します。私はこれで立ち往生している私を助けてください。

4

1 に答える 1

2

ラップCreatePageListインif(!IsPostBack):

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

すべてのポストバックで完全なライフサイクルが実行されます。それは正常です。Page_Loadただし、 ViewState が有効になっている場合 (デフォルト) は、ポストバックごとにグリッドを DataSource にデータバインドしないでください。たとえば、削除イベントから行を削除したなど、何かが変更された場合にのみこれを行います。

そうしないと、以前の値がデータベースから読み込まれるため、すべての変更が失われ、イベントもトリガーされなくなります。

更新でコントロールを動的に作成していますRowDataBound。それは良い場所ではありませんRowCreated。代わりに使用してください。ポストバックごとに動的コントロールを再作成する必要があります。ただし、必ずしもすべてのポストバックにあるとは限らないデータバインドされているRowDataBound場合にのみ呼び出されます。GridViewこれとは対照的にRowCreated すべてのポストバックで呼び出されます。

ただし、基になるから派生したNavigateUrlinを設定しているため、適切な で述べたようにinを作成する必要があります。これを使用してを検索し、そのプロパティを設定します。RowDataBoundIDDataItemHyperlinkRowCreatedIDIDRowDataBoundHyperlinkNavigateUrl

重要な点は、常に再作成されるということですが、NavigateUrlプロパティは一度だけ設定されます。

于 2013-07-19T11:33:26.000 に答える