Ustawianie odpowiedniego property jeśli warunek zwróci true

0

Witam!
Pytanko, pewnie głupie.
Mam klasę:

public class DocumentMM
{
  public int ID {get;set;}
  public string Reference {get;set;}
  public DocumentAction1 {get;set;} //lub DocumentAction2 {get;set;}
  public bool Status {get;set;}
}

Potrzebuje teraz, w zależności od tego co przyjdzie z bazy, manewrować pomiędzy:

public enum DocumentAction1
{
  DodajZamowienie,
  StatusZamowienia,
  SzczegolyZamowienia
}

public enum DocumentAction2
{
  DodajPrzyjecie,
  StatusPrzyjecia,
  SzczegolyPrzyjecia
}

Jeżeli na dokumencie magazynem źródłowym jest magazyn A to obiekt DocumentMM ma mieć DocumentAction1, jeżeli magazynem docelowym jest magazyn A to DocumentMM ma mieć DocumentAction2

1

Albo enum ze wszystkimi polami, albo enum nie jako enum tylko klasa i wtedy jakiś polimorfizm, albo dwie klasy dziedziczące z DocumentMM i każda z nich będzie miała pole typu "swojego" enuma.

0

Problem jest później w kwestii podpięcia tego pod Grida. Nie potrzebuje nie wiadomo czego, robie zwykłą listę List<DocumentMM>. Akcje jakie można wykonać na danym dokumencie są uzależnione od tych warunków, które podałem wyżej. Nie mogę dać wszystkich opcji do tego samego obiektu. ponieważ jak się trafi "ciołek", który to będzie obsługiwał to narobi bigosu.
Sorki, mogłem napisać o tym wcześniej ;(

1

A więc zastosowałbym trzecią opcję: klasy DocumentWithAction1 i DocumentWithAction2 dziedziczące z DokumentMM, każda z nich niech ma właściwość odpowiedniego dla siebie DocumentAction.

0

Zrobiłem tak jak mówisz ale w gridzie nie pokazuje mi kolumny DocumentAction

    public class DocumentMM
    {
        public int ID { get; set; }
        public string Reference { get; set; }
        public bool Status { get; set; }
    }

    public class DocumentMMA1 : DocumentMM
    {
        public GoodsReceiptDocumentAction Action { get; set; }
    }

    public class DocumentMMA2 : DocumentMM
    {
        public OrderDocumentAction Action { get; set; }
    }

Domyślam się, że błąd robię w liście:

            List<DocumentMM> mmdocs = new List<DocumentMM>();

            DocumentMMA1 a1 = new DocumentMMA1();
            a1.ID = 123;
            a1.Reference = "MM/124/1241/124";
            a1.Status = false;
            a1.Action = GoodsReceiptDocumentAction.DodajPrzyjecie;

            DocumentMMA2 a2 = new DocumentMMA2();
            a2.ID = 1245;
            a2.Reference = "MM/1513/135";
            a2.Status = false;
            a2.Action = OrderDocumentAction.DodajZamowienie;

            mmdocs.Add(a1);
            mmdocs.Add(a2);

            gcDocs.DataSource = mmdocs;

Jeśli zrobię List<DocumentMMA1> to nie będę mógł dodać obiektu typu `DocumentMMA2', a przypisując tak jak zrobiłem wyżej nie pokazuje mi na gridzie kolumny DocumentAction

0

No tak, widocznie grid nie ogarnia takich bindingów, musiałbyś mieć Action jako wirtualne property w DocumentMM ale enumy nie mogą dziedziczyć, więc to nic nie da.
Co to w ogóle za Grid? W jakiej technologii tworzysz GUI?

Najlepiej byłoby mieć oddzielne klasy do reprezentacji danych (to już masz), na których operowałaby aplikacja i oddzielną do prezentacji (view model), której właściwości odpowiadają kolumnom grida. W takiej klasie Action mogłoby być nawet stringiem generowanym z odpowiedniego enuma klasy właściwej.

0

Grid jest DevExpressowy i zależy mi na tej kolumnie Action bo DevExpressy fajnie robią z tego ComboBoxa. Myślałem jeszcze nad UserControl - jeśli do programu przyjdą dokumenty MM to użyje UserControl, który będzie miał dwa gridy. Chyba inaczej się nie da.

0

To w takim razie dziwne, żeby DevExpressowy grid tego nie potrafił. W najgorszym razie musisz jakąś własną TemplateColumn zaimplementować (nie jestem pewien, czy tak się to nazywa). Szukaj w dokumentacji/forach DevExpress.

1 użytkowników online, w tym zalogowanych: 0, gości: 1