2011-10-27 30 views
2

我編寫了一個web服務來在數據庫中創建一個新的發票,但是我有問題要將來自Windows客戶機的線路傳遞給此WS。 我的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"; 
     } 
    } 
} 

直到這裏沒關係。我的問題是將窗體的值傳遞給這個WS。 首先,我得到了我應該送一個數組列表,而不是一個錯誤......

現在,我越來越喜歡System.IndexOutOfRangeException錯誤:索引是該數組的範圍之外

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()); 
} 

即使工作與List<>,它不工作。 我感謝任何幫助...

回答

0

感謝Richard,讓我試着展示我的測試結果,將自定義集合作爲參數傳遞給webservice。

創建一個自定義集合類...

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服務。 我找到了我在這裏發佈的代碼...與數據庫的連接是這種情況是沒有必要的(我猜)... – omalukinho

+1

如果這可以解決您的問題,那麼這是一個答案 - 你可以標記它作爲答案。我不知道你的問題的答案,我只是想幫助你使用該網站:) –

2

我認爲你最好有一個列表內的發票類和填充;例如

[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;} 
} 

然後加載:

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

一般來說,我覺得這樣更容易與內置的集合,如名單而不是在某種程度上老式的和笨重的使用數組。也許那只是我而已。

+1

+1必須只是我。 –