Я привязываю ASP.NET ListView к массиву объектов, отсортированных по алфавиту по имени. После редактирования элемента DataSource снова устанавливается и вызывается DataBind. Если имя изменилось, элемент, который вы только что отредактировали, возможно, переместился, возможно, на другую страницу.
Например; вы просто переименовали Хот-дог в колбасу, так что Колбаса перемещалась после завершения ItemUpdating.
--- OLD LIST --- --- NEW LIST ---
Hamburger Hamburger
Hot Dog______ Pizza
Pizza |_____Sausage
Можно ли ожидать такого поведения от формы? Когда вы редактируете строку, вы должны увидеть эту строку после ее сохранения? Должна ли она находиться в том же положении? Должен ли я отображать только запись, которую вы только что отредактировали после сохранения?
Что касается технической стороны сохранения предыдущего порядка после сохранения и, возможно, изменения порядка;
Я знаю , почему это происходит. Я ищу идеи избежать этого.
Я думаю о том, чтобы удалить оба элемента управления EditItemTemplate в ItemTemplate и установить видимость элементов управления только для чтения/редактирования на основе ListView EditIndex.
Это кажется выполнимым, но мне интересно, есть ли у вас прекрасные люди какие-либо другие идеи.
Поведение, которое вы видите здесь, - это типичный желаемый результат, как только вы вносите изменения в правильную сортировку информации. Если вам нужно сохранить старую структуру, вам, скорее всего, придется идти по маршруту, аналогичному тому, что вы упомянули в своем посте.
Тем не менее, я бы взял секунду и посмотрел, действительно ли это то, что ваши пользователи захотят, я мог видеть, что это становится очень запутанным после большого количества изменений.
Когда мои пользователи работают с наборами данных в GridView
s, я всегда заказываю свои данные по идентификатору базы данных, чтобы убедиться, что позиция каждого элемента данных остается неизменной. Не зная, как выглядит ваш источник данных, трудно сказать, можете ли вы избежать или изменить повторный сортировку.
Однако ( это чистая спекуляция, так как я не знаю, какие данные вы работаете с ), если вы сохранили исходный источник данных в сеансе (I ' m, предполагая, что вы возвращаетесь в базу данных и захватываете данные после отправки), и у него есть какой-то упорядоченный идентификатор, тогда вы можете сделать что-то вроде:
void ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
List foodDataSource = Session["dataSource"];
ListItem editedFoodItem = foodListView.Items[e.ItemIndex];
MyFood newFood = new MyFood(
((HiddenField)editedFoodItem.FindControl("foodId")).Value,
((Label)editedFoodItem.FindControl("foodName")).Text
);
foodDataSource.Where(k => k.foodId == newFood.foodId).foodName = newFood.foodName;
//I'm guessing that you'll save somewhere in here,
//rather than do an update-once-style commit to the database when the user clicks a save button.
foodListView.DataSource = foodDataSource;
foodListView.DataBind();
}
Это предполагает, что вы скопировали свой ItemTemplate
, чтобы включить определенный WebControls
/ HtmlControls
. Это неудобно, и этот код необходимо реорганизовать для карантина неприятного кода, такого как вызов FindControl
в отдельной функции, но это довольно близко к тому, что я делаю, когда мои пользователи обновляют данные в GridView
, а затем сохраните их изменения в базе данных.
Alternatively, you could keep your current save methods the same, and just add something like:
void ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
ListItem editedFoodItem = foodListView.Items[e.ItemIndex];
Label foodNameLabel = ((Label)editedFoodItem.FindControl("foodName"));
foodNameLabel.BackColor = System.Drawing.Color.LightGreen;
//Saving in here, somewhere.
//I'm not totally positive that DisplayIndex is the correct property here.
foodListView.Items.Where(k => k.DisplayIndex != e.ItemIndex).BackColor = System.Drawing.Color.White;
}
Я не уверен, что ваши пользователи поймут подсказку пользовательского интерфейса, или если это поможет им, если оно исчезнет (что, конечно, сделает вашу жизнь более сложной), но я думаю, что это менее неуклюжий, чем предыдущий вариант, поскольку если вы сохраняете изменения в базе данных после каждого редактирования.
В некоторых случаях я мог видеть необходимость не прибегать к списку и оставлять предмет, в котором он находится. В то время как мы, программисты, понимаем, что произошло, средний пользователь может подумать, что их предмет был удален.
Я собрал образец веб-сайта, демонстрирующий это поведение. На самом деле это довольно просто, и я уверен, что вы можете адаптировать мой метод для своего проекта.
В оболочке орехов каждый раз, когда сетка привязана, я заказываю список данных по выбору пользователя (или сортировку по умолчанию), но прямо перед привязкой к сетке проверяю, должен ли порядок быть сохранен, и в этом случае , Я извлекаю последний порядковый номер из DataKeyArray сетки и связывает эти порядковые номера с их соответствующими элементами. В случае, когда они не хотят сохранять порядок, я просто связываю инкрементный порядковый номер с каждым элементом в отсортированном списке. Затем я просто сортирую по порядковому номеру.
Взгляните на проект , и я думаю, что это будет иметь больше смысла.