2017-05-15 10 views
0

良いニュースは私がこのプロジェクトの最後の部分ですが、悪い知らせは私が理解できないことです。私のプログラムは2つの形式から成っています。最初の形式は、当初はテキストファイルを辞書にロードする場所なので、この時点でのみ関連性があります。選択に一致する配列内の要素を検索し、配列のその行に書き込む

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

ここで重要なのは第2の形式です。このフォームは最初のフォームから開き、ユーザーがコンボボックスから名前を選択できるようになり、その名前に属する電話番号がテキストボックスに表示されます。ユーザーは、テキストボックスに入力してその名前を上書きし、[保存]をクリックしてテキストファイルに保存することができます。私の問題は、テキストで選択された名前を見つけて、その行の現在の電話要素に書き込むための書き込み関数の取得方法を理解できないことです。ここでは、このフォームのための私のコードは次のとおりです。

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. 

    } 

申し訳ありませんが、コードを使用すると、嫌悪感にうんざりになります。私はちょうどコードを学習しています。ここでは、追加するには

が実行しているときに、プログラムがどのように見えるかです: Second form running

+0

あなたはこのフォームが最初のフォームから開かれた」と述べたとから名前を選択するようにユーザーに許可しますコンボボックスには、その名前に属する電話番号がテキストボックスに表示されます。ユーザーはテキストボックスに入力してその名前を上書きし、[保存]をクリックしてテキストファイルに保存することができます。 **電話番号**を上書きするために、テキストボックスにユーザーが入力できることを意味していませんか? –

答えて

0

ここでの問題は、ファイルを読み込むときにすべてのデータをキャプチャしていないので、ということですまず最初に、データを失わないように書き直すのはちょっと難しいでしょう。

私たちができることは、ファイル全体を再度読み込んでアレイに戻し、ベンダーと元の電話番号を含むアレイの各行を検索することです。その行が見つかると、電話番号部分を新しい番号に更新します。

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

理想的には、しかし、あなたがファイルを読み込むときにすべてのデータを取得し、ためになります。その後、

再びファイルへのすべての行を書くここでそれを行うための一つの方法ですファイル内の各行に、コンマ区切りの各値を表すプロパティを持つ新しい Vendorオブジェクトを作成します。そして、これらの Vendorオブジェクトは List<Vendor>に格納できます。これで、表示および操作が可能な厳密に型指定されたオブジェクトのコレクションが作成されました。すべての作業が完了したら、それらをすべて同様の方法でファイルに書き戻すことができます。

しかし、それはあなたの質問ではなかった、とあなたはまだかなり存在しないかもしれないように聞こえる...

+0

ありがとう、これは働いた!今日の私の質問にも助けてくれてありがとう! – Dubisttot

0

次試してみてください。

  string selectedName = cboVendors.SelectedItem.ToString(); 
      string phone = vendorPhones[selectedName]; 
      if (vendorPhones.ContainsKey(selectedName)) 
      { 
       vendorPhones[selectedName] = phone; 
      } 
      else 
      { 
       vendorPhones.Add(selectedName, phone); 
      } 
関連する問題