2016-11-28 3 views
1

У меня есть этот класс:C# Переопределение ToString() и отображение в TextBox

namespace JimWcfFormTest3 
{ 
[DataContract] 

public class GateInfo 
{ 
    [DataMember] 
    public int carid { get; set; } 

    [DataMember] 
    public int paid_at_gate { get; set; } 

    [DataMember] 
    public int wash_pkg_purch { get; set; } 

    [DataMember] 
    public string carte { get; set; } 

    public override string ToString() 
    { 
     return "Car ID: " + carid + "Paid at Gate: " + paid_at_gate + "Wash Package: " + wash_pkg_purch + "Ala Carte: " + carte; 
    } 
} 

}

Это называется этим службы WCF:

namespace JimWcfFormTest3 
{ 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class Service1 : IService1 
{ 
    private List<GateInfo> _gate; 

    private Service1() 
    { 
     _gate = new List<GateInfo>(); 
    } 

    public void Gate_to_Server(GateInfo gatein) 
    { 
     if (gatein != null) _gate.Add(gatein); 
    } 

    public List<GateInfo> Server_to_Term() 
    { 
     return _gate; 
    } 
} 

}

То вызывается этой кнопкой на этой форме:

private Service1Client server = new Service1Client(); 
    private void button1_Click(object sender, EventArgs e) 
    { 
     int carnum = 2; 
     int pay = 1; 
     int wash = 5; 
     string txt = "TEST"; 
     var data_out = new GateInfo { carid = carnum, paid_at_gate = pay, wash_pkg_purch = wash, carte = txt }; 

     server.Gate_to_Server(data_out); 

     dataGridView1.DataSource = server.Server_to_Term(); 

Является ли мой ToString переопределением в нужном месте? Как правильно вызвать переопределение ToString в форме, поэтому я могу поместить его в текстовое поле при нажатии кнопки?

+0

Не работает GateInfo.ToString()? В вашем случае data_out.ToString() –

+1

@SamMarion - Проблема (как описано в ответе ниже) заключается в том, что методы в DataContract не сериализуются по проводу, а только фактические данные. Таким образом, если клиент не имеет тот же самый класс (т. Е. Общий тип), он не будет знать, как выглядит реализация «GetString()», и будет полагаться на реализацию фреймворка. – Tim

ответ

2

Поскольку вы вызываете это через веб-службу, тип GateInfo возвращается к клиентскому приложению (ваше приложение Forms). Если клиентское приложение не имеет собственный тип GateInfo, то вы будете использовать сериализованный тип, который не включает функции.

Чтобы переопределить работу ToString на стороне клиента, этот класс должен быть включен в ваше приложение Forms. Обычно я делаю это «совместное использование типов», помещая общие типы данных/объекты модели в отдельную библиотеку классов и сервер и клиент используют эту библиотеку для сопоставления типов объектов.

Если вы используете этот подход, убедитесь, что вы отметили опцию в разделе Свойства службы WCF на Reuse types in referenced assemblies. Это позволит генератору-клиенту WCF правильно отображать этот тип.

+0

Это сделало, спасибо! – JEtheDBA

Смежные вопросы