ASP.NET listbox MaintainScrollPositionOnPostBack переупорядочение элементов внизу, перезагрузка списка вверху

У меня есть страница ASP.NET (VB) с двумя списками. Стандартный материал - выберите элемент слева, нажмите кнопку "Добавить", и он перемещается вправо и т. Д. У меня также есть две кнопки для перемещения элементов вверх или вниз в результирующем списке. Моя проблема в том, что если я перейду ко 2-му последнему элементу (или любому другому в этом диапазоне) и переместу его вниз по списку, список сбрасывает полосу прокрутки в верхнюю позицию. Я хочу, чтобы фокус был на предмете, который был повышен или понижен в должности, независимо от того, находится ли он "ниже сгиба" или нет.

У меня есть MaintainScrollPositionOnPostBack в объявлении моей страницы, и он отлично работает для страницы в целом, и хотя он ничего не делает для списка, это тип поведения, который я ищу. Можно ли это сделать только на VB, не прибегая к Javascript или AJAX?

Заранее благодарим вас за любые идеи или предложения, которые вы можете иметь. Фрагмент кода ниже:

If lstToFields.SelectedIndex < lstToFields.Items.Count - 1 Then
    Dim RowNum As Integer = lstToFields.SelectedIndex
    Dim RowVal As ListItem = lstToFields.SelectedItem
    lstToFields.Items.RemoveAt(RowNum)
    lstToFields.Items.Insert(RowNum + 1, RowVal)
    lstToFields.SelectedIndex = RowNum + 1
End If

1 ответ

Похоже, что ваша проблема похожа на ту, что была у меня недавно. Я склонен сказать, что PostBack - это ваша проблема, и вам придется обрабатывать позицию прокрутки с помощью JavaScript. Мое решение было следующим:

Создайте HiddenField на странице ASPX для хранения текущей позиции полосы прокрутки.


< asp : HiddenField ID ="hdnScollTop" EnableViewState =true runat="server" />

Создайте функции JavaScript в теге, чтобы сохранить и загрузить значение из HiddenField, с помощью которого вы получаете и устанавливаете позицию прокрутки. У меня также была функция Updatelist(), которую я должен был использовать для моего множественного выбора ListBox.

function Updatelist() { //details removed } function GetListBoxScrollPosition(){ var sel = document.getElementById('<%=lstbxStuff.ClientID%>'); var hdnScrollTop = document.getElementById('<%=hdnScollTop.ClientID %>'); hdnScrollTop.innerText=sel.scrollTop; } function SetListBoxScrollPosition(){ var sel = document.getElementById('<%=lstbxStuff.ClientID%>'); var hdnScrollTop = document.getElementById('<%=hdnScollTop.ClientID %>'); sel.scrollTop=hdnScrollTop.value; //not sure why it's in value when I clearly put it in innerText. This is what works. }

В Form_Load зарегистрируйте функции JavaScript и инициализируйте значение HiddenField. В Page_Load кода позади я установил все скрипты.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindACLs();
            //I use the hidden field to set the lstbxStuff 
            //scroll bar, which will scroll to the top anyway. 
            //This is to avoid a JavaScript error. 
            hdnScollTop.Value = "0";
        }
        else
        {
            lstbxStuff.Focus();
        }
        lstbxACLs.Attributes.Add("onclick", "GetListBoxScrollPosition();Updatelist();");
        lstbxACLs.Attributes.Add("onfocus", "SetListBoxScrollPosition();");


    }
Другие вопросы по тегам