2017-08-10 14 views
0

私のこの学生レジストリには、メインフォームのリストボックスがあり、2番目のフォームには学生が追加されています。この2番目の形式では、名前テキストボックスに名前を付け、学生にはパイプ文字( "|")で区切る必要のある数字を追加します。ユーザーが[OK]ボタンを押したときに、テキストボックスの名前と数字が記入された後は、以下のハードコードされた生徒のようになります。テキストボックスから別のフォームのリストボックスに情報を転送する方法

まずフォーム

private void listForm1_SelectedIndexChanged(object sender, EventArgs e) 
     { 


      string val = listForm1.GetItemText(listForm1.SelectedItem); 



      string[] valArray = val.Split('|'); 

      int sum = 0; 
      int scores = 0; 


      for (int i = 1; i < valArray.Length; i++) 
      { 
       int num = Convert.ToInt32(valArray[i]); 
       sum += num; 
       scores++; 
      } 


      int average = sum/scores; 


      txtAverage.Text = average.ToString(); 
      txtTotal.Text = sum.ToString(); 
      txtScoreCount.Text = scores.ToString(); 
     } 


     private void Form1_Load(object sender, EventArgs e) 

     { 

      listForm1.Items.Add("Hamish Overtone" + "|" + 39 + "|" + 12 + "|" + 85); 
      listForm1.Items.Add("Claudia Dye" + "|" + 44 + "|" + 56 + "|" + 85); 
      listForm1.Items.Add("Mike Layne" + "|" + 12 + "|" + 47+ "|" + 28); 

     } 

第二の形式以下のコード

private void btnADDSCORE_Click(object sender, EventArgs e) 
     { 


      string userInput = txtNewScore.Text; 

      txtNewScores.Text = txtNewScores.Text + " " + userInput; 

      txtNewScore.Text = String.Empty; 


     } 
      private void btnNewOk_Click(object sender, EventArgs e) 
     { 

     } 

     private void txtNewName_TextChanged(object sender, EventArgs e) 
     { 

     } 
    } 
ERRORING PART: 

ます。private void listForm1_SelectedIndexChanged(オブジェクト送信者、EventArgsの電子)ここにあなたのメインウィンドウに {

// Get the value from the selected item 
    string val = listForm1.GetItemText(listForm1.SelectedItem); 


    // Split the item's value to a string array according to the pipe char 
    string[] valArray = val.Split('|'); 

    int sum = 0; 
    int scores = 0; 

    // Iterate through all possible values and sum it up, 
    // while keeping count to how many numbers there are: 
    for (int i = 1; i < valArray.Length; i++) 
    { 
     int num = Convert.ToInt32(valArray[i]); 
     sum += num; 
     scores++; 
    } 

    // Calculate the average. 
    // Keep in mind using an integer will create a whole number, without decimal points.   
    int average = sum/scores; 

    // Place the average and the sum in textboxes 
    txtAverage.Text = average.ToString(); 
    txtTotal.Text = sum.ToString(); 
    txtScoreCount.Text = scores.ToString(); 
} 
+0

私はこの権利を取得していた場合は、リストボックスを持っているあなたのメインフォームは、2番目のフォームを開き、データを入力して[OK]をクリックすると、そのデータをメインフォームに戻すことができますか?それはあなたの必要条件ですか? – Sach

+0

ええ、私のメインフォームには、3人のハードコーディングされた学生のリストボックスがあります。新しい生徒を追加すると、名前ボックスと数字ボックスで2番目のフォームが開きます。ユーザーが[OK]ボタンを押すと、生徒はハードコードされた生徒のようなフォーム1のリストボックスに移動します。 – User3283827

+0

このすべての情報はこの質問では不要です。必要なのは実際には2つのウィンドウ間でデータを渡す方法です。まず、あなたの質問が何であるかを理解する必要があります。あなたがここでグーグルで検索した場合、そのような質問がたくさんあります。 – Sach

答えて

0

ボタンを追加し、次のコード(form1クラス内)をクリックイベントハンドラに使用してみてください。

class form1 
{ 
    private void form1_addButton_Click(object sender, EventArgs e) 
    { 
     Form2 newForm = new Form2(); 
     newForm.ShowDialog(); 

     foreach(string s in newForm.studentInfo) 
     { 
      listForm1.Items.Add(s); 
     } 
    } 
} 

以下のコードは、form2クラスファイルに追加されます。

class form2 
{ 
    public List<string> studentInfo {get; set;} //add this to form2 

    private void form2_addButton_Click(object sender, EventArgs e) 
    { 


     //add scores to list here. 

    } 

} 

編集

//THIS IS IN FORM2 :) 
private void btnNewOk_Click(object sender, EventArgs e) 
{ 
    string student = textBoxName.Text; 
    string[] scores = textBoxNewScores.Text.Trim().Split(' '); 

    for(int i = 0; i < scores.Length; i++) 
    { 
     student = student + "|" + scores[i]; 
    } 
    studentInfo.Add(student); 
    this.Close(); 
} 

編集2

private void listForm1_SelectedIndexChanged(object sender, EventArgs e) 
{ 


    string val = listForm1.GetItemText(listForm1.SelectedItem); 



    string[] valArray = val.Split('|'); 

    int sum = 0; 
    int scores = 0; 


    for (int i = 1; i < valArray.Length; i++) 
    { 
     int num = Convert.ToInt32(valArray[i]); 
     sum += num; 
     scores++; 
    } 


    int average = 0; 

    if (scores != 0) 
     average = sum/scores; 


    txtAverage.Text = average.ToString(); 
    txtTotal.Text = sum.ToString(); 
    txtScoreCount.Text = scores.ToString(); 
} 
1

(Form1の)、あなたはデータを渡すことができるデリゲートを作成したい、sa y、文字列。次に、そのデリゲート型のインスタンスを作成し、それに一致するメソッドをサブスクライブします。その後、セカンダリウィンドウを開くと、そのデリゲートをセカンダリウィンドウに渡します。あなたは二次ウィンドウにそのデリゲートを呼び出したときに

public delegate void DataTransfer(string data); 

public partial class Form1 : Form 
{ 
    public DataTransfer transferDelegate; 

    public Form1() 
    { 
     InitializeComponent(); 
     transferDelegate += new DataTransfer(DataMethod); 
    } 

    public void DataMethod(string data) 
    { 
     // Do what you want with your data. 
     MessageBox.Show(data); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     InputWindow win = new InputWindow(transferDelegate); 
     win.Show(); 
    } 
} 

は今、あなたのForm1のDataMethod()が呼び出されます、そしてあなたが窓の間で情報を渡すことができます。

あなたの二次ウィンドウの実装は次のようになります。

public partial class InputWindow : Form 
{ 
    DataTransfer transferDel; 

    public InputWindow(DataTransfer del) 
    { 
     InitializeComponent(); 
     transferDel = del; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     string data = textBox1.Text; 
     transferDel.Invoke(data); 
    } 
} 

あなたが見ることができるように、あなたが渡されたデリゲートを呼び出したときに、それがForm1のあるあなたのメインプログラムで対応するメソッドを呼び出します。

+0

非常に混乱しているようです – User3283827

+0

これは紛らわしいものではありません。デリゲートとウィンドウ間でのデータの受け渡し方法の詳細をお読みください。これはそれを行う適切な方法です。どのように動作するかを学ぶと、実際にはとても簡単で便利です。 – Sach

+0

私は超新星のようなC#に非常に新しいです。これを複製しようとすると不可能に思えます。私が永遠に覚えておきたいとき、 – User3283827

関連する問題