2017-05-15 2 views
0

Les bonnes nouvelles sont que je suis à la toute dernière partie de ce projet, la mauvaise nouvelle est que je ne peux pas le comprendre. Mon programme consiste en deux formes. La première forme n'est pertinente que pour le moment car c'est à l'origine que je charge le fichier texte dans un dictionnaire.Trouvez l'élément dans le tableau qui correspond à la sélection et écrivez à cette ligne du tableau

class SharedMethods 
{ 
    public static void LoadDictionary(Dictionary<string, string> vendorPhones) 
    { 
     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[] phone = { fields[6] }; 
     } 
     vendorReader.Close(); 
    } 
} 

Maintenant, la deuxième forme est ce qui est important. Ce formulaire est ouvert à partir du premier formulaire et permet à l'utilisateur de sélectionner un nom dans une liste déroulante, et le numéro de téléphone qui appartient à ce nom est affiché dans une zone de texte. L'utilisateur peut alors taper dans la zone de texte pour écraser ce nom et cliquer sur enregistrer pour l'enregistrer dans un fichier texte. Mon problème est que je ne peux pas comprendre comment obtenir la fonction d'écriture pour trouver le nom sélectionné dans le texte, puis écrire sur l'élément de téléphone actuel dans cette rangée. Voici mon code pour ce formulaire:

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

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

    private void UpdateVendor_Load(object sender, EventArgs e) 
    { 
     SharedMethods.LoadDictionary(vendorPhones); 
     foreach (string name in vendorPhones.Keys) 
     { 
      cboVendors.Items.Add(name); 
     } 
    } 

    private void cboVendors_SelectedIndexChanged(object sender, EventArgs e) 
    {   
     string selectedName = cboVendors.SelectedItem.ToString(); 
     string phone = vendorPhones[selectedName]; 
     txtPhone.Text = phone.ToString(); 
    } 

    private void btnSave_Click(object sender, EventArgs e) 
    { 
     //SharedMethods.LoadDictionary(vendorPhones); 
     //string selectedName = cboVendors.SelectedItem.ToString(); 
     //string newPhone; 
     //newPhone = txtPhone.Text; 

     //using (var sw = new StreamWriter("Vendors.txt")) 
     //{ 

     //} 
     // I've tried a lot of things but can't get any to work. 

    } 

Désolé si le code vous fait grincer de dégoût. Je suis en train d'apprendre le code et je suis extatique que ça marche la moitié du temps.

Pour ajouter, voici comment le programme recherche lors de l'exécution: Second form running

+0

Vous avez dit: « Cette forme est ouverte à partir de la première forme et permet à l'utilisateur de sélectionner un nom une zone de liste déroulante et le numéro de téléphone qui appartient à ce nom s'affiche dans une zone de texte.L'utilisateur peut alors taper dans la zone de texte pour remplacer ce nom et cliquez sur Enregistrer pour l'enregistrer dans un fichier texte. Ne voulez-vous pas dire que l'utilisateur peut taper dans la zone de texte pour écraser le ** numéro de téléphone **? –

Répondre

0

Le problème ici est que, parce que vous n'êtes pas capturer toutes les données lors de la lecture du fichier En premier lieu, vous devrez être un peu difficile à écrire pour ne pas perdre de données. Ce que nous pouvons faire est de relire le fichier entier dans un tableau, puis rechercher chaque ligne dans le tableau pour celui qui contient notre fournisseur et le numéro de téléphone d'origine. Lorsque nous trouvons cette ligne, mettez à jour le numéro de téléphone avec le nouveau numéro. Ensuite, écrire toutes les lignes dans le fichier à nouveau

est ici une façon de le faire:

private void btnSave_Click(object sender, EventArgs e) 
{ 
    // Grab the selected vendor name 
    string selectedName = cboVendors.SelectedItem.ToString(); 

    // Grab the original phone number for this vendor 
    string originalPhone = vendorPhones[selectedName];    

    // Read all the file lines into an array: 
    var fileLines = File.ReadAllLines("Vendor.txt"); 

    // Now we iterate over the file lines one by one, looking for a match 
    for (int i = 0; i < fileLines.Length; i++) 
    { 
     // Break the line into parts to see if this line is the one we need to update 
     string[] lineParts = fileLines[i].Split(','); 
     string name = lineParts[1]; 
     string phone = lineParts[6]; 

     // Compare this line's name and phone with our originals 
     if (name == selectedName && phone == originalPhone) 
     { 
      // It's a match, so we will update the phone number part of this line 
      lineParts[6] = txtPhone.Text; 

      // And then we join the parts back together and assign it to the line again 
      fileLines[i] = string.Join(",", lineParts); 

      // Now we can break out of the loop since we updated our vendor info 
      break; 
     } 
    } 

    // Finally, we can write all the lines back to the file 
    File.WriteAllLines("Vendor.txt", fileLines); 

    // May not be necessary, but if you're not reading back from the file right away 
    // then update the dictionary with the new phone number for this vendor 
    vendorPhones[selectedName] = txtPhone.Text; 
} 

Idéalement, cependant, vous serait capturer toutes les données lorsque vous lisez le fichier, et Chaque ligne du fichier crée un nouvel objet Vendor dont les propriétés représentent chaque valeur séparée par des virgules. Ensuite, ces objets Vendor peuvent être stockés dans un List<Vendor>. Vous disposez maintenant d'une collection d'objets fortement typés que vous pouvez afficher et manipuler. Lorsque vous avez terminé, vous pouvez simplement les réécrire tous de la même manière.

Mais ce n'était pas votre question, et il semble que vous ne pouvez pas être tout à fait encore là ...

+0

Merci, cela a fonctionné! Merci pour l'aide sur ma question plus tôt aujourd'hui aussi! – Dubisttot

0

Essayez suivante:

  string selectedName = cboVendors.SelectedItem.ToString(); 
      string phone = vendorPhones[selectedName]; 
      if (vendorPhones.ContainsKey(selectedName)) 
      { 
       vendorPhones[selectedName] = phone; 
      } 
      else 
      { 
       vendorPhones.Add(selectedName, phone); 
      }