WebForms GridView行的LinkBut​​ton回调未触发

时间:2016-04-21 10:38:45

标签: c# asp.net gridview

是的,我害怕这些问题中的另一个。我确实在ASP.NET Web窗体控件中浪费了大量时间来修复和重新组合挑剔的回调事件。

这是一个曾经有效的页面,但现在不是,我看不到任何相关的变化。我已经将页面简化为基础,并添加了一个笨拙的数据源以消除任何可能的外部影响。

尽管如此,它仍然没有引发OnCommand控件的LinkButton事件

我已经给了它两个选择但是没有被召唤:

  1. OnRowAction方法 - 通过OnCommand属性
  2. 从LinKButton控件本身引用
  3. OnRowCommand方法 - 从GridView.OnRowCommand侦听器引用。
  4. 以下是代码:

    <%@ Page Title="Completion Report Results" Language="C#" MasterPageFile="~/PageTemplates/Site.Master" AutoEventWireup="true" CodeBehind="CompletionResults.aspx.cs" Inherits="PlatformNET.LRN.Reports.CompletionResults" %>
    
    <%@ MasterType VirtualPath="~/PageTemplates/Site.Master" %>
    
    <asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
    
        <asp:GridView ID="UserGrid" runat="server"
            AllowPaging="True" AutoGenerateColumns="False" GridLines="None"
            DataKeyNames="UserID"
            OnRowCommand="OnRowCommand"
            CssClass="stripey"
            HeaderStyle-CssClass="header"
            PagerStyle-CssClass="footer"
            SortedAscendingHeaderStyle-CssClass="currentsortcolumn"
            SortedDescendingHeaderStyle-CssClass="currentsortcolumn">
            <Columns>
                <asp:TemplateField HeaderText="Action">
                    <HeaderStyle CssClass="c" />
                    <ItemStyle CssClass="c" />
                    <ItemTemplate>
                        <asp:LinkButton ID="ManageUserLink" runat="server" OnCommand="OnRowAction" CommandName="ManageUser" CommandArgument='<%# Eval("UserID") %>'>Manage</asp:LinkButton>
                        <asp:LinkButton ID="TrainingRecLink" runat="server" OnCommand="OnRowAction" CommandName="TrainingRec" CommandArgument='<%# Eval("UserID") %>'>Record</asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField HeaderText="UserID" DataField="UserID">
                    <HeaderStyle CssClass="c" />
                    <ItemStyle CssClass="c" />
                </asp:BoundField>
            </Columns>
        </asp:GridView>
    </asp:Content>
    

    这是背后的代码:

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Web.Caching;
    using System.Web.UI.WebControls;
    using AssessmentClassLib.BLL.QueryHelpers;
    using AssessmentClassLib.BLL.Reporting;
    using AssessmentClassLib.DAL;
    using PlatformNET.BLL;
    using PlatformNET.CustomControls;
    using PlatformNET.LRN.BLL;
    
    namespace PlatformNET.LRN.Reports
    {
        public partial class CompletionResults : ReportingPage
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                ReportType = "Completion";
    
                if (!Page.IsPostBack)
                    BindGrid();
    
                base.MakeBreadcrumb(ReportingPageID.completionList);
            }
    
            internal class DummyItem
            {
                public int UserID { get; set; }
            }
    
            protected void BindGrid()
            {
                var dummy = new List<DummyItem>();
                for (var i = 0; i < 20; i++)
                    dummy.Add(new DummyItem() { UserID = i });
    
                UserGrid.AllowPaging = true;
                UserGrid.AllowCustomPaging = true;
                UserGrid.VirtualItemCount = 100;
                UserGrid.PageSize = 20;
                UserGrid.PageIndex = 0;
                UserGrid.DataSource = dummy;
                UserGrid.DataBind();
            }
    
            protected void OnRowAction(object sender, CommandEventArgs e)
            {
                Debug.WriteLine("OnMyCommand(\"{0}\",\"{1}\")", e.CommandName, e.CommandArgument);
            }
    
            protected void OnRowCommand(object sender, GridViewCommandEventArgs e)
            {
                Debug.WriteLine("OnRowCommand(\"{0}\",\"{1}\")", e.CommandName, e.CommandArgument);
            }
        }
    }
    

    检查完成:

    1. 我不是在回发时重新绑定网格(最常见的新手错误)
    2. 两个LinkButton控件不是动态生成的,而是Cell模板的一部分
    3. LinkButton控件都具有OnCommandCommandArgument属性,这些属性在绑定期间填充(通过添加OnRowDataBound回调进行检查以在绑定期间进行检查。
    4. 链接按钮上生成的JS看起来没问题,例如<a id="MainContent_UserGrid_ManageUserLink_0" title="Manage User" href="javascript:__doPostBack('ctl00$MainContent$UserGrid$ctl02$ManageUserLink','')">Manage</a>
    5. 我设置了GridView的OnRowCommand属性,并且该函数存在于回调中
    6. 请告知为什么这个非常简单的例子不再起作用 我正在使用.NET Framework 4.6。 感谢。

1 个答案:

答案 0 :(得分:0)

仅供参考,我将您的代码复制到我的一个Web窗体应用程序中,并且工作正常。我在网格和其他中继器中看到了eval声明行为。

您是否尝试过对CommandArgument值进行硬编码以查看是否会发生任何变化?