2017-06-08 1 views
1

Form1ListBox studentListBoxがあり、Form2が入力されたstudentListのメンバーが表示されます。クラスStudentがあり、各学生に関するいくつかの異なるプロパティが含まれています。ListBoxは初めて呼び出されたときにのみ更新されますか? c#

またデータソースをstudentListに設定するForm1には、機能BindData()があります。 studentListBox表示メンバーをNameに設定します。これはクラスStudentのプロパティです。

Form1

public void BindData() 
     { 
      if (studentListHome != null) 
      { 
       studentListBox.DataSource = studentListHome; 
       foreach(Student s in studentListHome) 
       { 
        studentListBox.DisplayMember = "Name"; 
       } 

      } 
     } 

BindDataはForm1_Loadに呼ばれ、それはまた、更新ボタンをクリックすることで呼び出すことができます。

Form2は、各学生を作成し、送信ボタンを

Form2

private void submitButton_Click(object sender, EventArgs e) 
     { 
      if (comparator(nameInput) & 
       comparator(idInput) & 
       comparator(bdayInput)){ 
       variable_assignment(); 
       var tempStudent = StudentCreation(); 
       if(tempStudent != null) 
       { 
        studentListForm2.Add(tempStudent); 
       } 
       testList.Add(tim); 
       testList.Add(john); 
       testList.Add(tempStudent); 

       foreach(Student s in testList) 
       { 
        homeForm.StudentListHome.Add(s); 
       } 
       homeForm.BindData(); 
      } 
     } 

comparator()をクリックしたときにそれがこれを行うForm1の内側studentListに追加してくださいユーザー入力フィールドが上がらない」作る機能です空ではありません。 variable_assignment()は、ユーザー入力を関連変数に割り当てます。 StudentCreation()私はタイトルで述べたようなので、Student

をinstatiates機能である、ListBoxだけそのと呼ばれる最初の時間を更新し、その後、それはまったく同じまま。 Studentsがに追加されていることがわかりました。Console.WriteLineを送信したため、studentListに新しいStudentが追加されていることがわかりましたので、送信ボタンをクリックするたびにListBoxにバインドされています。

これを修正するにはどうすればよいですか?あなたがリストボックスにリストボックスではなく、各項目に対して一度だけ設定する必要があるため

+0

なぜこの 'studentListBox.DisplayMember = "Name"; 'ループするのですか?あなたが一度それをすれば十分です。 – pitersmx

+0

下記の回答を参照してください。ただし、コーディングの方法をそのまま継続したい場合は、これを実行してください: if(studentListHome!= null) { studentListBox.DataSource = null; studentListBox.DataSource = studentListHome; studentListBox.DisplayMember = "Name"; } – Digvijay

答えて

0

いくつかの小さなもの

if (studentListHome != null) 
     { 
      studentListBox.DataSource = studentListHome; 
      foreach(Student s in studentListHome) 
      { 
       studentListBox.DisplayMember = "Name"; 
      } 

     } 

foreachのは冗長です。

if (studentListHome != null) 
    { 
     studentListBox.DataSource = studentListHome; 
     studentListBox.DisplayMember = "Name"; 
    } 

次はあなたではなく、コレクションの他のタイプよりもするBindingListを使用して、比較のためにしなければならない、あなたの質問に答えると、あなたはStudentクラス自体にIComparableをしてINotifiyPropertyChangedを実装することができますソートします。

再度バインドしないで、BindingListインスタンスを変更してリストを操作すると、リストボックスはリストと同期して動作します。

関連する問題