Listede bir satır düzenledikten sonra öğe konumunu koru ... Denemeli miyim?
Bir ASP.NET ListView öğesini, ada göre alfabetik olarak sıralanmış bir nesneye manuel olarak bağlarım. Bir öğeyi düzenledikten sonra DataSource yeniden ayarlanır ve DataBind çağrılır. İsim değiştiyse, yeni düzenlediğiniz öğe potansiyel olarak başka bir sayfaya bile taşınmış olabilir.
Örneğin; Sadece Hot Dog'ı Sosis olarak değiştirdiniz, böylece ItemUpdating tamamlandıktan sonra sosis taşıdı.
--- OLD LIST --- --- NEW LIST ---
Hamburger Hamburger
Hot Dog______ Pizza
Pizza |_____Sausage
Bu davranış bir formdan bekler mi? Bir satırı düzenlediğinizde, kaydettikten sonra bu satırı görmeyi beklemeniz gerekir mi? Tam olarak aynı konumda mı olmalı? Sadece kaydettikten sonra kaydettiğiniz yalnızca kaydını mı göstermeliyim?
Bir önceki siparişi kaydettikten sonra teknik olarak ve potansiyel olarak siparişi değiştirerek ;
Neden olduğunu biliyorum. Bunu önlemek için fikirler arıyorum.
EditItemTemplate kontrollerini ItemTemplate ile birleştirmeyi ve ListView EditIndex'i temel alan salt okunur/düzenlenebilir kontrollerde görünürlük ayarlamayı düşünüyorum.
Bu mümkün görünüyor ama iyi millet başka fikirleri varsa merak ediyorum.
Burada gördüğünüz davranış, bilginin düzgün bir şekilde sıralandığı değişikliği yaptıktan sonra, istenen istenen çıktıdır. Eski yapının korunmasına ihtiyaç duyuyorsanız, büyük ihtimalle postada belirttiğiniz şeye benzer bir rotaya gitmeniz gerekecektir.
Ancak, bir saniye sürecek ve bunun gerçekten kullanıcılarınızın isteyeceği şey olup olmadığını görecek olursak, çok sayıda düzenlemeden sonra bunun gerçekten kafa karıştırıcı olduğunu görebiliyordum.
Kullanıcılarımın GridView 'lardaki veri kümeleriyle çalıştığım zaman, her veri öğesinin konumunun aynı kaldığından emin olmak için her zaman veritabanım kimliğiyle veri sipariş ediyorum. Veri kaynağınızın neye benzediğini bilmeden, yeniden sıralamadan kaçınabileceğinizi veya değiştirebileceğinizi söylemek zor.
Ancak, orijinal veri kaynağınızı oturuma kaydettiyseniz ( bu, ne tür verilerle çalıştığınızı bilmediğimden beri tam bir spekülasyon olur ) (I ' Veritabanına geri döndüğünüzü ve teslim ettikten sonra verileri yakaladığınızı varsayarak) ve bir çeşit tanımlayıcıya sahip olduğunu varsayalım, o zaman şöyle bir şey yapabilirsiniz:
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();
}
Bu, belirli WebControls / HtmlControls içerecek şekilde ItemTemplate kodunuzu kodladığınızı varsayar. Rahatsızdır ve bu kodun FindControl gibi kötü olmayan kodları ayrı bir işlev içinde karantinaya almak için yeniden kodlanması gerekir, ancak bu benim kullanıcıların verileri GridView ile güncellediğinde yaptığım şeye oldukça yakındır. ve ardından değişikliklerini veritabanına kaydeder.
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;
}
Kullanıcılarınızın UI işaretini anlayacağından emin değilseniz ya da eğer (eğer hayatınızı daha da karmaşıklaştıracaksa), eğer bu size yardımcı olursa, yukarıdaki seçeneklerden daha az karmaşıktır. Her düzenlemeden sonra değişiklikleri veritabanına kaydettiğiniz sürece.
Bazı durumlarda, listeye başvurma ve öğeyi bulunduğu yere bırakma gereğini görebiliyordum. Programcılar ne olduğunu anlasalar da, ortalama bir kullanıcı öğelerinin silinmiş olduğunu düşünebilir.
Bu davranışı gösteren örnek bir web sitesi hazırladım. Gerçekleştirmek gerçekten çok kolay ve eminim ki projenize yönelik yöntemimi uyarlayabilirsiniz.
Bir somun kabuğunda, ızgara her bağlandığında, kullanıcının listesini (ya da varsayılan sıralama), kullanıcının seçimine göre sıralıyorum, ancak kılavuza bağlamadan hemen önce, siparişin korunup korunmadığını kontrol ediyorum, bu durumda Son sıra numarasını grid'in DataKeyArray öğesinden çıkarırım ve bu sıra numaralarını ilgili öğelere ilişkilendiririm. Siparişi korumak istemedikleri durumlarda, sıralı listedeki her bir öğeye artımlı bir sıra numarasını ilişkilendiririm. Sonra sıra numarasına göre sıralıyorum.