Dugmići na formi bi uvek trebali da budu
enabled, a ako neku akciju hoćeš da zabraniš, onda korisniku uvek prikaži i poruku/razlog:
Ta akcija nije dozvoljena zbog toga i toga... Ukoliko npr. radiš program za štampanje faktura i disejbluješ/sakriješ dugme za štampu sve dok faktura nije sačuvana, velika je verovatnoća da će te klijent zvati i pitati zašto tog dugmeta nema na formi, a ranije je bilo :)
Umesto
DataSet-ova i
TableAdapter-a, mogao bi da koristiš svoje klase i klasični
ADO.NET ili neki
ORM tipa
LINQ to SQL ili
Entity Framework. Ima malo više za kucanje, ali ti daje mnogo veću fleksibilnost nego
wizard-i.
Napraviš prvo jednu baznu klasu, koja ima
property IsDirty i koji određuje da li je neki
property promenjen ili nije.
Code:
public class BaseClass
{
public bool IsDirty { get; set; }
public void SetClean()
{
IsDirty = false;
}
}
Prilikom dohvatanja podataka iz baze, kao i nakon uspešnog snimanja promena u bazu, trebaš da pozoveš metodu
SetClean().
Sve ostale klase treba da naslede baznu klasu, npr:
Code:
public class Foo : BaseClass, INotifyPropertyChanged
{
private int _id;
public int Id
{
get { return _id; }
set
{
if(_id != value)
{
_id = value;
NotifyPropertyChanged("Id");
}
}
}
private string _boo;
public string Boo
{
get { return _boo; }
set
{
if(_boo != value)
{
_boo = value;
NotifyPropertyChanged("Boo");
}
}
}
private void NotifyPropertyChanged(string propertyName)
{
IsDirty = true;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
Ovako posle povežeš kolekciju svojih objekata i
DataGridView:
Code:
List<Foo> list = ... dohvatiš podatke iz baze
DataGridView1.DataSource = list;
Pošto lista može biti velika, a korisnik obično izmeni samo nekoliko redova preko DataGridView-a, nema potrebe da za svaki
list item radiš UPDATE u bazi.
Umesto toga, možeš da protrčiš kroz kolekciju objekata i vidiš koji objekti imaju
IsDirty == false i da samo za njih uradiš UPDATE:
Code:
foreach(var item in list)
{
if(item.IsDirty)
{
// save changes
}
}