我很难通过点击行中的任意位置来选择ListView
行,而不是使用Button
指定CommandName="Select"
。这是我的代码:
<asp:ListView ID="FileList" runat="server" OnSelectedIndexChanging="FileList_SelectedIndexChanging" OnSelectedIndexChanged="FileList_SelectedIndexChanged" OnItemDataBound="FileList_ItemDataBound">
<LayoutTemplate>
...
</LayoutTemplate>
<ItemTemplate>
<tr id="tr1" runat="server">
....
<td>
<asp:Button runat="server" CommandName="Select" Text="Select" />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
然后我在我的CodeBehind
:
protected void FileList_ItemDataBound(object sender, ListViewItemEventArgs e)
{
((HtmlTableRow)e.Item.FindControl("tr1")).Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(FileList, "Select$" + e.Item.DataItemIndex, true);
}
这成功地将OnClick
属性分配给了我的行 - 据我所知,当点击加上我用来选择行停止工作的Button
控件时会执行一些JavaScript。
我使用Label
控件来拦截页面在点击行时发送的Request["__EVENTTARGET"]
和Request["__EVENTARGUMENT"]
,这就是我得到的:
Request["__EVENTTARGET"] == "ctl00$ctl00$MainContent$LocalMainContent$FileList";
Request["__EVENTARGUMENT"] == "Select$3"; // i.e. "Select$" + row_number
似乎合法,呵呵。
我发现this code处理ListView的PostBack:
public class ListViewEvent : ListView, IPostBackEventHandler
{
public void RaisePostBackEvent(string eventArgument)
{
if (!eventArgument.Contains("$"))
return;
string[] splitEventArgument = eventArgument.Split('$');
switch (splitEventArgument[0])
{
case "Select":
SelectItem(Convert.ToInt32(splitEventArgument[1]));
break;
default:
break;
}
}
}
现在我如何为ListView实现这个?谢谢。