首页 文章

使用Rows属性控制ASP.Net列表框的滚动

提问于
浏览
0

所以我有这个简单的jane Listbox控件,它填充了来自init页面上的数据库的条目 . 现在默认情况下,它的行数/大小属性为4.我将此控件包含在div中,该div设置为左侧和100%高度,禁用页面滚动,以便所有内容都在一个非滚动页面上 .

使用默认设置,如果单击任何大于4的条目,列表框将滚动以将您单击的内容放在框中的第4个位置,这也会导致我的event.target对象指向选择元素而不是单击选项元素,根据点击的内容阻止处理(为清楚起见,这是在客户端js) . 这一直存在,直到您一直滚动到底部,此时您可以单击列表框中显示的任何内容 .

如果我将其设置为可用记录的数量,您可以单击项目的第一个“页面”中的任何内容,它将正常工作,但如果您滚动并尝试单击不在第一个显示的集合中的任何项目(甚至1个项目) )一旦你点击它,列表框将滚动回到顶部,并且save event.target对象问题显示自己 . 如果您尝试使用箭头键进行导航,突出显示将会更改,但列表框将保持在顶部滚动,您无法看到它 .

如果我设置为我在屏幕上显示的项目的确切数量,它的工作方式与我期望的完全相同 . 我可以点击顶部的任何条目或滚动到所有事件,所有事件都很高兴 . 这一切都很棒但只适用于我特定的浏览器高度 .

我关闭了AutoPostback,尝试将MaintainScrollPositionOnPostback设置为true,现在我正在尝试使用javascript例程来扫描select并计算屏幕上实际可见选项的数量并在元素上设置size属性页面命中客户端后手动 .

有谁知道更好的方法来控制这个滚动问题 . 有没有办法告诉.Net或Listbox自动执行此操作?由于我将要修改.Net控制客户端,我担心如果我必须做任何事情,这将导致后期问题 . 我不相信必须重新计算任何时间尺寸变化时每个选项在屏幕上或屏幕外的位置 . 我已经搜索了好几天,似乎人们有类似的问题,但它要么是回发,要么已经知道将会有多少行,或者他们正在添加/删除/行导致重绘 . 是javascript真的是我唯一的答案,如果是这样,那会如何搞定我的会话状态?

编辑1:添加代码

HTML:

<html>
  <head></head>
  <body>
    <div id="main" class="flexRow">
      <div id="listWrap" class="flexCol w25p">
        <asp:ListBox runat="server" ID="lstContents"></asp:ListBox>
        <div class="flexRow">
          <button value="New">New</button>
          <button value="Del">Delete</button>
        </div>
      </div>
      <div id="content" class="flexCol"></div>
    </div>
  </body>
</html>

代码隐藏:

//Global Variable
List<Content> ContentList { get;set; }

protected void Page_PreRender(object sender, EventArgs e)
{
    lstContents.Items.Clear();
    var ctx = HttpContent.Current;
    using (var s = new SQL(Conn))
    using (var r = (IDataReader)s.ExecProc(QType.Reader, "GetContent"))
        while (r.Read()) {
            ContentList.Add(new Content(r));

    var orderedSet = from c in ContentList
                     orderby c.ID
                     select c;

    foreach (var c in orderedSet)
        lstContents.Items.Add(new ListItem(c.Name, c.ID));

    lstContents.SlectionMode = ListSelectionMode.Single;
    lstContents.AutoPostBack = false;
    lstContents.Rows = 44; //ContentList.Count; //2; //1; //0; //999999;
}

1 回答

  • 0

    你失去了我“...这也导致我的event.target对象指向选择元素而不是点击的选项元素...”

    我走到了尽头 . :)我想你在谈论在列表框中保持滚动位置 .

    我使用updatepanels下面的代码 . 也许你可以适应它 .

    // To maintain scroll position of a listbox inside an update panel.
    // Make sure this script is after the scriptmanager.
    // Source: http://weblogs.asp.net/andrewfrederick/archive/2008/03/04/maintain-scroll-position-after-asynchronous-postback.aspx
    
    var xPos, yPos;
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    
    function BeginRequestHandler(sender, args) {
        if ($get('lst') !== null) {
            // Get X and Y positions of scrollbar before the partial postback
            xPos = $get('lst').scrollLeft;
            yPos = $get('lst').scrollTop;
        }
    }
    
    function EndRequestHandler(sender, args) {
        if ($get('lst') !== null) {
            // Set X and Y positions back to the scrollbar after the partial postback
            $get('lst').scrollLeft = xPos;
            $get('lst').scrollTop = yPos;
        }
    }
    
    prm.add_beginRequest(BeginRequestHandler);
    prm.add_endRequest(EndRequestHandler);
    

相关问题