1

我在传递 CommandArgument 并尝试触发 RowCommand 的 GridView 中有一个 LinkBut​​ton

GridView 声明:

<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">

GridView 内的 LinkBut​​ton:

<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>

后面的代码:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "DeleteChecklist")
    {
        string refID = e.CommandArgument.ToString();
        DAL.DeleteChecklist(refID);
     }
}

我在 RowCommand 放置了一个断点,但它根本没有被触发,知道为什么吗?

4

3 回答 3

3

我假设您正在GridView对回发进行数据绑定。所以总是把它嵌入到if(!IsPostBack)支票中:

protected void Page_Load(Object sender, EventArgs e)
{
    if(!IsPostBack)
    {
         GridView1.DataSource = getSource();
         GridView1.DataBind();
    }
}

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

另一个可能的原因:你禁用了ViewState吗?

于 2012-12-05T09:33:09.790 回答
1

EDIT2:好的,它变得更好了。您可以使用它,AllowCustomPaging="true"但该属性VirtualItemCount必须大于PageSize您的网格视图的值。看这个:

<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() 方法:

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属性,否则LinkBut​​ton 不会触发事件。

我希望这有帮助。

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

原始“答案”:

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

<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> 

背后的代码

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

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

以下是断点发生的情况:

  1. 您输入 url 并首次加载页面。
  2. 然后访问 if(!IsPostBack) 块中的代码。
  3. 现在您可以单击 ItemTemplate 中的 LinkBut​​ton 和 ButtonField(看截图
    • 如果单击 ItemTemplate 中的 LinkBut​​ton,它不会触发 gvPresupuestos_RowCommand。当然,它会进行回发。但是 gvPresupuestos_RowCommand根本不会被解雇。我的代码不能处理那种奇怪的回发,而页面会做与常规回发一样的事情。之后,你会得到一个空的gridview,因为在这个回发的流程中,FillView() 永远不会被调用。(看截图
    • 如果单击 ButtonField,则会触发事件 gvPresupuestos_RowCommand,一切正常。但我需要点击行的 IdPresupuesto,我现在不知道如何获取它。

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

于 2015-07-28T19:36:36.897 回答
0

我对 ListView 中的 LinkBut​​ton 有同样的问题。原来我应该在 ListView 中使用 OnItemCommand,而不是 OnRowCommand。

改变这个解决了这个问题。

此外,您必须在 LinkBut​​ton 上设置 CommandName(但没有 OnCommand)。

于 2018-01-17T13:27:37.433 回答