ASP.NET LinkBut​​ton没有调用' OnCommand'事件

时间:2014-03-14 12:27:30

标签: 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"  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事件中被绑定。 Page Load事件有一系列事件如下,其中第一个GridView(我们称之为GridView1)被绑定:

的Page_Load

从数据库中检索GridView的数据

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

实际上,Page_Load绑定了第一个GridView。第二个GridView是包含我遇到问题的ListView的。第二个GridView(其代码位于帖子的顶部)填充在第一个GridView的'OnRowCommand'事件中,并且具有如下序列:

GetDataForListView

从数据库中获取数据

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

然后,从我在顶部发布的代码中可以看到,我有OnRowDataBound事件无法在代码隐藏中调用它的事件。

2 个答案:

答案 0 :(得分:1)

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

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

可能的修复:

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

  2. 此修复程序非常大。我不确定你是否可以试试这个。

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

    湾有一个名为LoadGridView2(参数)的函数,你根据传递的参数绑定GridView2和ListView,并在每次完成PostBack时在Page_Load函数中调用此函数,并将隐藏字段中存储的参数传递给LoadGridView2(参数) )

    ℃。通过上面的操作,您可以根据GirdView1 Click条件绑定GridView2,并使PostView中的GridView2和ListView也可用。所以现在可以解雇这个事件。

    如有任何疑问,请与我联系。

答案 1 :(得分:0)

LinkBut​​ton有OnCommand,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" />