【问题标题】:Changing the SelectedIndex of Multiple Select Listbox to the last selected item将多选列表框的 SelectedIndex 更改为最后一个选定项
【发布时间】:2011-06-10 20:35:47
【问题描述】:

引用一个 C#、.net、System.Web.UI.WebControls.Lisbox,它有一个多选选项 true,并且每次选择的索引更改时都需要进行回发。

问题是,[SelectedIndex / SelectedItem / SelectedValue] 总是在第一个选定项的值上。单击第二个项目,第三个项目,不会更改 SelectedIndex,导致列表框重新加载并滚动到所选项目的最高位置。

【问题讨论】:

  • 我得到的最接近的解决方案是一个全局 javascript var 来跟踪最后点击的项目。但这并不理想,在预渲染时,列表框会跳转到最顶部的选定项(在任何 javascript 可以启动之前)。
  • 另外...当我调试 SelectedIndexChange 函数时,缓存了一个选定项目的列表,但没有指示最后添加的项目。
  • 我想在后端没有真正的方法可以做到这一点,同时仍然使用回发是 Listbox 的真正选项。如果是这样,请关闭此线程。

标签: c# .net asp.net listbox


【解决方案1】:

Brandon - 你能分享你加载列表框的代码吗?以下是 ListBox 不保留其选择的几个可能原因:

  1. 在 post back 中重新加载列表框(在处理 post 数据之后)
  2. 在页面生命周期后期动态加载列表框,因此没有机会处理回发数据
  3. 动态加载列表框(可能在模板化的父级中),以便其客户端 ID 发生变化(或者具体而言,在发生后期数据处理时,客户端 ID 不同)。

【讨论】:

  • 列表框正在保存它的选择,我只是不知道项目中最后一个点击的项目。
  • @Brandon,了解您的问题。可能的解决方案可能是跟踪先前选择的项目以确定现在已更改的项目,然后使用 java-script 滚动控件。 IMO,更好的解决方案是考虑一些备用用户界面 - 例如,有两个并排的列表框 - 一个显示可用选项,另一个显示带有左/右箭头按钮选择/取消选择的选定选项。
  • 不幸的是,我已经考虑了这两种选择。列表框是一个带有删除选项的排序列表,因此将其分成 2 个单独的列表框是不适用的。 javascript 选项有效,但在预渲染之后,因此如果我在顶部选择了一项,然后在底部选择了一项,则可能会在列表框中向上跳然后向下跳。
【解决方案2】:

SelectedIndex 将始终指向最低的选定索引。 ListBox.SelectedIndex 属性的定义:

获取或设置列表中所选项目的最低序号索引。

手动设置 selectedindex 属性将取消选择所有其他选择,我很确定没有办法(在 .net 代码中)向下滚动到特定选择。

我不清楚您要做什么,但也许您可以使用 GetSelectedIndices ListBox 函数捕获所有选定的索引,并与之前捕获的选定索引进行比较以确定最近的选定项.

【讨论】:

  • 我可以捕获所有选定的索引.. 但不确定如何在 ListBox click+postback 之前捕获以前选择的索引。
  • 你说得对,手动设置 SelectedIndex 会杀死多个选定的项目。所以我猜这个问题没有解决方案。当我有一个非常长的列表框时,这很烦人,并且单击底部项目将导致回发并定位到所选项目列表中更高的任何所选项目,从而可能隐藏最近单击的项目。
  • 也许您可以使用第二个列表框来仅显示所选项目。对于每个 SelectedIndexChanged 事件,您可以重建第二个列表。
【解决方案3】:

Brandon 确保不要在每次页面加载时都填充 ListBox

【讨论】:

  • 正如我所说的预选赛。回发选项(因此自动填充)是必要的,并且对于解决方案设置为 true。
  • 我可能需要重构整个列表框和那些依赖于自动回发的控件...
  • 当我在回发之前遇到这个问题时,每次回发页面时,我都会重新填充我的列表框。
【解决方案4】:

就这个控件而言,没有办法做到这一点。

【讨论】:

  • 废话 :) 见我的回复。我没有尝试过,但原则上它应该可以工作。祝你好运。
【解决方案5】:

这严格来说是一个滚动问题。

要显式控制 ListBox(或与此相关的任何元素)的滚动值,您需要使用 JavaScript 设置 scrollTop 属性:

document.all.getElementById("elementID").scrollTop = VALUE.

因此,更改为您的列表框执行回发的 JavaScript 处理程序,它看起来像“javascript:__doPostBack(...”。将其替换为对获取当前 scrollTop 值并保存它的自定义函数的调用。到一个隐藏变量,然后调用 __doPostBack ,因为它最初应该是。

在往返之后,该隐藏值应该会持续返回给客户端,因此在 JavaScript 页面加载事件中,只需读取该隐藏值并将其重新应用到列表框的 scrollTop 即可。然后,您的列表框将准确地滚动到回发发生之前的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多