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.

2

3 cevap

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.

2
katma
Evet, hepsi bu şekilde davranan çeşitli web tabanlı yönetim araçlarını kullandım. Her düzenlemeden sonra liste yeniden sıralanır. Tek varyasyon, listede olduğunuz yerde kaldığınızdan veya kaydı yeni yere kadar takip edip etmediğiniz gibi görünüyor. Bu özellikle sayfalama devreye girdiğinde önemlidir ... ve bu kullanıcılarınızın gereksinimlerine bağlıdır.
katma yazar Tevo D, kaynak
İşte mükemmel bir örnek - çevrimiçi bankacılık planlı ödemem ödemelerin yapıldığı tarihe göre sıralanıyor. İlk öğedeki tarihi daha sonraki bir tarihe çevirebilirim ve listeden kaybolabilir. Bu, beklenen bir süre için ne ödeyeceğinin bir görünümü olduğundan beklenen davranıştır.
katma yazar Tevo D, kaynak
Veri listeleri için tipik davranışı düzenledikten sonra yeniden sıralama var mı? Orijinal konumdan uzaklaşacak bir satırı düzenlemek için bile ihtiyacım olan tüm web uygulamalarını hatırlamaya çalışıyorum, ancak şu anda bunu yapamıyorum.
katma yazar Orange Kid, kaynak

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.

1
katma

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.

Projeye göz atın ve bence daha mantıklı olacak.

0
katma