首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinkButton没有触发GridView_RowCommand

LinkButton没有触发GridView_RowCommand
EN

Stack Overflow用户
提问于 2012-12-05 17:29:28
回答 3查看 5.9K关注 0票数 1

我在GridView中有一个LinkButton,它传递一个CommandArgument并尝试触发RowCommand

GridView声明:

代码语言:javascript
复制
<asp:GridView PageIndex="0" OnRowCommand="GridView1_RowCommand" PageSize="10" AllowPaging="true" OnPageIndexChanging="GridView1_PageIndexChanging"
ID="GridView1" runat="server" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None"
BorderWidth="1px" CellPadding="4" ForeColor="Black" GridLines="Horizontal" Width="700px"
AutoGenerateColumns="False" OnPageIndexChanged="GridView1_PageIndexChanged">

代码语言:javascript
复制
<asp:TemplateField>
    <ItemTemplate>
        <asp:LinkButton ID="LinkButton1" OnClientClick="return confirm('Are you sure you want to delete this checklist?');" runat="server" CausesValidation="false" CommandName="DeleteChecklist" CommandArgument='<%# Eval("refID") %>' Text="Delete"></asp:LinkButton>
    </ItemTemplate>
    <ItemStyle ForeColor="Black" />
    <ControlStyle BorderStyle="None" ForeColor="Black" />
</asp:TemplateField>

代码隐藏:

代码语言:javascript
复制
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "DeleteChecklist")
    {
        string refID = e.CommandArgument.ToString();
        DAL.DeleteChecklist(refID);
     }
}

我在RowCommand上设置了一个断点,但它根本不会被触发,你知道为什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-05 17:33:10

我假设您是在回发时对GridView进行数据绑定。因此,始终将其嵌入到if(!IsPostBack)检查中:

代码语言:javascript
复制
protected void Page_Load(Object sender, EventArgs e)
{
    if(!IsPostBack)
    {
         GridView1.DataSource = getSource();
         GridView1.DataBind();
    }
}

否则,事件将不会被触发,编辑的值将被覆盖。

另一个可能的原因是:您是否禁用了ViewState

票数 3
EN

Stack Overflow用户

发布于 2015-07-29 03:36:37

EDIT2:好的,事情变得更好了。您可以让它与AllowCustomPaging="true"一起工作,但属性VirtualItemCount必须大于网格视图的PageSize值。看看这个:

代码语言:javascript
复制
<asp:GridView runat="server" ID="gvPresupuestos" AutoGenerateColumns="False" 
    OnRowCommand="gvPresupuestos_RowCommand" 
    OnPageIndexChanging="gvPresupuestos_PageIndexChanging" 
    OnPreRender="gvPresupuestos_PreRender" ItemType="Core.NominaEntities.TipoPresupuesto" 
    AllowPaging="true" PageSize="1" AllowCustomPaging="true"
    UseAccessibleHeader="true" GridLines="None" CssClass="table table-hover" 
    ShowHeaderWhenEmpty="True">
    <Columns>
        <asp:BoundField HeaderText="Nombre del presupuesto" DataField="Nombre" />
        <asp:TemplateField HeaderText="Opciones">
            <ItemTemplate>
                <a href='<%# "Detalle?p=" + Item.IdTipoPresupuesto.ToString() %>' 
                    target="_self"><%# Item.Editable ? "Editar" : "Ver" %></a>
                <asp:LinkButton runat="server" 
                    CommandArgument='<%# Item.IdTipoPresupuesto.ToString() %>' 
                    CommandName="Deshabilitar" 
                    Text="Deshabilitar" Visible='<%# !Item.Editable ? true : false %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

FillView()方法:

代码语言:javascript
复制
private void FillView(int desiredPage)
{
    var cliente = ClientFactory.CreateAuthServiceClient();
    using (cliente as IDisposable)
    {
        // this list only has 1 item.
        List<TipoPresupuesto> resultado = cliente.ObtenerTiposDePresupuesto();
        gvPresupuestos.DataSource = resultado;
        // For testing pursposes, force the virtual item count to 1000.
        gvPresupuestos.VirtualItemCount = 1000;
        gvPresupuestos.DataBind();
    }
}

因此,除非虚拟项计数大于gvPresupuestos_RowCommand VirtualItemCount 属性,否则LinkButton不会激发事件。

我希望这能帮上忙。

EDIT1:我找到了。您可以通过将"AllowCustomPaging"的值更改为false来使其工作。我不知道为什么,但希望这能有所帮助。

原创“答案”:

我也有同样的问题。你可以在这里看到我的代码:

代码语言:javascript
复制
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<div class="jumbotron jumbotron-small">
    <h2>Presupuestos</h2>
</div>

