2017-05-01 14 views
2

私は学校で働いているものはありますが、問題は継続しており解決できません。私はほとんどプロジェクトを終わらせていますが、私はこの単純な問題にぶち当たっています。ですからまず、5つの連絡先を含むファイルを各連絡先に関する情報を含めて作成する必要があります。クラスを使用して連絡先をリストに登録する必要があります。リストから連絡先を選択すると、各自の情報とともに新しいフォームが表示されます。ここで私がこれまで持っているコードは次のとおりです。 メインフォームどのようにして1つのフォームから別のフォームに情報を送信しますか

public Form1() 
    { 
     InitializeComponent(); 
    } 


    private void btnExit_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     lstNames.Items.Clear(); 
    } 

    private void btnGetInfo_Click(object sender, EventArgs e) 
    { 
     { 
      // Call methods 
      FileRead(); 
      DisplayNameList(); 
     } 
    } 
    private void FileRead() 
    { 
     try 
     { 
      StreamReader inputFile; 
      string line; 
      char[] deliminator = { ',' }; 
      inputFile = File.OpenText("Accounts.txt"); 

      //While loop to move through the entries. 
      while (!inputFile.EndOfStream) 
      { 
       //Use class 
       PersonEntry entry = new PersonEntry(); 

       //Variable to hold line. 
       line = inputFile.ReadLine(); 

       //Tokenize the line. 
       string[] tokens = line.Split(deliminator); 

       //Store the tokens in the entry object. 
       entry.Name = tokens[0]; 
       entry.Email = tokens[1]; 
       entry.PhoneNumber = tokens[2]; 

       //Get the names in the list! 
       nameList.Add(entry); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("ERROR: Something went WRONG! " + " " + ex.Message); 
     } 
    } 
    private void DisplayNameList() 
    { 
     //Add the entry objects to the List 
     foreach (PersonEntry nameDisplay in nameList) 
     { 
      lstNames.Items.Add(nameDisplay.Name); 
     } 
    } 

    private void lstNames_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (lstNames.SelectedIndex != -1) 
     { 
      //Get full info for the selected item in the list 
      string name = nameList[lstNames.SelectedIndex].Name; 
      string email = nameList[lstNames.SelectedIndex].Email; 
      string phone = nameList[lstNames.SelectedIndex].PhoneNumber; 


      //Create second form for these details 
      Informationform form2 = new Informationform(name, email, phone); 

      form2.ShowDialog(); 
     } 
     else 
     { 
      MessageBox.Show("Please pick a name!"); 
     } 
    } 
} 

}ここで

私は2番目のフォームを持っています!

public partial class Informationform : Form 
{ 

    public Informationform() 
    { 
     InitializeComponent(); 
    } 

    public Informationform(string name, string email, string phone) 
    { 
     lblName.Text = name; 
     lblEmail.Text = email; 
     lblPhone.Text = phone.tostring(); 
    } 


    private void Informationform_Load(object sender, EventArgs e) 
    { 

    } 
} 

}

と、ここで私は

class PersonEntry 
{ 
    // Fields 
    private string _name; // The phone's brand 
    private string _email; // The phone's model 
    private string _phonenumber; // Retail price 

    // Constructor 
    public PersonEntry() 
    { 
     _name = ""; 
     _email = ""; 
     _phonenumber = ""; 
    } 

    // Brand property 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    // Model property 
    public string Email 
    { 
     get { return _email; } 
     set { _email = value; } 
    } 

    // Price property 
    public string PhoneNumber 
    { 
     get { return _phonenumber; } 
     set { _phonenumber = value; } 
    } 
} 

}

を作成したクラスを行く、これは狂気私を運転している、問題は私が名をクリックするたびにありますリスト、私は空であるという例外エラーが発生します(誰の情報もラベルに表示されるはずです)!コードを見てください!事前に感謝!引数を受け入れ、あなたのコンストラクタで

+1

これはWindowsフォーム(WinForms)と仮定していますか?そうであれば、実際には2つのリストは必要ありません。 ListBoxコントロールはオブジェクトを受け入れるので、クラスのオブジェクトで直接入力することができます。追加する必要があるのは、ToStringのオーバーライドだけです。 –

+0

どうすればよいのかのコード例を教えてもらえますか? –

答えて

5

、あなたはInitializeComponent();を呼び出す必要があります:

public Informationform(string name, string email, string phone) 
{ 
    InitializeComponent(); 

    lblName.Text = name; 
    lblEmail.Text = email; 
    lblPhone.Text = phone.tostring(); 
} 
+0

オハイオ州私の神...私はそれを忘れてしまった!ありがとう、私の問題を解決した!神様私は最後の5日間あなたが私に余分な頭痛のトンを解決したばかりです。良い一日を過ごしてください! –

2

はのは、物事を単純化し、1つのリストだけを扱うましょう。まず、(クラスにこれを追加する)あなたのPersonEntryクラスにToStringメソッドのオーバーライドを追加します。

public override string ToString() 
{ 
    return Name; 
} 

あなたはToStringメソッドが呼び出されたときだけ名前値以上のものを表示したい場合にも、String.Formatのまたは類似を使用することができます。

これを使用すると、ListBoxのItemsコレクションにPersonEntryアイテムを追加できます。これにより、オブジェクトを表示するときにToStringメソッドが呼び出されます。

次に、ListBoxで項目が選択されている場合、その項目がnullでないことを確認してから、それをPersonEntryにキャストする必要があります。

private void lstNames_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (lstNames.SelectedItem != null) 
    { 
     PersonEntry person = lstNames.SelectedItem as PersonEntry; 

     if(person != null) 
     { 
      //Create second form for these details 
      Informationform form2 = new Informationform(person.Name, person.Email, person.Phone); 

      form2.ShowDialog(); 
     } 
    } 
    else 
    { 
     MessageBox.Show("Please pick a name!"); 
    } 
} 

はどのようas作品の概要についてはMSDNを参照してください。

また、@Idle_Mindノートでは、オーバーロードされたコンストラクタでInitializeComponent();を呼び出す必要があります。

public Informationform(string name, string email, string phone) : this() 
{ 
    lblName.Text = name; 
    lblEmail.Text = email; 
    lblPhone.Text = phone.tostring(); 
} 
+0

ありがとう、これは私も同様に役立ちます! –

+0

+1。私はこれに似たものを投稿するつもりでしたが、この応答を読んでください。そして、実行する問題の多くを解決するだけでなく、クラスのToString()をオーバーライドすることで、将来的にデバッグが容易になります(たとえば、リストには複数のNamespace.PersonEntriesがリストされませんデバッグウォッチウィンドウでは実際にそこにも名前が表示されます*この*プロジェクトでは役に立ちませんが、問題を解決しようとしているときに行がダウンすると巨大になります助けて。 :-) – Kevin

関連する問題