2017-05-14 2 views
0

Ich habe zuvor ein Programm erstellt, das Daten aus einer Textdatei in einer Listview anzeigt. Benutzer können auf einen Namen in der Listenansicht klicken und die Telefonnummer für diesen Namen anzeigen. Jetzt versuche ich, dem Programm ein neues Formular hinzuzufügen, das es dem Benutzer ermöglicht, einen Namen aus einer Combobox auszuwählen, der dann den Namen in einem Textfeld anzeigt und einem Benutzer erlaubt, den Namen zu ändern und in der Textdatei zu speichern.Ändern einer Methode zu einer freigegebenen Methode, auf die in einem anderen Formular zugegriffen werden kann

Original Program

Anyways, Ich versuche, das Load-Ereignis aus dem ursprünglichen Programm zugänglich in der neuen Form zu machen, und ich kann nicht scheinen, um herauszufinden, wie das zu tun. Hier ist mein Code:

public partial class VendorsDictionary : Form 
{ 
    public VendorsDictionary() 
    { 
     InitializeComponent(); 
    } 

    private Dictionary<string,string> vendorPhones = new Dictionary<string,string>(); 

    public void VendorsDictionary_Load(object sender, EventArgs e) 
    { 
     string currentLine; 
     string[] fields = new string[2]; 
     StreamReader vendorReader = new StreamReader("Vendor.txt"); 

     while (vendorReader.EndOfStream == false) 
     { 
      currentLine = vendorReader.ReadLine(); 
      fields = currentLine.Split(','); 

      vendorPhones.Add(fields[1], fields[6]); 

      string[] name = { fields[1] }; 
      string[] city = { fields[3] }; 
      string[] state = { fields[4] }; 
      string[] zipcode = { fields[5] }; 
      string[] phone = { fields[6] }; 

      for (int i = 0; i < name.Length; i++) 
      { 
       lvDisplay.Items.Add(new ListViewItem(new[] { name[i], city[i], state[i], zipcode[i] })); 
      }  
     } 

     vendorReader.Close(); 
    } 

    private void lvDisplay_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (lvDisplay.SelectedItems.Count>0) 
     { 
      ListViewItem item = lvDisplay.SelectedItems[0]; 
      lblName.Text = item.SubItems[0].Text; 
      lblPhone.Text = vendorPhones[item.SubItems[0].Text]; 
     } 
    } 

    private void btnUpdate_Click(object sender, EventArgs e) 
    { 
     UpdateVendor updateVendor = new UpdateVendor(); 
     updateVendor.Show(); 
    } 
} 

Ich habe versucht, es zu statischen und einer Reihe von anderen Ideen zu ändern ich hier gefunden habe, aber kann nicht scheinen, um es an die Arbeit. Jede Hilfe wäre willkommen!

+0

Warum brauchen Sie die 'VendorsDictionary_Load' Funktion? Wenn Sie diese Funktion verwenden, werden nur Ergebnisse in 'lvDisplay' gespeichert. – Ben

+0

Mögliches Duplikat von [Wie teile ich Daten zwischen Formularen?] (Http://stackoverflow.com/questions/3800603/how-to-share-data-between-forms) –

+0

Erstellen Sie eine öffentliche Eigenschaft auf Ihrem 'UpdateVendor'-Formular (nennen wir es' public stringName; ') und setzen Sie es auf das ausgewählte Combobox-Element (name). Verwenden Sie' updateVendor.ShowDialog(); ', um das Formular zu starten (' ShowDialog() 'wird die Ausführung auf Ihrem' VendorsDictionary' Formular blockieren, bis das 'updateVendor' Formular geschlossen ist. Dann können Sie die' updateVendor.Name' Eigenschaft überprüfen und Sie haben den Namen, den der Benutzer ausgewählt hat. –

Antwort

1

Sie brauchen nicht diesen ganzen Code in Ihrer VendorsDictionary_Load Methode. Sie können es wirklich aufräumen. Ich werde dir zeigen, wie.

Fügen Sie diese Klasse zu einem Projekt:

public class Vendor 
{ 
    public string City { get; set; } 
    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string State { get; set; } 
    public string ZipCode { get; set; } 
} 

diese Methode VendorsDictionary hinzufügen:

public static IEnumerable<Vendor> LoadVendors() 
{ 
    var vendors = 
     File.ReadAllLines("Vendor.txt").Select(x => x.Split(',')) 
      .Select(x => 
      new Vendor 
      { 
       Name = x[1], 
       City = x[3], 
       State = x[4], 
       ZipCode = x[5], 
       Phone = x[6] 
      }).ToList(); 

    return vendors; 
} 

Ändern Sie den Code in VendorsDictionary_Load dazu:

public void VendorsDictionary_Load(object sender, EventArgs e) 
{ 
    var vendors = LoadVendors(); 
    foreach (var thisVendor in vendors) 
    { 
     vendorPhones.Add(thisVendor.Name, thisVendor.Phone); 
     lvDisplay.Items 
      .Add(new ListViewItem(new[] { thisVendor.Name, thisVendor.City, 
       thisVendor.State, thisVendor.ZipCode })); 
    } 
} 

Verwenden LoadVendors Methode wo immer Sie wollen:

Um diesen Code zu verbessern, senden Sie einen Pfad an LoadVendors, damit Sie die Anbieter von jedem Ort laden können. Auch VendorDictionary ist kein guter Name für ein Formular.

Verwandte Themen