2016-03-24 14 views
0

Ich arbeite an diesem Projekt und wurde gebeten, einen Code zu schreiben, um Daten von InvoiceDB und CustomerDB mit Form1.Cs zu verbinden. Ich bin fertig mit meinem Code, aber irgendwie hat es nicht funktioniert. Wenn ich ein Programm ausführe, konnte die Listview in form1 keine Daten von Klassen erhalten. Ich würde gerne um Hilfe von Experten bitten. Danke.Kundenrechnungsformular; generische Listen; C#

Mein Code Form1.cs

private void Form1_Load(object sender, EventArgs e) 
    { 
     { 
      **//Get data from Invoice and Customer Class** 
      List<Invoice> invoiceList = InvoiceDB.GetInvoices(); 
      List<Customer> customerList = CustomerDB.GetCustomers(); 

      **//Query expression** 
      var invoices = from invoice in invoiceList 
           join customer in customerList 
           on invoice.CustomerID equals customer.CustomerID 
           orderby customer.Name, invoice.InvoiceTotal descending 
          select new {customer.Name, invoice.InvoiceID, invoice.InvoiceDate, invoice.InvoiceTotal}; 

      **//Executes the query** 
      string customerName = " "; 
      int i = 0; 
      foreach (var invoice in invoices) 
      { 
       if (invoice.Name != customerName) 
       { 
        lvInvoice.Items.Add(invoice.Name); 
        customerName = invoice.Name; 
       } 
       else 
       { 
        lvInvoice.Items.Add(" "); 
       } 
       lvInvoice.Items[i].SubItems.Add(invoice.InvoiceID.ToString()); 
       lvInvoice.Items[i].SubItems.Add(Convert.ToDateTime(invoice.InvoiceDate).ToShortDateString()); 
       lvInvoice.Items[i].SubItems.Add(invoice.InvoiceTotal.ToString("C")); 
       i += 1; 
      } 
    } 
    } 

CustomerDB Klasse

public static class CustomerDB 
{ 

    private const string Dir = @""; 
    private const string Path = Dir + "CustomersX23.txt"; 

    public static List<Customer> GetCustomers() 
    { 
     List<Customer> customers = new List<Customer>(); 

     StreamReader textIn = new StreamReader(
      new FileStream(Path, FileMode.Open, FileAccess.Read)); 

     while (textIn.Peek() != -1) 
     { 
      string row = textIn.ReadLine(); 
      string[] columns = row.Split('|'); 
      Customer customer = new Customer(); 
      customer.CustomerID = Convert.ToInt32(columns[0]); 
      customer.Name = columns[1]; 
      customers.Add(customer); 
     } 

     textIn.Close(); 
     return customers; 
    } 

InvoiceDB Klasse

public static class InvoiceDB 
{ 

    private const string Dir = @""; 
    private const string Path = Dir + "Invoices.txt"; 

    public static List<Invoice> GetInvoices() 
    { 
     List<Invoice> invoices = new List<Invoice>(); 

     StreamReader textIn = new StreamReader(
      new FileStream(Path, FileMode.Open, FileAccess.Read)); 

     while (textIn.Peek() != -1) 
     { 
      string row = textIn.ReadLine(); 
      string[] columns = row.Split('|'); 
      Invoice invoice = new Invoice(); 
      invoice.InvoiceID = Convert.ToInt32(columns[0]); 
      invoice.CustomerID = Convert.ToInt32(columns[1]); 
      invoice.InvoiceDate = Convert.ToDateTime(columns[2]); 
      invoice.ProductTotal = Convert.ToDecimal(columns[3]); 
      invoice.SalesTax = Convert.ToDecimal(columns[4]); 
      invoice.Shipping = Convert.ToDecimal(columns[5]); 
      invoice.InvoiceTotal = Convert.ToDecimal(columns[6]); 
      invoices.Add(invoice); 
     } 

     textIn.Close(); 
     return invoices; 
    } 

Antwort

0

Wenn das Listview im Detail-Modus ist, sollten Sie definieren ColumnHeaderCollection Hinzufügen der Spalten, die Sie möchte in der ListView angezeigt werden. Ohne die ColumnHeaderCollection das Listview definieren wird angezeigt, um leer zu sein

Diese Bemerkung von MSDN erklären

Die Eigenschaft Columns eine Sammlung zurück, die die Column Objekte enthält, die in der Listview-Steuerelement angezeigt werden. ColumnHeader-Objekte definieren die Spalten, die im ListView-Steuerelement angezeigt werden, wenn die View-Eigenschaft auf Details festgelegt ist. Jede Spalte wird verwendet, um Unterpositionsinformationen für jedes Element in der ListView anzuzeigen. Weitere Informationen zum Bearbeiten der Elemente in der Auflistung finden Sie unter ListView.ColumnHeaderCollection.

Sie sollten die Spalten zu Ihrem Listview, so etwas wie dieses

für Ihre Antwort,
lvInvoice.Columns.Add("Name", -2, HorizontalAlignment.Left); 
lvInvoice.Columns.Add("ID", -2, HorizontalAlignment.Left); 
lvInvoice.Columns.Add("Date", -2, HorizontalAlignment.Left); 
lvInvoice.Columns.Add("Total", -2, HorizontalAlignment.Left); 

Es gibt many overloads der Add-Methode, wählen Sie die am besten geeignete für Ihre Aufgabe

+0

Danke hinzufügen, aber Ich habe bereits Spalten in der Design-Form hinzugefügt. Irgendwelche andere Meinung? – Duke

+0

Dann schlage ich vor, den Debugger zu verwenden. Setzen Sie einen Haltepunkt auf die Methoden, die Ihre Daten lesen, und auf die Linq-Abfrage, die sie verbindet. Überprüfen Sie, ob Sie die erforderlichen Daten haben. – Steve

+0

Ich habe versucht, Ihr Problem zu reproduzieren, Ihren Code zu kopieren, und ich habe das gleiche Problem, bis ich die Spalten im Code definierte (bevor Sie Elemente zur ListView hinzufügten und es zeigten) Nicht sicher an diesem Punkt, wenn Ihr Problem im gezeigten Code ist. Versuchen Sie, _lvInvoice.Columns.Clear(); _ hinzuzufügen und fügen Sie dann aus dem Code die Spalten hinzu. – Steve