我有一个嵌套在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事件中被绑定。 Page Load事件有一系列事件如下,其中第一个GridView(我们称之为GridView1)被绑定:
的Page_Load
从数据库中检索GridView的数据
实际上,Page_Load绑定了第一个GridView。第二个GridView是包含我遇到问题的ListView的。第二个GridView(其代码位于帖子的顶部)填充在第一个GridView的'OnRowCommand'事件中,并且具有如下序列:
GetDataForListView
从数据库中获取数据
然后,从我在顶部发布的代码中可以看到,我有OnRowDataBound事件无法在代码隐藏中调用它的事件。
答案 0 :(得分:1)
Ciaran,我复制了整个场景并发现了以下问题。
问题当任何与GridView2或ListView或LinkButton相关的事件被触发时,首先点击Page_load函数。在 Page_load函数中,您不是数据绑定GridView2和ListView 所以显然它们几乎消失了,所以事件不会被触发。
可能的修复:
您需要在Page_load函数中绑定GridView2,以便触发这些相关事件,而ListView Too也是如此。
此修复程序非常大。我不确定你是否可以试试这个。
一个。如果您根据GridView1生成的条件绑定GridView2,则将这些参数存储在某个隐藏字段中。
湾有一个名为LoadGridView2(参数)的函数,你根据传递的参数绑定GridView2和ListView,并在每次完成PostBack时在Page_Load函数中调用此函数,并将隐藏字段中存储的参数传递给LoadGridView2(参数) )
℃。通过上面的操作,您可以根据GirdView1 Click条件绑定GridView2,并使PostView中的GridView2和ListView也可用。所以现在可以解雇这个事件。
如有任何疑问,请与我联系。
答案 1 :(得分:0)
LinkButton有OnCommand,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" />