BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Esybės redagavimo atšaukimas su BindingSource

Paskutiniu metu tenka nemažai krapštytis su Windows Forms ir bėda tokia, kad .NET kaip framework’as juda į priekį, Windows Forms nelabai :)

Didžioji problema yra ta, kad daugelis Windows Forms komponentų (taip pat ir trečios šalies komponentų) vis dar glaudžiai susiję su DataSet, nors realiai DataSet nebesinori niekur naudoti dėl vienokių ar kitokių priežasčių.

Scenarijus, susijęs su šiuo įrašu yra pakankamai įprastas: yra įrašų lentelė, individualus tos lentelės įrašas redaguojamas atskirame lange. Problema iškyla tada, kai tame atskirame lange vartotojas nusprendžia atsisakyti pakeitimų, BindingSource ne DataSet atveju leidžia atšaukti tik paskutinio redaguoto properčio pakeitimus.

Todėl pasirašiau pakankamai “dirty” sprendimą, kuris tenkina mano scenarijus:

   1:  public class BindingSourceWithUndo<T> : BindingSource
   2:      {
   3:          protected T CurrentEntityCopy { get; set; }
   4:  
   5:          public BindingSourceWithUndo(IContainer container):base(container)
   6:          {
   7:  
   8:          }
   9:  
  10:          public void BeginEditCurrentEntity()
  11:          {
  12:              var entity = (T) Current;
  13:              CurrentEntityCopy = entity.ClonePropertiesToNewInstance();
  14:          }
  15:  
  16:          public void CancelEditCurrentEntity()
  17:          {
  18:              var index = IndexOf(Current);
  19:              CurrentEntityCopy.CloneProperties(this[index]);
  20:              EndEdit();
  21:          }
  22:  
  23:          public void FinishEditCurrentEntity()
  24:          {
  25:              CurrentEntityCopy = default(T);
  26:          }
  27:      }

Manau idėja aiški, prieš pradedant redaguoti, nusikopijuojame esybės informacija, kai reikia atšaukti pakeitimus, tiesiog atstatome juos iš kopijos. Esybės kopijavimui kaip pagrindą naudojau Sergejaus kodą iš sbtoolkit kurį papildžiau vienu papildomu metodu:

   1:    public static T ClonePropertiesToNewInstance<T>(this T origin)
   2:          {
   3:              var t = typeof(T);
   4:  
   5:              var destination = (T)Activator.CreateInstance(t, null);
   6:              CloneProperties(origin, destination);
   7:  
   8:              return destination;
   9:          }

Patiko (0)

Rodyk draugams

Komentarai (5)

  1. Geras straipsnis ! :)

  2. I have bookmarked your website and will turn back to read your new articles. I found it on Bing

  3. Liked your posting a lot. I’ll be browsing your website regularly. I found it on AOL

  4. Excellent read. Your blog is worth a read eveyrthing. I found it on yahoo

  5. Activator.CreateInstance(t, null) - yra labai lėtas. Jei redaguojamų duomenų kiekiai būtų didesni, gali kilti greitaveikos problemų.

Rašyti komentarą