<asp:GridView runat="server" ID="gvPresupuestos" 
AutoGenerateColumns="False" AllowPaging="true" AllowCustomPaging="true" PageSize="20"
OnRowCommand="gvPresupuestos_RowCommand" 
OnPageIndexChanging="gvPresupuestos_PageIndexChanging" 
DataKeyNames="IdTipoPresupuesto" OnPreRender="gvPresupuestos_PreRender"
ItemType="Core.NominaEntities.TipoPresupuesto"  ShowHeaderWhenEmpty="True" 
UseAccessibleHeader="true" GridLines="None" CssClass="table table-hover">
<Columns>
    <asp:BoundField HeaderText="Nombre del presupuesto" DataField="Nombre"/>
    <asp:TemplateField HeaderText="Opciones">
        <ItemTemplate>
        <asp:LinkButton runat="server" Text="Deshabilitar" 
            Font-Underline="true" CommandName="Deshabilitar" 
            Visible='<%# Item.Editable ? true : false %>'
            CommandArgument='<%# Item.IdTipoPresupuesto %>' />
        <a href='<%# "Detalle?p=" + Item.IdTipoPresupuesto.ToString() %>' 
            target="_self"><%# Item.Editable ? "Editar" : "Ver" %></a>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:ButtonField ButtonType="Link" CommandName="Deshabilitar" 
    Text="Deshabilitar (this fires event)" />
</Columns>
</asp:GridView>

<table class="large-table">
    <tr>
        <td class="text-right">
            <a runat="server" class="btn btn-primary" href="Detalle">Nuevo presupuesto</a>
        </td>
    </tr>
</table>
</asp:Content> 

代码隐藏

代码语言:javascript
复制
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        InitializeControls();
        SetPermissions();
        FillView(1);
    }
}

protected void gvPresupuestos_PreRender(object sender, EventArgs e)
{
    // Habilita bootstrap
    gvPresupuestos.HeaderRow.TableSection = TableRowSection.TableHeader;
}

protected void gvPresupuestos_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // This is never fired by the LinkButton in the ItemTemplate
    // But the ButtonField actually fires it.
    if (e.CommandName.Equals("Deshabilitar"))
    {
        // This is how I've been doing it in the whole project but thanks to this 
        // shit I can't use the CommandArgument of the LinkButton in the ItemTemplate
        // Guid idPresupuesto = new Guid(e.CommandArgument.ToString());

        // I don't know what I'm supposed to do now. 
        // ¿Why this only happens in this page?, ¿WTF?
        Guid idPresupuesto = gvPresupuestos.GetTheIdFromDataKeysWithFuckingMagic();
        var cliente = ClientFactory.CreateServiceClient();
        using (cliente as IDisposable)
        {
            cliente.DeshabilitarPresupuesto(idPresupuesto);
        }
    }
    FillView(1);
}

protected void gvPresupuestos_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gvPresupuestos.PageIndex = e.NewPageIndex;
    FillView(e.NewPageIndex + 1);
}

#region helper methods
private void InitializeControls()
{
    // Not required yet
}

private void FillView(int desiredPage)
{
    var cliente = ClientFactory.CreateAuthServiceClient();
    using (cliente as IDisposable)
    {
        var resultado = cliente.ObtenerTiposDePresupuesto();
        gvPresupuestos.DataSource = resultado;
        gvPresupuestos.DataBind();
    }
}

private void SetPermissions()
{
    // not required yet
}
#endregion

我尝试在网格视图中启用和禁用视图状态,但没有得到不同的结果。

以下是断点发生的情况:

  1. 您键入url并第一次加载页面。然后访问块if(!IsPostBack).
  2. Now中的代码,您可以同时单击ItemTemplate中的LinkButton和ButtonField(Look screenshot)
    • 如果您单击ItemTemplate中的LinkButton,则不会触发gvPresupuestos_RowCommand。当然,它做了一个回发。但是gvPresupuestos_RowCommand 就是不会被解雇。我的代码不能处理这种奇怪的回发,而页面所做的事情与常规回发一样。在此之后,您将得到一个空的网格视图,因为在此回发的流程中,FillView()永远不会触发您单击ButtonField的事件,触发gvPresupuestos_RowCommand,一切都是正常的。但是我需要被点击的行的IdPresupuesto,而我现在不知道如何获取它。

这很奇怪。我已经在系统的所有信息页面中实现了这个模型(大约有15个这样的模块),直到现在才出现问题。

票数 1
EN

Stack Overflow用户

发布于 2018-01-17 21:27:37

对于ListView中的LinkButton,我也遇到了同样的问题。事实证明,我应该在ListView中使用OnItemCommand,而不是OnRowCommand。

更改此设置解决了此问题。

此外,您必须在LinkButton上设置CommandName (但不设置OnCommand)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13719943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档