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

hec6srdp  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(116)
<asp:ListView ID="CategoryList" runat="server">
   <ItemTemplate>
      <ul id="container">
         <li>
            <img src="<%# Eval("CategorieAfbeelding")%>" alt="">
            <p><%# Eval("CategorieNaam")%></p>
         </li>
      </ul>
      </ItemTemplate>
</asp:ListView>

在上面的代码中,我想要它,所以当我单击列表项时,我触发一个函数,将<%# Eval("CategorieNaam")%>提供给后面的代码。
我通常使用像这样的OnCommand="btnMoreInfo_Command" CommandArgument='<%# Eval("CategorieNaam")%>',但这适用于ASP按钮,而不是列表项。
我尝试在列表项上使用OnCommand函数。我也试过做一个看不见的asp按钮,但那只会造成混乱。这是不可能把项目内的asp按钮要么使它不实用。

j9per5c4

j9per5c41#

只需使用按钮(或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使用datakey。这样做的原因是,您可以轻松地获取数据库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方法。然而,我经常会“弥补”并为行按钮附加一些自定义属性以便于使用。

相关问题