C# ASP.NET链接按钮未调用';OnCommand';事件

C# ASP.NET链接按钮未调用';OnCommand';事件,c#,asp.net,.net,listview,C#,Asp.net,.net,Listview,我在GridView的列中嵌套了一个ListView,如下所示: <asp:panel id="myPanel" Runat="server" EnableViewState="False"> <asp:GridView id="myDescription" AutoGenerateColumns="False" Width="100%" runat="server" OnRowCommand="my_RowCommand" OnRowDataBou

我在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>
但这只会阻止回发的发生,OnCommand事件仍然不会触发

有什么想法吗

代码隐藏中的事件签名为:

protected void DoSomething(object sender, CommandEventArgs e) { ... }
我还尝试在具有此事件签名的ListView控件上使用OnItemCommand事件,但类似地,不会调用该事件:

protected void DoSomething(object sender, ListViewCommandEventArgs e)
父GridView上的OnRowdataBound事件已成功调用,只有嵌套的ListView未能调用其事件

我所展示的代码是针对页面上的第二个GridView的,还有另一个,就是这个代码绑定在页面加载事件上。页面加载事件有如下一系列事件,其中绑定了第一个GridView(我们称之为GridView1):

页面加载

GridView的数据是从数据库检索的

  • 数据分配给“DataView”对象,并分配给GridView1数据源属性
  • 调用GridView1.DataBind()
  • 从GridView1中删除某些列的杂项条件逻辑
  • 每行都添加一个OnClick属性
实际上,页面加载绑定了第一个GridView。第二个GridView包含我遇到问题的ListView。第二个GridView(代码在文章顶部)在第一个GridView的“OnRowCommand”事件中填充,其序列如下:

GetDataForListView

从数据库获取数据

  • 将包含数据的数据集分配给第二个GridView的DataSource属性
  • 调用DataBind()方法
然后,正如您从我在顶部发布的代码中看到的,我有一个OnRowDataBound事件,它无法在代码隐藏中调用它的事件

LinkButton有,ListVIew有。所以这个名字不正确。OnCommand仅在LinkButton设置了CommandName时激发。而且,中继器可能会吞下按钮的命令参数。某些控件之所以这样做,是因为事件会以气泡的方式出现在UI中

 <asp:LinkButton ID="linkButton" Runat="Server" OnCommand="DoSomething"  
    CommandName="DoSomething"
    CommandArgument='<%# Eval("ROW_NUM") %>' Text='<%# Eval("FILE_NAME") %>'> 
    </asp:LinkButton>
您的按钮仍需要设置命令名,如:

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

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

问题:当任何与GridView2或ListView或LinkButton相关的事件被触发时,它会首先点击页面加载功能。在页面加载函数中,您没有数据绑定GridView2和ListView,因此显然它们几乎消失,因此不会触发事件

可能的解决方案:

  • 您需要在Page_load函数中绑定GridView2,以便触发那些相关事件,ListView也是如此

  • 这个修复是一个非常大的修复。我不确定你是否可以试试这个

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

    b。使用名为LoadGridView2(parameters)的函数,根据传递的参数绑定GridView2和ListView,并在每次回发时在Page_Load函数中调用此函数,并将隐藏字段中存储的参数传递给LoadGridView2(parameters)

    c。通过执行上述操作,您可以根据GirdView1单击条件绑定GridView2,并使GridView2和ListView在回发中也可用。所以现在事件可能会被触发


    如果有任何疑问,请告诉我。

    您如何确定事件没有触发?调试时是否在方法中放入断点?是的,它不会转到断点。您是否可以提供完整的GridView aspx代码,因为我尝试复制该问题,但我能够在代码中找到OnCommand事件。!?我再次使用上面的aspx代码复制了上述内容,包括Page_Load方法中的gridview绑定和。我能够在没有任何问题的情况下找到隐藏的代码。因此,问题可能是你的代码隐藏。你也可以发布代码隐藏吗(很抱歉,我没有直接问你)。哦,还有,我一开始就忘了提到这个GridView实际上是页面上的第二个GridView。我已经在上面的问题描述的编辑中解释了这一点。对不起,这实际上是一个打字错误。我对LinkButton实际拥有的是一个OnCommand事件。ListView上的OnItemCommand或LinkButton上的“OnCommand”事件均未被调用。您的按钮必须具有CommandName=“####”才能起作用,如上所示。我也尝试过。单击LinkButton时,仍会发生回发,并且仍不会调用该命令。OnCommand或OnItemCommand事件都不起作用。无论我在这里放置什么,呈现的HTML都不会改变-它仍然只是调用回发。好吧,我没有意识到涉及到GridView。。。尝试为GridView添加RowCommand事件处理程序。GridView可能会吞并命令事件,因为数据绑定模板控件是如何工作的……我已经使用OnRowCommand来绑定GridView的值。这会干扰GridView中包含的ListView的事件绑定吗?
    <asp:ListView .. OnItemCommand=".." />
    
    void DoSomething(Object Sender, ListViewCommandEventArgs e) {        
    
          // Do something
       } 
    
     <asp:LinkButton .. CommandName="DoSomething" />