1

我有一个使用列表作为数据源的网格视图,该列表使用实体框架填充并传递给我的方法,其中该数据绑定到我的网格视图控件。我似乎在编辑一行时遇到了问题。

在设计器上,我为网格视图添加了属性以具有 OnRowEditing 处理程序,并且我添加了一个用于编辑的按钮,但我的 OnRowEditing 事件处理程序没有触发。断点没有命中。

我的 Gridview 控件

<asp:GridView runat="server" 
            ID="grdNotes" 
            OnRowCommand="grdNotes_RowCommand"
            AllowPaging="true" 
            AllowSorting="true" 
            EnableTheming="true" 
            AutoGenerateColumns="false" 
            OnPageIndexChanging="grdNotes_PageIndexChanging" 
            OnSorting="grdNotes_Sorting"
            AlternatingRowStyle-BorderColor="Yellow" 
            PageSize="3" 
            AlternatingRowStyle-BackColor="Yellow"
            OnRowEditing="grdNotes_RowEditing" 
            OnRowDeleting="grdNotes_RowDeleting" 
            DataKeyNames="NotesID" >
            <Columns>
                <asp:BoundField HeaderText="Title" DataField="NotesTitle" SortExpression="NotesTitle">
                    <ItemStyle Height="20px" Width="150px" />
                </asp:BoundField>

                <asp:BoundField HeaderText="Text" DataField="NotesText" SortExpression="NotesText">
                    <ItemStyle Height="20px" Width="250px" />
                </asp:BoundField>

          <%--      <asp:ButtonField CommandName="EditRow" DataTextField="Edit" HeaderText="Edit" />
                <asp:ButtonField CommandName="DeleteRow" DataTextField="Delete" HeaderText="Delete" />--%>

                <asp:CommandField ShowEditButton="true" />
                <asp:CommandField ShowDeleteButton="true" />
                <asp:CommandField ShowCancelButton="true" />
            </Columns>

        </asp:GridView>

背后的代码

我从 Page_Init 上的实体框架中检索数据。我也有全局变量

 private List<NotesModel> list = new List<NotesModel>();
 NotesModel nm = new NotesModel();

protected void Page_Init(object sender, EventArgs e)
    {
        NoteSearch ns = new NoteSearch(Business.ContextHelper.CurrentContext);
        string[] urlArray = Request.RawUrl.Split('/');
        string t = urlArray[4];
        string[] relatedID = t.Split('=');
        if (!IsPostBack)
        {
            //  urlArray[3] is profile type , relatedID[1] is ID
            list = ns.GetBasicNoteResults(nm, urlArray[3], relatedID[1]);
        }
        else
        {
            urlArray = Request.UrlReferrer.AbsoluteUri.Split('/');
            t = urlArray[6];
            relatedID = t.Split('=');

            list = ns.GetBasicNoteResults(nm, urlArray[5], relatedID[1]);
        }
        GenerateGrid(list);

        btnNotes.Text = "Notes: " + list.Count.ToString();

    }

我的绑定方法

 private void GenerateGrid(List<NotesModel> list)
    {

        grdNotes.DataSource = list;
        grdNotes.DataBind();

        int count = grdNotes.Rows.Count;

        //// Hide headers we don't want to expose
        //grdNotes.HeaderRow.Cells[0].Visible = false;
        //grdNotes.HeaderRow.Cells[3].Visible = false;
        //grdNotes.HeaderRow.Cells[4].Visible = false;
        //grdNotes.HeaderRow.Cells[5].Visible = false;

        //for (int i = 0; i < count; i++)
        //{
        //    // Loop through rows and hide cells
        //    grdNotes.Rows[i].Cells[0].Visible = false;
        //    grdNotes.Rows[i].Cells[3].Visible = false;
        //    grdNotes.Rows[i].Cells[4].Visible = false;
        //    grdNotes.Rows[i].Cells[5].Visible = false;
        //}

        // Finally add edit/delete buttons for these click event handlers

    }

我注意到的最后一件事是,当我将鼠标悬停在编辑行链接按钮上时,没有查询字符串,与网格底部的分页和标题相同。单击任何网格控件将使用户能够:

http://localhost:8192/website/Company

并不是

http://localhost:8192/website/Company/Advertiser/?id=8879

概括

我的 gridview 事件处理程序不会触发。我错过了什么来完成这项工作吗?

4

1 回答 1

1

您需要移动此代码:

GenerateGrid(list);

if(!Page.IsPostBack)区内。

每次您的页面回传到服务器时(例如,当您单击编辑按钮时),此代码都会将您重新构建GridView回其原始状态。这甚至不允许 RowEditing 事件发生,因为您基本上已经在 Init 期间销毁了它并重新添加了它(在它有机会发生之前)。


再看一下您的代码,您似乎正在使用它IsPostBack来确定网格的内容。您需要修改该逻辑才能使其正常工作。也许您可以检查正在传递的查询字符串的内容(或查询字符串中的/字符数)来决定将哪些参数传递给该GetBasicNoteResults方法。

您的代码基本上如下所示:

if (!IsPostBack)
{
    if (Some logic to decide what parameters to pass)
    {
        list = ns.GetBasicNoteResults(nm, urlArray[3], relatedID[1]);
    }
    else
    {
        list = ns.GetBasicNoteResults(nm, urlArray[5], relatedID[1]);
    }
    GenerateGrid(list);
}
于 2013-05-07T14:54:52.503 回答