WCF przekazywanie buttom

0

Witam,
otóż mam nie małą zagwozdkę, chciałem na zajęcia zrobić na wcf grę w kółko i krzyżyk.
Odpalam jednego klienta zaznacza on jeden button jako X i w tym momencie drugi gracz powinien widzieć u siebie też tą zmianę, jednak tak nie jest.
Stwierdziłem więc że muszę do Services przekazać kolekcję wszystkich buttonów i je zapisuje.
Co jakiś czas timer1 na klienci wywołuje metodę sprawdz_button która zwraca kolekcję aktualnych buttonów dzięki temu wszyscy gracze widzą to samo.

Wydaje mi się że to rozwiązanie jest dobre niestety nie wiem jak to zrobić, chciałem przekazać kolekcję z klienta do serwera ale na serwerze tego nie rozpoznaje
Klient:

private void button1_MouseClick(object sender, MouseEventArgs e)
        {
          client.sprawdz_button(this.Controls);   //clent to => Service1Client client = new Service1Client();
         }

Na serwerze:


public void sprawdz_button(Controls nowybuttom)
{

}

I niestety nie widzi mi Controls dodałem referencję do System.Windows.Forms i using System.ComponentModel myśląc że może to wystarczy i nic.
Jakieś pomysły jak to rozwiązać.
W załączeniu jak wygląda to na Forms

0

Nie zadziała to w ten sposób. Na serwerze musisz przechowywać macierz obiektów lub wartości (lub po prostu listę) identyfikującą przyciski. Do usługi możesz przekazać tylko to co da się serializować - Control na pewno takim typem nie jest.
poza tym, kiedyś przyciski będziesz chciał zastąpić np. obrazkami i pojawi się problem. Po kliknięciu przycisku, odwzorowujesz swoje przyciski na proste obiekty ze stanem (kółko lub krzyżyk) i przekazujesz do usługi.

Poczytaj o Callbackach w WCF, np:
http://wcftutorial.net/how-to-create-callback-service-in-wcf.aspx

0

A czy zadziałało by gdybym stworzył List<Button> na serwerze i następnie klient wysyłał by metodą (podczas kliknięcia) void Dodaj(nowebuttons // obiekt typu List<Button>)do serwera on uaktualniał by sowją liste<button> którą ma na serwerze, a timer1 na klienci co jakiś czas by wywoływał metodę która pobierze aktualną List<button> z serwera. Wtedy odświerza się formularz klienta i wszyscy widzą to samo.

0

Odpowiedź: sprawdź!
Od razu napisze, że się nie da. Pomiędzy serwisem a klientem musi być zawarty kontrakt.

Spróbuj na przykład tak:

[DataContract]
    public class KolkoKrzyzykElement
    {
        [DataMember] public int Row { get; set; }
        [DataMember] public int Column { get; set; }
        [DataMember] public string Value { get; set; }
    }

    [ServiceContract]
    public interface IKolkoKrzyzykService
    {
        [OperationContract]
        void UpdateItems(List<KolkoKrzyzykElement> items);
        [OperationContract]
        List<KolkoKrzyzykElement> GetItems();
    }

Po kliknięciu w kółko lub krzyżyk, stwórz listę elementów typu KolkoKrzyzykElement, a następnie dla kazdego buttona sprawdzaj w której jest kolumnie, wierszu i jaką ma wartość, przypisz te wartości do nowo utworzonego obiektu klasy KolkoKrzyzykElement i dodaj do listy. Na koniec wywołaj metodę UpdateItems.

Jeżeli nie chcesz przysłać całej listy tylko konkretny element (ten w który kliknąłeś) to klasa KolkoKrzyzykelement może wyglądać np. tak:

     public class KolkoKrzyzykElement
    {
        [DataMember] public string ID { get; set; }
        [DataMember] public string Value { get; set; }
    } 

Wówczas każdy przycisk może mieć identyfikator (np. zapisany we właściwości Tag), i po nim będzie identyfikowany element.

Oczywiście może problem rozwiązać na wiele sposobów. Powyższym chcę Cię tylko naprowadzić.

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