【问题标题】:How to get selected items of Listbox control?如何获取列表框控件的选定项?
【发布时间】:2013-02-09 13:32:49
【问题描述】:

我正在用 ASP.NET 和 c# 开发一个应用程序。我的页面中有一个网格视图。我有一个 Listbox 控件,默认情况下 Enabled 属性由 false 设置。我正在尝试从 Checkbox 控件上的 javascript / jQuery 启用和禁用该控件。

我的 ASP 代码:

<asp:GridView ID="gvWhom" runat="server" AutoGenerateColumns="False" DataSourceID="odsWhom"
GridLines="None" Width="100%" OnRowDataBound="gvWhom_RowDataBound">
<Columns>
<asp:TemplateField>
    <HeaderTemplate>
    </HeaderTemplate>
    <ItemTemplate>
    <table width="100%" cellpadding="0" cellspacing="0" border="0">
        <tr style="height: 25px;">
        <td width="20%">
            <asp:CheckBox ID="chkCriteria" runat="server" Text='<%#Eval("TargetType") %>' />
        </td>
        <td width="80%">
            <asp:ListBox ID="lbCriteria" runat="server" CssClass="ddl" Width="150px" Height="50px"
            Enabled="false" SelectionMode="Multiple"></asp:ListBox>
        </td>
    </table>
    </ItemTemplate>
    <HeaderStyle Height="2px" />
</asp:TemplateField>
</Columns>
</asp:GridView>

Javascript 代码:

function disableDropDown(chkCriteria, lbCriteria) {
    if (document.getElementById(chkCriteria).checked) {         
     document.getElementById(lbCriteria).removeAttribute('disabled');
    }else{
     document.getElementById(lbCriteria).value = -1;
     document.getElementById(lbCriteria).disabled = true;
    }
    return true;
}

C# 代码:

protected void gvWhom_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
    ListBox lbCriteria = (ListBox)e.Row.FindControl("lbCriteria");
    CheckBox chkCriteria = (CheckBox)e.Row.FindControl("chkCriteria");
    chkCriteria.Attributes.Add("onchange", "javascript:return disableDropDown('" + chkCriteria.ClientID + "', '" + lbCriteria.ClientID + "')");
    }
}

使用上面的代码,我可以启用/禁用 Listbox 控件。但是当我启用控件并选择多个项目并提交表单时,我无法找到列表框的选定项目

如何获取列表框的选定项?或者有没有其他方法可以启用 - 禁用列表框控件并在 c# 代码中获取所选项目?

【问题讨论】:

  • 我的猜测是 ASP.NET 会忽略它,因为它已被禁用。在客户端更改它可能为时已晚,因为框架已经决定将其从视图状态中分离出来。如果您不在控件标记中禁用它,而是在文档呈现时立即在 JavaScript 中禁用它,会发生什么情况?然后根据需要在 JavaScript 中继续启用/禁用。从服务器的角度来看,它会“期望”它被启用并像其他控件一样跟踪它。
  • @David 你能用一些代码解释一下吗?如果我必须在页面加载时这样做,我没有问题。我的目标是启用 - 禁用该控件。

标签: c# javascript jquery asp.net listbox


【解决方案1】:

这主要是猜测,但值得一试......

您在此处禁用服务器端的控件:

<asp:ListBox ID="lbCriteria" runat="server" CssClass="ddl" Width="150px" Height="50px"
        Enabled="false" SelectionMode="Multiple"></asp:ListBox>

Enabled="false" 可能向 ASP.NET 表明它不需要跟踪此控件,不会对其进行更改。这可能是为什么当您发回服务器时它没有取回数据。

让我们尝试从服务器(ASP.NET)的角度保持启用控件,并在客户端(JavaScript)端完全维护 UI 中的启用/禁用。从本质上消除了 ASP.NET 的内置框架,让您无法决定要跟踪哪些数据。

首先在服务器端控件标记中启用控件:

<asp:ListBox ID="lbCriteria" runat="server" CssClass="ddl" Width="150px" Height="50px"
        SelectionMode="Multiple"></asp:ListBox>

其余的由 JavaScript 处理。您已经有一些 JavaScript 代码,您说它们为您启用/禁用了客户端上的控件,对吗?因此,您现在需要做的就是在页面首次在浏览器中加载时为控件的每个实例调用相同的 JavaScript,以禁用客户端控件。这是你想要的部分:

document.getElementById(lbCriteria).value = -1;
document.getElementById(lbCriteria).disabled = true;

现在,您似乎正在从服务器端代码绑定 JavaScript 事件,在这方面我将无法提供太多帮助,因为该方法对我来说不是特别直观。 (它混合了 JavaScript 和 C#,感觉有点倒退。)所以我不完全确定你会采用哪种方法。

本质上,您希望为控件的每个实例调用这两行 JavaScript,并且您希望它在页面加载到浏览器中时立即发生。

在 jQuery 中我会做这样的事情:

$(function () {
    $('select.ddl').attr('disabled', 'disabled');
});

这将在加载 DOM 时运行,并将添加 disabled 属性(值为 "disabled" 到每个 select 与类 ddl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多