繁体   English   中英

ASP.NET LinkBut​​ton不调用“ OnCommand”事件

[英]ASP.NET LinkButton not invoking 'OnCommand' event

我有一个嵌套在GridView的列内的ListView,看起来像这样:

<asp:panel id="myPanel" Runat="server" EnableViewState="False">
    <asp:GridView id="myDescription" AutoGenerateColumns="False" Width="100%" runat="server"
         OnRowCommand="my_RowCommand"  OnRowDataBound="GetDataForListView" EnableViewState="False">
        <Columns>
            <asp:BoundField DataField="id" HeaderText="ID">
                <HeaderStyle HorizontalAlign="Center"></HeaderStyle>
                <ItemStyle HorizontalAlign="Center"></ItemStyle>
            </asp:BoundField>
            <asp:BoundField DataField="data1" HeaderText="Thing 1">
                <HeaderStyle   HorizontalAlign="Center"></HeaderStyle>
                <ItemStyle   HorizontalAlign="Center"></ItemStyle>
            </asp:BoundField>
            <asp:BoundField DataField="data2" HeaderText="Thing2">
                <HeaderStyle   HorizontalAlign="Center"></HeaderStyle>
                <ItemStyle   HorizontalAlign="Center"></ItemStyle>
            </asp:BoundField>
            <asp:BoundField DataField="data3" HeaderText="Thing3">
                <HeaderStyle   HorizontalAlign="Center"></HeaderStyle>
                <ItemStyle   HorizontalAlign="Center"></ItemStyle>
            </asp:BoundField>
            <asp:TemplateField SortExpression="id">
                <ItemTemplate> 
                    <asp:HyperLink id="hlView"  runat="server"  NavigateUrl="...">View</asp:HyperLink>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Column to contain my list of things">
                <HeaderStyle HorizontalAlign="Center"></HeaderStyle>
                <ItemStyle HorizontalAlign="Center"></ItemStyle>
                <ItemTemplate>
                    <% /* This is my list view: */ %>
                    <asp:ListView ID="myListView" runat="server" OnItemCommand="DoSomething" EnableViewState="False">
                        <ItemTemplate>
                            <asp:LinkButton ID="lbAttachment" Runat="Server" Text='<%# Eval("FILE_NAME") %>'
                                CommandName='<%# Eval("ROW_NUM") %>' CausesValidation="False" > 
                            </asp:LinkButton><br/>
                        </ItemTemplate>
                    </asp:ListView>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</asp:panel>

数据已成功绑定,但是在单击LinkBut​​ton时不会触发OnCommand事件(LinkBut​​ton的任何其他事件,例如OnClick事件)也不会触发。

链接按钮的呈现HTML显示,单击该按钮时,页面正在执行回发: javascript:__doPostBack('...','')

这意味着它将返回我的“ Page_Load”并刷新页面的内容-网格视图已绑定到此处。

通过将此属性添加到LinkBut​​ton,可以阻止它执行回发:

OnClientClick="return false;"

但这只会阻止回发的发生,OnCommand事件仍然不会触发。

有任何想法吗?

后面代码中的事件签名是:

protected void DoSomething(object sender, CommandEventArgs e) { ... }

我也尝试过在带有该事件签名的ListView控件上使用OnItemCommand事件,但是类似地,不会调用该事件:

protected void DoSomething(object sender, ListViewCommandEventArgs e)

父GridView上的OnRowdataBound事件已成功调用,只有嵌套的ListView无法调用其事件。

我显示的代码是页面上第二个GridView的代码,也有另一个代码,而这是在Page_Load事件上绑定的代码。 页面加载事件具有一系列事件,如下所示,其中绑定了第一个GridView(我们将其称为GridView1):

的Page_Load

GridView的数据从数据库中检索

  • 数据被分配给“ DataView”对象,并被分配给GridView1 DataSource属性。
  • GridView1.DataBind()被调用
  • 其他条件逻辑,它从GridView1中删除了某些列
  • OnClick属性将添加到每一行。

因此,实际上,Page_Load绑定第一个GridView。 第二个GridView是包含我有问题的ListView的那个。 在第一个GridView的'OnRowCommand'事件中填充此第二个GridView(其代码位于文章顶部),其顺序如下:

GetDataForListView

从数据库获取数据

  • 将包含数据的数据集分配给第二个GridView的DataSource属性
  • 调用DataBind()方法

然后,从您在顶部发布的代码中可以看到,我有OnRowDataBound事件,该事件无法在后面的代码中调用其事件。

Ciaran,我复制了整个场景,并发现了以下问题。

问题:当任何与GridView2或ListView或LinkBut​​ton相关的事件被触发时,它首先命中Page_load函数 Page_load函数中,您不是数据绑定GridView2和ListView,因此显然它们几乎消失了,因此不会触发该Event。

可能的修复:

  1. 您需要在Page_load函数中绑定GridView2才能触发这些相关事件,并且ListView Too也是如此。

  2. 此修复程序非常重要。 我不确定是否可以尝试。

一种。 如果根据GridView1生成的条件绑定GridView2,则单击然后将这些参数存储在某个隐藏字段中。

有一个名为LoadGridView2(parameters)的函数,您可以在此绑定GridView2和ListView,具体取决于传递的参数,并在每次完成PostBack后每次在Page_Load函数中调用此函数,并将隐藏字段中存储的参数传递给LoadGridView2(parameters) )

C。 通过上述操作,您可以根据GirdView1 Click条件绑定GridView2,并使GridView2和ListView在PostBack中也可用。 因此,现在该事件可能会被解雇。

如有任何疑问,请通知我。

LinkBut​​ton的具有点播 ,ListView中有OnItemCommand 因此名称不正确。 仅当LinkBut​​ton设置了CommandName时才会触发OnCommand。 而且,转发器可能会吞下按钮的命令参数。 某些控件之所以这样做,是因为事件冒泡到UI的方式。

 <asp:LinkButton ID="linkButton" Runat="Server" OnCommand="DoSomething"  
    CommandName="DoSomething"
    CommandArgument='<%# Eval("ROW_NUM") %>' Text='<%# Eval("FILE_NAME") %>'> 
    </asp:LinkButton>

或尝试添加:

<asp:ListView .. OnItemCommand=".." />

然后执行:

void DoSomething(Object Sender, ListViewCommandEventArgs e) {        

      // Do something
   } 

您的按钮仍需要设置命令名称,例如:

 <asp:LinkButton .. CommandName="DoSomething" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM