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();");
}