[英]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>
数据已成功绑定,但是在单击LinkButton时不会触发OnCommand事件(LinkButton的任何其他事件,例如OnClick事件)也不会触发。
链接按钮的呈现HTML显示,单击该按钮时,页面正在执行回发: javascript:__doPostBack('...','')
这意味着它将返回我的“ Page_Load”并刷新页面的内容-网格视图已绑定到此处。
通过将此属性添加到LinkButton,可以阻止它执行回发:
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的数据从数据库中检索
因此,实际上,Page_Load绑定第一个GridView。 第二个GridView是包含我有问题的ListView的那个。 在第一个GridView的'OnRowCommand'事件中填充此第二个GridView(其代码位于文章顶部),其顺序如下:
GetDataForListView
从数据库获取数据
然后,从您在顶部发布的代码中可以看到,我有OnRowDataBound事件,该事件无法在后面的代码中调用其事件。
Ciaran,我复制了整个场景,并发现了以下问题。
问题:当任何与GridView2或ListView或LinkButton相关的事件被触发时,它首先命中Page_load函数 。 在Page_load函数中,您不是数据绑定GridView2和ListView,因此显然它们几乎消失了,因此不会触发该Event。
可能的修复:
您需要在Page_load函数中绑定GridView2才能触发这些相关事件,并且ListView Too也是如此。
此修复程序非常重要。 我不确定是否可以尝试。
一种。 如果根据GridView1生成的条件绑定GridView2,则单击然后将这些参数存储在某个隐藏字段中。
湾 有一个名为LoadGridView2(parameters)的函数,您可以在此绑定GridView2和ListView,具体取决于传递的参数,并在每次完成PostBack后每次在Page_Load函数中调用此函数,并将隐藏字段中存储的参数传递给LoadGridView2(parameters) )
C。 通过上述操作,您可以根据GirdView1 Click条件绑定GridView2,并使GridView2和ListView在PostBack中也可用。 因此,现在该事件可能会被解雇。
如有任何疑问,请通知我。
LinkButton的具有点播 ,ListView中有OnItemCommand 。 因此名称不正确。 仅当LinkButton设置了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.