如何在ListView中实现IPostBackEventHandler接口?

时间:2014-01-10 11:28:14

标签: c# javascript asp.net listview

我很难通过点击行中的任意位置来选择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实现这个?谢谢。

0 个答案:

没有答案