Zaraz... filtrowanie? Pokaż, jak filtrujesz, bo może wystarczy dodać tylko warunek.
Trochę za dużo kodu więc zacznę od początku :)
Planuje napisać aplikację mającą na celu wspomóc wystawiania korekt/zwrotów w programie Subiekt Insertu.
Idea jest prosta - po podaniu asortymentu i klienta zwracającego automatycznie pobieram z bazy wszystkie klienta dokumenty na których się się on znajdował.
Tak wygląda klasa która przechowuje informację o dokumencie.
public class Dokument
{
public event EventHandler OdswiezGridHandler;
private int _id;
private readonly int _magId;
private decimal _wybranaIlosc;
bool _widoczny = true;
protected virtual void Odswiez()
{
if (OdswiezGridHandler != null)
OdswiezGridHandler(this, EventArgs.Empty);
}
public Dokument(int id, string numer, DateTime data, int magId, decimal dostepnaIlosc, decimal cena, bool widoczny = true)
{
_id = id;
Numer = numer;
Data = data;
_magId = magId;
DostepnaIlosc = dostepnaIlosc;
Cena = cena;
Widoczny = widoczny;
UstawSymbolMagazynu();
}
public void UstawSymbolMagazynu()
{
using (var con = new dbaseDataContext())
{
var symbol = (from x in con.sl_Magazyns
where x.mag_Id == _magId
select x.mag_Symbol).FirstOrDefault();
MagSymbol = (symbol == "") ? "ERR" : symbol;
}
}
public void UstawDostepna(decimal dostepna)
{
DostepnaIlosc = dostepna;
}
public int _Id()
{
return _id;
}
public int Id { set => _id = value; }
public string Numer
{
get;
}
public DateTime Data
{
get;
}
public string MagSymbol
{
get;
private set;
}
public decimal Cena { get; set; }
public decimal DostepnaIlosc
{
get;
private set;
}
public decimal WybranaIlosc
{
get { return _wybranaIlosc; }
set {
if (value < 0)
{
_wybranaIlosc = 0;
Odswiez();
return;
}
if (value > DostepnaIlosc)
{
_wybranaIlosc = DostepnaIlosc;
Odswiez();
return;
}
_wybranaIlosc = value;
Odswiez();
}
}
public bool Widoczny
{
get { return _widoczny; }
set
{
if(_widoczny && _wybranaIlosc != 0) _wybranaIlosc = 0;
_widoczny = value;
Odswiez();
}
}
}
Klasa nadrzędna (do obsługi danej pozycji) tworzy listę obiektów dokument i binduje ją z DataGridView.
Gdy w klasie nadrzędnej wywołam metodę (np. skoryguj od najstarszego) ustawia ona pole WybranaIlosc dla każdego dokumentu od najstarszego dopóki suma wybranych ilości nie jest równa z wybraną. Wykonuje ona zwykły foreach na liście obiektów dokument i ustawia pole. Lista jest zbindowana z z Gridem więc automatycznie on reaguje na zmiany.
Chciałem teraz zastosować filtry bo nim użytkownik użyje automatycznego korygowania może chcieć wyłączyć część dokumentów (mające inny magazyn lub starsze niż).
Mógłbym wywalić z listy pozycje które zostały odfiltrowane, ale uznałem, że lepiej by pracownik widział jakie ma opcje.
Gdy uruchamiam filtrowanie ustawiając date klasa nadrzędna leci foreachem i ustawia pole Widoczny na false i już. Pole to zostało ukryte w gridzie bo zajmuje niepotrzebnie przestrzeń.
Załączam screen przedstawiający jak sobie wyobrażam UI do tego modułu.