ASP.NET如何从<li>调用OnCommand?

问题描述 投票:0回答:1
c# asp.net function html-lists
1个回答
0
投票

只需使用按钮(或ImageButton)标准点击事件即可。

所以,说这个ListView:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID" >
    <ItemTemplate>
        <tr style="">
            <td><asp:Label ID="FighterLabel" runat="server" Text='<%# Eval("Fighter") %>' /></td>
            <td><asp:Label ID="EngineLabel" runat="server" Text='<%# Eval("Engine") %>' /></td>
            <td><asp:Label ID="ThrustLabel" runat="server" Text='<%# Eval("Thrust") %>' /></td>
            <td><asp:Label ID="DescriptionLabel" runat="server" Text='<%# Eval("Description") %>' /></td>
            <td>
            <asp:ImageButton ID="ImageView" runat="server" Width="200px"
                ImageUrl='<%# Eval("ImagePath") %>'
                OnClick="ImageView_Click"

                />
            </td>
        </tr>
    </ItemTemplate>
    <LayoutTemplate>
        <table id="itemPlaceholderContainer" runat="server" class="table table-hover">
            <tr runat="server" style="">
                <th runat="server">Fighter</th>
                <th runat="server">Engine</th>
                <th runat="server">Thrust</th>
                <th runat="server">Description</th>
                <th runat="server">View</th>
            </tr>
            <tr id="itemPlaceholder" runat="server">
            </tr>
        </table>
    </LayoutTemplate>
</asp:ListView>

请注意,如果可能,我强烈建议对 GridView 或 ListView 使用数据键。原因是您可以轻松获取数据库 PK 行值,但不必在标记中公开甚至显示数据库 PK 行值。

所以,上面加载的代码是这样的:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadData();
    }

    void LoadData()
    {
        ListView1.DataSource = 
            General.MyRst("SELECT * FROM Fighters ORDER BY Fighter");
        ListView1.DataBind();   
    }

现在的结果是这样的:

因此,在上面,我们有一个按钮单击(图像按钮)。

下面展示了简单的按钮点击事件如何获取行信息。

    protected void ImageView_Click(object sender, ImageClickEventArgs e)
    {
        ImageButton btn = (ImageButton)sender;
        ListViewItem lvRow = (ListViewItem)btn.NamingContainer;

        Debug.Print($"Row index click = {lvRow.DisplayIndex}");

        int PK = Convert.ToInt32(ListView1.DataKeys[lvRow.DisplayIndex]);

        Debug.Print($"Data base primary key value = {PK}");

        Debug.Print($"Image URL of button click = {btn.ImageUrl}");

        // get control value from the row.
        Label Engine = (Label)lvRow.FindControl("EngineLabel");
        Debug.Print($"Engine = {Engine.Text}");
        
    }

因此,上面展示了如何获取信息行索引、数据库 PK 值,甚至如何从给定行中提取控件。

ListView、Repeater、GridView 等都支持使用“命名容器”,这将返回行单击对象。

在示例标记中,您没有显示行单击是如何发生的。但是,作为一般规则,您要从中提取当前行值的任何控件?

此类控件应该是服务器端控件,像大多数控件一样具有“id”,因此您可以使用 findcontrol 从给定控件获取值。

在某些情况下,为了“轻松”编码,我经常会动态地添加一些附加按钮属性。

所以,点击上面的图像按钮可以这样说:

            <asp:ImageButton ID="ImageView" runat="server" Width="200px"
                ImageUrl='<%# Eval("ImagePath") %>'
                OnClick="ImageView_Click"
                FighterName = '<%# Eval("Fighter") %>'
                PKID  = '<%# Eval("ID") %>'
                />

所以,我“编造”了 PKID 和 FighterName 属性。

因此,在按钮单击的代码后面,我可以简单地使用添加到按钮单击的“自定义”属性。

例如:

    protected void ImageView_Click(object sender, ImageClickEventArgs e)
    {
        ImageButton btn = (ImageButton)sender;

        Debug.Print($"Fighter name = {btn.Attributes["FighterName"]}");  

        Debug.Print($"PKID = {btn.Attributes["PKID"]}");  

因此,在大多数情况下,您可以(并且应该)使用行项的 FindControl 方法。但是,为了便于使用,我经常会在给定的行按钮单击中添加一些额外的自定义属性。

© www.soinside.com 2019 - 2024. All rights reserved.