从 DoubleClick、Web 应用程序而非 Windows 窗体上的 ListBox 获取选定值

Posted

技术标签:

【中文标题】从 DoubleClick、Web 应用程序而非 Windows 窗体上的 ListBox 获取选定值【英文标题】:Getting Selected Value from ListBox on DoubleClick, Web App, Not Windows Forms 【发布时间】:2020-12-16 15:46:29 【问题描述】:

我有一个带有 C# 代码的 ASP.Net 网站。我试图从 asp.net 列表框中双击获取选定的值。我看到的所有解决方案都是针对 Windows 窗体的,实际上是否存在 Doubleclick 事件。 ListBox 的 System.Web.UI.WebControls 版本没有这样的运气。

需要双击来触发后面代码中的一个方法,该方法允许我读取所选值。

有很多关于这方面的帖子,但它们不适用于 System.Web.UI.WebControls.ListBox。

以下是代码示例:

.aspx 页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="XXX-AddressBook.aspx.cs" EnableViewState="true" Inherits="VRV_AddressBook" %>

<html xmlns="https://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>

    <%-- <meta http-equiv="X-UA-Compatible" content="IE=7, chrome=1"/>--%>
    <meta http-equiv="x-ua-compatible" content="IE=edge" />
    <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
    <meta http-equiv="Expires" content="0">
    <meta http-equiv="Cache-Control" content="no-cache">
    <meta http-equiv="Pragma" content="no-cache">

<style>
</style>

<script type="text/javascript">
</SCRIPT>

    <title> Address Book</title>
</head>
<form id="frmAddressBook" runat="server">
<div>
<asp:ListBox ID="lstbxddNames" runat="server"  Rows="17" SelectionMode="Multiple"></asp:ListBox>
</div>
</form>

</body>
</html>

来自.aspx.cs页面的Proposed Method,由于Web App版本没有双击动作,无法触发:

private void lstbxddNames_DoubleClick(object sender, System.EventArgs e)

    if (lstbxddNames.Items.Count > 0)
    
        for (int i = 0; i < lstbxddNames.Items.Count; i++)
        
            if (lstbxddNames.Items[i].Selected)
            

                string Test = lstbxddNames.Items[i].Value.ToString();
            

        
    

这是我加载 ListBox 的方式:

DataTable dt_UserRS = new DataTable();

然后我从 SQL 查询中加载数据表的内容(代码未显示)

    if (Choice.ToUpper() == "GLOBAL")
    
        lstbxddNames.DataSource = dt_UserRS;
        lstbxddNames.DataTextField = "Name";
        lstbxddNames.DataValueField = "Email";
        lstbxddNames.DataBind();
    

这是我正在使用的解决方案。我实际上在发布之前尝试过这个,但是我把它放在了 PageLoad 中的错误位置(我把它错误地放在了 if (!IsPostBack) 部分)。

  protected void Page_Load(object sender, EventArgs e)
        

            if (Request["__EVENTARGUMENT"] != null && Request["__EVENTARGUMENT"] == "lstdbclick")
            
                lstbxddNames_DoubleClick(lstbxddNames.SelectedValue.ToString());

              //  string TEST = lstbxddNames.SelectedValue.ToString();
            
            lstbxddNames.Attributes.Add("ondblclick", ClientScript.GetPostBackEventReference(lstbxddNames, "lstdbclick"));

            if (!IsPostBack)
            
                ViewState["ViewStateId"] = System.Guid.NewGuid().ToString(); //PART OF PAGE REFRESH DETECTION
                Session["SessionId"] = ViewState["ViewStateId"].ToString();

确保它也能命中方法:

private void lstbxddNames_DoubleClick(string Value)

    if (!String.IsNullOrEmpty(Value))
    

        string Test = Value;
    


这里发生了什么? 我不明白的一件事是为什么要添加属性?如果我可以检测到带有事件参数的双击,为什么要添加属性?

【问题讨论】:

双击什么?听起来是javascript 的好候选人 双击列表框中的项目。我不擅长 Javascript,因此使用 C# 解决方案。如果您可以为我制作 Javascript 解决方案白痴证明,我将欢迎您的帮助! 向我提供列表框的html 标记,我可以做到。 "需要双击来触发后面代码中的方法..." 您不需要需要 dbl-clk 来触发方法。只需单击一下即可。 它是一个多选列表框。如果用户选择了多个项目,第一次单击将在选择其余项目之前触发。 【参考方案1】:

在您的列表框循环中,您可以将双击事件连接到每个项目。例如

 item.Attributes.Add("ondblclick", "functionCall();");

【讨论】:

不确定我是否理解。 Listbox 循环必须通过双击触发才能启动代码。 ListBox 没有“双击”操作。 供参考:docs.microsoft.com/en-us/dotnet/api/… Jobesk- 你的意思是当我填充列表框时?你是说我可以添加那个属性吗? (即使 DoubleClick 没有原生操作?) 您想在列表框本身或其项目上创建双击操作?两种方式都可以,只需在运行时相应地添加属性即可。 它的项目。如何在运行时添加属性以及在代码中的什么位置添加它?

以上是关于从 DoubleClick、Web 应用程序而非 Windows 窗体上的 ListBox 获取选定值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WinApi/user32.dll 或类似的东西远程执行 ListBox 的 ListBox1_DoubleClick 事件?

如何在 .NET 单选按钮中获取 DoubleClick 事件?

如何在本地 IIS 而非 Express 中调试 ASP.NET 5 Web 应用程序

javascript DoubleClick Floodlight

doubleclick video notes

为啥 Windows 在 KeyDown 上播放哔声,但在 DoubleClick 上不播放?