2011-10-27 25 views
2

データベースに新しい請求書を作成するWebサービスを作成しましたが、WindowsクライアントからこのWSにline itensを渡す際に問題があります。 MY WSは:ASMX WebServiceに配列を送信する際にエラーが発生しました

namespace InvoicesTest 
{ 
/// <summary> 
/// Summary description for Invoices 
/// </summary> 
[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
public class Invoices : System.Web.Services.WebService 
{ 
    [Serializable] 
    public struct InvoiceItem 
    { 
     public string Product {get; set;} 

     public string PartNumber {get; set;} 
    } 


    [WebMethod(Description = "Create Document Type")] 
    public string newDocType(string docTypeName, List<InvoiceItem> lstInvoiceItem) 
    { 
     for (int i = 0; i < lstInvoiceItem.Count; i++) 
     { 
     ... 
     return "ok"; 
     } 
    } 
} 

ここまではOKです。私の問題は、このWSにWindowsフォームから値を渡すことです。

private void button4_Click(object sender, EventArgs e) 
{ 
    InvoiceItem[] dt = new InvoiceItem[listView1.Items.Count]; 
    int j = 0; 
    foreach (ListViewItem listItem in listView1.Items) 
    { 
     dt[j].Product = listItem.SubItems[0].Text; 
     dt[j].PartNumber = listItem.SubItems[1].Text; 
     j++; 
    } 
    textBox1.Text = InvoicesTest.newDocType("teste", dt.ToArray()); 
} 

でも作業インデックスが配列の境界外です: まず私は、私はSystem.IndexOutOfRangeExceptionのようなエラーを取得しています、今、私は、配列の代わりにリストを送信する必要がありますエラー...

を得ましたList<>で動作しません。 私はどんな助けにも感謝します...

答えて

0

ありがとうリチャード、私のテストの結果を、カスタムコレクションをパラメータとしてWebサービスに渡すようにしてみましょう。

public class Invoice 
{ 
public int InvoiceNumber; 
public string Product, PartNumber; 
public Invoice() { } 

public Invoice(string product, string pNumber, int iNumber) 
    { 
    InvoiceNumber = iNumber; 
    Product = product; 
    PartNumber = pNumber; 
    } 
} 

は、Webメソッドを作成します

カスタムコレクションクラスを作成します... ...コンシューマアプリケーションで

[WebMethod] 
public void Method(Invoice[] fields, bool attachmentincluded) 
{ 
     System.Collections.Generic.List<Invoice> invoices = new List<Invoice>(fields); 
     foreach (Invoice i in invoices) 
     { 
      string N,P; 
      int I; 
      N =i.PartNumber; 
      P = i.Product; 
      I = i.InvoiceNumber; 
     } 
} 

...

//Create Invoices... 
     List<Invoice> lst = new List<Invoice>(); 

     try 
     { 
      foreach (ListViewItem listItem in listView1.Items) 
      { 
       Invoice aux = new Invoice();      
       aux.Product = listItem.SubItems[0].Text; 
       aux.PArtNumber = listItem.SubItems[1].Text; 
       lst.Add(aux); 
      }     
      textBox1.Text += localhost.Invoice(lst.ToArray(), true);     
     } 
     catch (Exception ex) 
     { 
      textBox1.Text = ex.ToString(); 
      throw; 
     } 
+0

こんにちは@omalukinho - あなたの元の質問について投稿するより多くの情報があれば、それを編集して改訂してみてください。ここに投稿した内容は回答ではないため、削除される可能性があります。 –

+0

カーク、クライアントからWebサービスに配列(List)を渡すのに問題がありました。 私がここに投稿したコードで探していたものを得ました...データベースへの接続はこのケースでは必要ありません(私は推測します)... – omalukinho

+1

これで問題が解決したら、答えとして。私はあなたの問題への答えを知らない、私はちょうどサイトを使用してあなたを助けることを試みている:) –

2

私はあなたがインボイスクラス内にリストを持っていることをお勧めしたいと思います。例えば一般的に私はそれが道に簡単な一覧ではなく、使用して何とか旧式と不格好ある配列などのコレクションが組み込まれて動作するように見つける

invoice.InvoiceItems.Clear(); 
foreach (ListViewItem listItem in listView1.Items) 
    invoice.InvoiceItems.Add(new InvoiceItem() 
          { ProductNumber = listItem.SubItems[0].Text, 
          PartNumber = listItem.SubItems[1].Text} 
         ); 

[Serializable] 
public struct InvoiceItem 
{ 
    public string Product {get; set;} 

    public string PartNumber {get; set;} 

} 

public class Invoices : System.Web.Services.WebService 
{ 
    /*[DataMember] ** needed If working with data contracts */ 
    public List<InvoiceItem> InvoiceItems {get; set;} 
} 

、その後でそれを読み込みます。多分それはちょうど私です。

+1

+1私だけでなければならない。 –